promptopskit 0.4.2 → 0.6.2

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.
Files changed (82) hide show
  1. package/README.md +105 -62
  2. package/SKILL.md +376 -16
  3. package/dist/{chunk-7MRMN3SW.js → chunk-55B7QQBK.js} +6 -4
  4. package/dist/chunk-55B7QQBK.js.map +1 -0
  5. package/dist/{chunk-HWEVRBKZ.js → chunk-AGTGIZMR.js} +6 -2
  6. package/dist/chunk-AGTGIZMR.js.map +1 -0
  7. package/dist/chunk-FNCIBZJF.js +130 -0
  8. package/dist/chunk-FNCIBZJF.js.map +1 -0
  9. package/dist/{chunk-XL76NHZR.js → chunk-GLT3YYWK.js} +6 -4
  10. package/dist/chunk-GLT3YYWK.js.map +1 -0
  11. package/dist/{chunk-5AAYDOPU.js → chunk-IPFD5Y3O.js} +4 -3
  12. package/dist/chunk-IPFD5Y3O.js.map +1 -0
  13. package/dist/{chunk-YI4LILPY.js → chunk-JR7252DG.js} +584 -520
  14. package/dist/chunk-JR7252DG.js.map +1 -0
  15. package/dist/{chunk-JKBWC5WJ.js → chunk-UY5OKMVP.js} +302 -21
  16. package/dist/chunk-UY5OKMVP.js.map +1 -0
  17. package/dist/{chunk-MI3M6KDD.js → chunk-VMLGUI4F.js} +6 -4
  18. package/dist/chunk-VMLGUI4F.js.map +1 -0
  19. package/dist/{chunk-Z4IPWEUU.js → chunk-XEZJZ3IG.js} +6 -4
  20. package/dist/chunk-XEZJZ3IG.js.map +1 -0
  21. package/dist/cli/index.js +435 -106
  22. package/dist/cli/index.js.map +1 -1
  23. package/dist/index.cjs +1159 -636
  24. package/dist/index.cjs.map +1 -1
  25. package/dist/index.d.cts +10 -9
  26. package/dist/index.d.ts +10 -9
  27. package/dist/index.js +79 -17
  28. package/dist/index.js.map +1 -1
  29. package/dist/providers/anthropic.cjs +875 -533
  30. package/dist/providers/anthropic.cjs.map +1 -1
  31. package/dist/providers/anthropic.d.cts +2 -2
  32. package/dist/providers/anthropic.d.ts +2 -2
  33. package/dist/providers/anthropic.js +3 -3
  34. package/dist/providers/gemini.cjs +875 -533
  35. package/dist/providers/gemini.cjs.map +1 -1
  36. package/dist/providers/gemini.d.cts +2 -2
  37. package/dist/providers/gemini.d.ts +2 -2
  38. package/dist/providers/gemini.js +3 -3
  39. package/dist/providers/llmasaservice.cjs +1735 -0
  40. package/dist/providers/llmasaservice.cjs.map +1 -0
  41. package/dist/providers/llmasaservice.d.cts +28 -0
  42. package/dist/providers/llmasaservice.d.ts +28 -0
  43. package/dist/providers/llmasaservice.js +20 -0
  44. package/dist/providers/llmasaservice.js.map +1 -0
  45. package/dist/providers/openai-responses.cjs +875 -533
  46. package/dist/providers/openai-responses.cjs.map +1 -1
  47. package/dist/providers/openai-responses.d.cts +2 -2
  48. package/dist/providers/openai-responses.d.ts +2 -2
  49. package/dist/providers/openai-responses.js +3 -3
  50. package/dist/providers/openai.cjs +875 -533
  51. package/dist/providers/openai.cjs.map +1 -1
  52. package/dist/providers/openai.d.cts +2 -2
  53. package/dist/providers/openai.d.ts +2 -2
  54. package/dist/providers/openai.js +3 -3
  55. package/dist/providers/openrouter.cjs +876 -533
  56. package/dist/providers/openrouter.cjs.map +1 -1
  57. package/dist/providers/openrouter.d.cts +2 -2
  58. package/dist/providers/openrouter.d.ts +2 -2
  59. package/dist/providers/openrouter.js +4 -4
  60. package/dist/{schema-B9A1zLRk.d.cts → schema-CuYsv8JA.d.cts} +853 -7
  61. package/dist/{schema-B9A1zLRk.d.ts → schema-CuYsv8JA.d.ts} +853 -7
  62. package/dist/testing.cjs +64 -9
  63. package/dist/testing.cjs.map +1 -1
  64. package/dist/testing.d.cts +1 -1
  65. package/dist/testing.d.ts +1 -1
  66. package/dist/testing.js +1 -1
  67. package/dist/{types-DjGAwJxC.d.ts → types-DpK0mTHL.d.ts} +18 -6
  68. package/dist/{types-DpbzzZO2.d.cts → types-UA_p9uJy.d.cts} +18 -6
  69. package/dist/usagetap/index.cjs +6 -1
  70. package/dist/usagetap/index.cjs.map +1 -1
  71. package/dist/usagetap/index.d.cts +4 -3
  72. package/dist/usagetap/index.d.ts +4 -3
  73. package/dist/usagetap/index.js +3 -1
  74. package/package.json +19 -2
  75. package/dist/chunk-5AAYDOPU.js.map +0 -1
  76. package/dist/chunk-7MRMN3SW.js.map +0 -1
  77. package/dist/chunk-HWEVRBKZ.js.map +0 -1
  78. package/dist/chunk-JKBWC5WJ.js.map +0 -1
  79. package/dist/chunk-MI3M6KDD.js.map +0 -1
  80. package/dist/chunk-XL76NHZR.js.map +0 -1
  81. package/dist/chunk-YI4LILPY.js.map +0 -1
  82. package/dist/chunk-Z4IPWEUU.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/validate.ts","../../src/parser/parser.ts","../../src/schema/schema.ts","../../src/parser/frontmatter-guard.ts","../../src/parser/sections.ts","../../src/parser/loader.ts","../../src/renderer/interpolate.ts","../../src/composition/resolve-includes.ts","../../src/context.ts","../../src/validation/levenshtein.ts","../../src/validation/validate.ts","../../src/prompt-resolution.ts","../../src/cache.ts","../../src/overrides/apply-overrides.ts","../../src/cli/commands/defaults-root.ts","../../src/cli/commands/compile.ts","../../src/cli/commands/render.ts","../../src/cli/commands/inspect.ts","../../src/cli/commands/init.ts","../../src/cli/commands/skill.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\n\nimport { validate } from './commands/validate.js';\nimport { compile } from './commands/compile.js';\nimport { render } from './commands/render.js';\nimport { inspect } from './commands/inspect.js';\nimport { init } from './commands/init.js';\nimport { skill } from './commands/skill.js';\n\nconst HELP = `\npromptopskit — Manage prompts, system instructions, tools, and model settings as code\n\nUsage:\n promptopskit <command> [options]\n\nCommands:\n init [dir] Scaffold a prompts directory with starter files\n validate [sourceDir] [options] Validate prompt files\n compile [sourceDir] [outputDir] [options]\n Compile .md prompts to JSON/ESM artifacts\n render <file> [options] Render a prompt preview\n inspect <file> Print normalized prompt asset\n skill [options] Deploy AI agent instructions into your project\n\nOptions:\n --help, -h Show this help message\n --version, -v Show version\n\nRun promptopskit <command> --help for command-specific help.\n`.trim();\n\nasync function main() {\n const args = process.argv.slice(2);\n const command = args[0];\n\n if (!command || command === '--help' || command === '-h') {\n console.log(HELP);\n process.exit(0);\n }\n\n if (command === '--version' || command === '-v') {\n const pkg = JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf-8')) as {\n version: string;\n };\n console.log(pkg.version);\n process.exit(0);\n }\n\n const commandArgs = args.slice(1);\n\n switch (command) {\n case 'init':\n await init(commandArgs);\n break;\n case 'validate':\n await validate(commandArgs);\n break;\n case 'compile':\n await compile(commandArgs);\n break;\n case 'render':\n await render(commandArgs);\n break;\n case 'inspect':\n await inspect(commandArgs);\n break;\n case 'skill':\n await skill(commandArgs);\n break;\n default:\n console.error(`Unknown command: ${command}`);\n console.log(HELP);\n process.exit(1);\n }\n}\n\nmain().catch((err) => {\n console.error(err.message);\n process.exit(1);\n});\n","import { readdir, stat } from 'node:fs/promises';\nimport { dirname, join, extname } from 'node:path';\nimport { loadPromptFile } from '../../parser/index.js';\nimport { validateAssetWithIncludes } from '../../validation/index.js';\nimport { DEFAULT_PROMPTS_DIR } from '../../prompt-resolution.js';\nimport { findDefaultsRoot } from './defaults-root.js';\n\nconst HELP = `\npromptopskit validate [sourceDir] [options]\n\nValidate prompt .md files in a directory or a single prompt file.\n\nOptions:\n --source, -s Source directory (default: ./prompts)\n --strict Treat warnings as errors\n --help, -h Show this help\n`.trim();\n\nexport async function validate(args: string[]): Promise<void> {\n if (args.includes('--help') || args.includes('-h')) {\n console.log(HELP);\n return;\n }\n\n const positional = getPositionalArgs(args, new Set(['--source', '-s']));\n const target = getFlag(args, '--source', '-s') ?? positional[0] ?? DEFAULT_PROMPTS_DIR;\n const strict = args.includes('--strict');\n const files = await collectPromptFiles(target);\n\n if (files.length === 0) {\n console.log(`No .md prompt files found in ${target}`);\n return;\n }\n\n let errorCount = 0;\n let warnCount = 0;\n\n for (const file of files) {\n try {\n const defaultsRoot = files.length === 1 && file === target\n ? findDefaultsRoot(file)\n : target;\n const { asset, raw } = await loadPromptFile(file, { defaultsRoot });\n const result = await validateAssetWithIncludes(asset, file, Object.keys(raw.frontMatter));\n\n if (result.errors.length > 0) {\n errorCount += result.errors.length;\n console.error(` ✗ ${file}`);\n for (const err of result.errors) {\n console.error(` ${err.code}: ${err.message}`);\n }\n } else {\n console.log(` ✓ ${file}`);\n }\n\n if (result.warnings.length > 0) {\n warnCount += result.warnings.length;\n for (const warn of result.warnings) {\n const suggestion = warn.suggestion ? ` (${warn.suggestion})` : '';\n console.warn(` ⚠ ${warn.code}: ${warn.message}${suggestion}`);\n }\n }\n } catch (err) {\n errorCount++;\n const message = err instanceof Error ? err.message : String(err);\n console.error(` ✗ ${file}`);\n console.error(` ${message}`);\n }\n }\n\n console.log();\n console.log(`Validated ${files.length} file(s): ${errorCount} error(s), ${warnCount} warning(s)`);\n\n if (errorCount > 0 || (strict && warnCount > 0)) {\n process.exit(1);\n }\n}\n\nfunction getPositionalArgs(args: string[], flagsWithValues: Set<string>): string[] {\n const positional: string[] = [];\n\n for (let index = 0; index < args.length; index++) {\n const arg = args[index];\n if (flagsWithValues.has(arg)) {\n index += 1;\n continue;\n }\n\n if (arg.startsWith('-')) {\n continue;\n }\n\n positional.push(arg);\n }\n\n return positional;\n}\n\nfunction getFlag(args: string[], ...flags: string[]): string | undefined {\n for (const flag of flags) {\n const index = args.indexOf(flag);\n if (index >= 0 && index + 1 < args.length) {\n return args[index + 1];\n }\n }\n\n return undefined;\n}\n\nasync function collectPromptFiles(target: string): Promise<string[]> {\n const targetStats = await stat(target);\n\n if (targetStats.isFile()) {\n if (extname(target) !== '.md' || target.endsWith('defaults.md') || target.endsWith('.test.md')) {\n return [];\n }\n\n return [target];\n }\n\n const results: string[] = [];\n const entries = await readdir(target, { withFileTypes: true, recursive: true });\n for (const entry of entries) {\n if (\n entry.isFile()\n && extname(entry.name) === '.md'\n && !entry.name.endsWith('.test.md')\n && entry.name !== 'defaults.md'\n ) {\n results.push(join(entry.parentPath ?? target, entry.name));\n }\n }\n return results.sort();\n}\n","import matter from 'gray-matter';\nimport { PromptAssetSchema } from '../schema/index.js';\nimport type { PromptAsset } from '../schema/index.js';\nimport { assertRegexFrontMatterQuoting } from './frontmatter-guard.js';\nimport { extractSections } from './sections.js';\n\nexport interface ParseResult {\n asset: PromptAsset;\n raw: {\n frontMatter: Record<string, unknown>;\n body: string;\n };\n}\n\n/**\n * Parse a prompt markdown string (YAML front matter + markdown body)\n * into a validated PromptAsset.\n */\nexport function parsePrompt(content: string, filePath?: string): ParseResult {\n assertRegexFrontMatterQuoting(content, filePath);\n const { data: frontMatter, content: body } = matter(content);\n\n const sections = extractSections(body);\n\n const raw = {\n ...frontMatter,\n sections,\n source: filePath ? { file_path: filePath } : undefined,\n };\n\n const asset = PromptAssetSchema.parse(raw);\n\n return {\n asset,\n raw: {\n frontMatter: frontMatter as Record<string, unknown>,\n body,\n },\n };\n}\n","import { z } from 'zod';\n\n// --- Tool definitions ---\n\nexport const InlineToolDefSchema = z.object({\n name: z.string(),\n description: z.string().optional(),\n input_schema: z.record(z.unknown()).optional(),\n});\n\nexport type InlineToolDef = z.infer<typeof InlineToolDefSchema>;\n\nexport const ToolRefSchema = z.union([z.string(), InlineToolDefSchema]);\n\n// --- MCP ---\n\nexport const MCPServerRefSchema = z.union([\n z.string(),\n z.object({\n name: z.string(),\n config: z.record(z.unknown()).optional(),\n }),\n]);\n\nexport type MCPServerRef = z.infer<typeof MCPServerRefSchema>;\n\n// --- Reasoning ---\n\nexport const ReasoningSchema = z.object({\n effort: z.enum(['low', 'medium', 'high']).optional(),\n budget_tokens: z.number().int().positive().optional(),\n});\n\n// --- Sampling ---\n\nexport const SamplingSchema = z.object({\n temperature: z.number().min(0).max(2).optional(),\n top_p: z.number().min(0).max(1).optional(),\n frequency_penalty: z.number().optional(),\n presence_penalty: z.number().optional(),\n stop: z.array(z.string()).optional(),\n max_output_tokens: z.number().int().positive().optional(),\n});\n\n// --- Response ---\n\nexport const ResponseSchema = z.object({\n format: z.enum(['text', 'json', 'markdown']).optional(),\n stream: z.boolean().optional(),\n schema: z.record(z.unknown()).optional(),\n schema_name: z.string().optional(),\n schema_description: z.string().optional(),\n schema_strict: z.boolean().optional(),\n});\n\n\n// --- Provider-specific options ---\n\nexport const AnthropicProviderOptionsSchema = z.object({\n top_k: z.number().int().min(0).optional(),\n tool_choice: z.record(z.unknown()).optional(),\n output_config: z.record(z.unknown()).optional(),\n});\n\nexport const GeminiProviderOptionsSchema = z.object({\n candidate_count: z.number().int().positive().optional(),\n top_k: z.number().int().min(0).optional(),\n seed: z.number().int().optional(),\n response_schema: z.record(z.unknown()).optional(),\n response_json_schema: z.record(z.unknown()).optional(),\n response_modalities: z.array(z.string()).optional(),\n thinking_budget_tokens: z.number().int().positive().optional(),\n});\n\nexport const OpenRouterProviderOptionsSchema = z.object({\n provider: z.record(z.unknown()).optional(),\n transforms: z.array(z.string()).optional(),\n plugins: z.array(z.record(z.unknown())).optional(),\n models: z.array(z.string()).optional(),\n});\n\nexport const ProviderOptionsSchema = z.object({\n anthropic: AnthropicProviderOptionsSchema.optional(),\n gemini: GeminiProviderOptionsSchema.optional(),\n openrouter: OpenRouterProviderOptionsSchema.optional(),\n});\n\nexport type ProviderOptions = z.infer<typeof ProviderOptionsSchema>;\n\n// --- Raw provider body passthrough ---\n\nexport const RawProviderBodySchema = z.object({\n openai: z.record(z.unknown()).optional(),\n 'openai-responses': z.record(z.unknown()).optional(),\n openai_responses: z.record(z.unknown()).optional(),\n anthropic: z.record(z.unknown()).optional(),\n gemini: z.record(z.unknown()).optional(),\n google: z.record(z.unknown()).optional(),\n openrouter: z.record(z.unknown()).optional(),\n});\n\nexport type RawProviderBody = z.infer<typeof RawProviderBodySchema>;\n\n// --- Cache controls ---\n\nexport const OpenAICacheSchema = z.object({\n prompt_cache_key: z.string().min(1).optional(),\n retention: z.enum(['in_memory', '24h']).optional(),\n});\n\nexport const AnthropicCacheSchema = z.object({\n mode: z.enum(['automatic', 'explicit']).optional(),\n type: z.literal('ephemeral').optional(),\n ttl: z.enum(['5m', '1h']).optional(),\n cache_system_instructions: z.boolean().optional(),\n cache_tools: z.boolean().optional(),\n cache_prompt_template: z.boolean().optional(),\n});\n\nexport const GeminiCacheSchema = z.object({\n cached_content: z.string().min(1).optional(),\n});\n\nexport const CacheSchema = z.object({\n openai: OpenAICacheSchema.optional(),\n anthropic: AnthropicCacheSchema.optional(),\n gemini: GeminiCacheSchema.optional(),\n google: GeminiCacheSchema.optional(),\n});\n\n// --- Context ---\n\nexport const HistorySchema = z.object({\n max_items: z.number().int().positive().optional(),\n});\n\nexport const ContextRegexSchema = z.union([\n z.string(),\n z.object({\n pattern: z.string(),\n flags: z.string().optional(),\n return_message: z.string().optional(),\n }),\n]);\n\nexport const ContextBuiltInValidatorSchema = z.union([\n z.boolean(),\n z.object({\n return_message: z.string().optional(),\n }),\n]);\n\nexport const ContextInputDefinitionObjectSchema = z.object({\n name: z.string(),\n max_size: z.number().int().positive().optional(),\n trim: z.union([z.boolean(), z.enum(['start', 'end', 'both'])]).optional(),\n allow_regex: ContextRegexSchema.optional(),\n deny_regex: ContextRegexSchema.optional(),\n non_empty: ContextBuiltInValidatorSchema.optional(),\n reject_secrets: ContextBuiltInValidatorSchema.optional(),\n});\n\nexport const ContextInputDefinitionSchema = z.union([\n z.string(),\n ContextInputDefinitionObjectSchema,\n]);\n\nexport type ContextInputDefinition = z.infer<typeof ContextInputDefinitionSchema>;\nexport type ContextRegexDefinition = z.infer<typeof ContextRegexSchema>;\nexport type ContextBuiltInValidatorDefinition = z.infer<typeof ContextBuiltInValidatorSchema>;\n\nexport const ContextSchema = z.object({\n inputs: z.array(ContextInputDefinitionSchema).optional(),\n history: HistorySchema.optional(),\n});\n\n// --- Metadata ---\n\nexport const MetadataSchema = z.object({\n owner: z.string().optional(),\n tags: z.array(z.string()).optional(),\n review_required: z.boolean().optional(),\n stable: z.boolean().optional(),\n});\n\n// --- MCP block ---\n\nexport const MCPSchema = z.object({\n servers: z.array(MCPServerRefSchema).optional(),\n});\n\n// --- Overrides (subset allowed in environments/tiers) ---\n\nexport const PromptAssetOverridesSchema = z.object({\n model: z.string().optional(),\n fallback_models: z.array(z.string()).optional(),\n reasoning: ReasoningSchema.optional(),\n sampling: SamplingSchema.optional(),\n response: ResponseSchema.optional(),\n cache: CacheSchema.optional(),\n raw: RawProviderBodySchema.optional(),\n tools: z.array(ToolRefSchema).optional(),\n provider_options: ProviderOptionsSchema.optional(),\n});\n\nexport type PromptAssetOverrides = z.infer<typeof PromptAssetOverridesSchema>;\n\n// --- Source tracking ---\n\nexport const SourceSchema = z.object({\n file_path: z.string().optional(),\n checksum: z.string().optional(),\n});\n\n// --- Sections (populated by parser) ---\n\nexport const SectionsSchema = z.object({\n system_instructions: z.string().optional(),\n prompt_template: z.string().optional(),\n notes: z.string().optional(),\n});\n\n// --- Defaults files (folder-level inheritance) ---\n\nexport const PromptDefaultsSchema = z.object({\n provider: z.enum(['openai', 'openai-responses', 'anthropic', 'google', 'gemini', 'openrouter', 'any']).optional(),\n model: z.string().optional(),\n cache: CacheSchema.optional(),\n metadata: MetadataSchema.optional(),\n sections: z.object({\n system_instructions: z.string().optional(),\n }).optional(),\n});\n\nexport type PromptDefaults = z.infer<typeof PromptDefaultsSchema>;\n\n// --- Top-level PromptAsset ---\n\nexport const PromptAssetSchema = z.object({\n id: z.string(),\n schema_version: z.number().int().positive().default(1),\n description: z.string().optional(),\n\n provider: z.enum(['openai', 'openai-responses', 'anthropic', 'google', 'gemini', 'openrouter', 'any']).optional(),\n model: z.string().optional(),\n fallback_models: z.array(z.string()).optional(),\n\n reasoning: ReasoningSchema.optional(),\n sampling: SamplingSchema.optional(),\n response: ResponseSchema.optional(),\n cache: CacheSchema.optional(),\n raw: RawProviderBodySchema.optional(),\n\n tools: z.array(ToolRefSchema).optional(),\n provider_options: ProviderOptionsSchema.optional(),\n mcp: MCPSchema.optional(),\n\n context: ContextSchema.optional(),\n\n includes: z.array(z.string()).optional(),\n\n environments: z.record(PromptAssetOverridesSchema).optional(),\n tiers: z.record(PromptAssetOverridesSchema).optional(),\n\n metadata: MetadataSchema.optional(),\n\n // Populated by parser, not authored in YAML\n sections: SectionsSchema.optional(),\n source: SourceSchema.optional(),\n});\n\nexport type PromptAsset = z.infer<typeof PromptAssetSchema>;\n\n// --- Resolved asset (after includes, overrides applied) ---\n\nexport interface ResolvedPromptAsset extends PromptAsset {\n sections: {\n system_instructions?: string;\n prompt_template?: string;\n notes?: string;\n };\n source: {\n file_path?: string;\n checksum?: string;\n };\n}\n","const FRONT_MATTER_DELIMITER = /^---[ \\t]*$/;\nconst REGEX_FIELD = /^(?<indent>\\s*)(?<field>allow_regex|deny_regex)\\s*:\\s*(?<value>.*)$/;\nconst PATTERN_FIELD = /^(?<indent>\\s*)pattern\\s*:\\s*(?<value>.*)$/;\nconst INLINE_PATTERN_FIELD = /(?:^|[{,]\\s*)pattern\\s*:\\s*(?<value>\"(?:\\\\.|[^\"\\\\])*\")/;\n\ninterface PendingRegexField {\n field: string;\n indent: number;\n}\n\nexport function assertRegexFrontMatterQuoting(content: string, filePath?: string): void {\n const frontMatter = extractFrontMatter(content);\n if (!frontMatter) {\n return;\n }\n\n let pendingRegex: PendingRegexField | undefined;\n\n for (const [index, line] of frontMatter.lines.entries()) {\n const lineNumber = frontMatter.startLine + index;\n const regexMatch = line.match(REGEX_FIELD);\n\n if (regexMatch?.groups) {\n const field = regexMatch.groups.field;\n const indent = regexMatch.groups.indent.length;\n const value = regexMatch.groups.value.trim();\n pendingRegex = value === '' ? { field, indent } : undefined;\n\n assertNoUnescapedBackslashInDoubleQuotedRegex(value, field, filePath, lineNumber);\n assertNoUnescapedBackslashInInlinePattern(value, field, filePath, lineNumber);\n continue;\n }\n\n if (!pendingRegex) {\n continue;\n }\n\n if (line.trim() === '' || line.trimStart().startsWith('#')) {\n continue;\n }\n\n const indent = line.match(/^\\s*/)?.[0].length ?? 0;\n if (indent <= pendingRegex.indent) {\n pendingRegex = undefined;\n continue;\n }\n\n const patternMatch = line.match(PATTERN_FIELD);\n if (!patternMatch?.groups) {\n continue;\n }\n\n assertNoUnescapedBackslashInDoubleQuotedRegex(\n patternMatch.groups.value.trim(),\n `${pendingRegex.field}.pattern`,\n filePath,\n lineNumber,\n );\n }\n}\n\nfunction assertNoUnescapedBackslashInInlinePattern(\n value: string,\n field: string,\n filePath: string | undefined,\n lineNumber: number,\n): void {\n const match = value.match(INLINE_PATTERN_FIELD);\n const pattern = match?.groups?.value;\n if (!pattern) {\n return;\n }\n\n assertNoUnescapedBackslashInDoubleQuotedRegex(pattern, `${field}.pattern`, filePath, lineNumber);\n}\n\nfunction extractFrontMatter(content: string): { lines: string[]; startLine: number } | undefined {\n const lines = content.split(/\\r?\\n/);\n if (!FRONT_MATTER_DELIMITER.test(lines[0] ?? '')) {\n return undefined;\n }\n\n for (let index = 1; index < lines.length; index += 1) {\n if (FRONT_MATTER_DELIMITER.test(lines[index] ?? '')) {\n return {\n lines: lines.slice(1, index),\n startLine: 2,\n };\n }\n }\n\n return undefined;\n}\n\nfunction assertNoUnescapedBackslashInDoubleQuotedRegex(\n value: string,\n field: string,\n filePath: string | undefined,\n lineNumber: number,\n): void {\n if (!value.startsWith('\"')) {\n return;\n }\n\n const quoted = readDoubleQuotedScalar(value);\n if (!quoted) {\n return;\n }\n\n if (!hasUnescapedBackslash(quoted)) {\n return;\n }\n\n const location = filePath ? `${filePath}:${lineNumber}` : `line ${lineNumber}`;\n throw new Error(\n `POK013: Invalid context regex YAML at ${location}, field \"${field}\": `\n + 'double-quoted regex strings treat backslashes as YAML escapes. '\n + 'Use unquoted /pattern/i literal form, single quotes, or double each backslash.',\n );\n}\n\nfunction readDoubleQuotedScalar(value: string): string | undefined {\n let result = '';\n\n for (let index = 1; index < value.length; index += 1) {\n const char = value[index];\n\n if (char === '\"') {\n return result;\n }\n\n result += char;\n\n if (char === '\\\\' && index + 1 < value.length) {\n index += 1;\n result += value[index];\n }\n }\n\n return undefined;\n}\n\nfunction hasUnescapedBackslash(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n if (value[index] !== '\\\\') {\n continue;\n }\n\n let count = 1;\n while (value[index + count] === '\\\\') {\n count += 1;\n }\n\n if (count % 2 === 1) {\n return true;\n }\n\n index += count - 1;\n }\n\n return false;\n}\n","export interface Sections {\n system_instructions?: string;\n prompt_template?: string;\n notes?: string;\n}\n\nconst SECTION_MAP: Record<string, keyof Sections> = {\n 'system instructions': 'system_instructions',\n 'prompt template': 'prompt_template',\n 'notes': 'notes',\n};\n\n/**\n * Extract named sections from the markdown body using H1 headings.\n * Case-insensitive. H2+ within a section is treated as content.\n * If no H1 headings are found, the entire body is treated as prompt_template.\n */\nexport function extractSections(body: string): Sections {\n const lines = body.split(/\\r?\\n/);\n const sections: Sections = {};\n\n let currentKey: keyof Sections | null = null;\n let currentLines: string[] = [];\n let foundAnyH1 = false;\n\n for (const line of lines) {\n const h1Match = line.match(/^#\\s+(.+)$/);\n if (h1Match) {\n // Flush previous section\n if (currentKey) {\n sections[currentKey] = currentLines.join('\\n').trim();\n }\n\n foundAnyH1 = true;\n const heading = h1Match[1].trim().toLowerCase();\n currentKey = SECTION_MAP[heading] ?? null;\n currentLines = [];\n } else {\n currentLines.push(line);\n }\n }\n\n // Flush last section\n if (currentKey) {\n sections[currentKey] = currentLines.join('\\n').trim();\n }\n\n // If no H1 headings found, treat entire body as prompt_template\n if (!foundAnyH1) {\n const trimmed = body.trim();\n if (trimmed) {\n sections.prompt_template = trimmed;\n }\n }\n\n return sections;\n}\n","import { readFile } from 'node:fs/promises';\nimport { dirname, join, resolve } from 'node:path';\nimport matter from 'gray-matter';\nimport { parsePrompt } from './parser.js';\nimport type { ParseResult } from './parser.js';\nimport { extractSections } from './sections.js';\nimport { PromptDefaultsSchema } from '../schema/index.js';\nimport type { PromptDefaults } from '../schema/index.js';\n\nconst DEFAULTS_FILE_NAME = 'defaults.md';\n\nexport interface LoadPromptOptions {\n /**\n * Optional boundary directory for defaults discovery.\n * If provided, defaults are loaded from this directory down to the prompt directory.\n */\n defaultsRoot?: string;\n}\n\n/**\n * Load and parse a prompt file from disk.\n */\nexport async function loadPromptFile(filePath: string, options: LoadPromptOptions = {}): Promise<ParseResult> {\n const content = await readFile(filePath, 'utf-8');\n const parsed = parsePrompt(content, filePath);\n // Default the boundary to the file's own directory so traversal never\n // walks above the prompt tree when no explicit root is provided.\n const root = options.defaultsRoot ?? dirname(filePath);\n const defaults = await loadDefaultsForPath(filePath, root);\n const asset = applyDefaults(parsed.asset, defaults);\n\n return {\n ...parsed,\n asset,\n };\n}\n\nasync function loadDefaultsForPath(filePath: string, defaultsRoot?: string): Promise<PromptDefaults> {\n const directories = getDirectoriesToCheck(filePath, defaultsRoot);\n let merged: PromptDefaults = {};\n\n for (const dir of directories) {\n const defaultsPath = join(dir, DEFAULTS_FILE_NAME);\n try {\n const defaultsContent = await readFile(defaultsPath, 'utf-8');\n const defaults = parseDefaults(defaultsContent);\n merged = mergeDefaults(merged, defaults);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n }\n\n return merged;\n}\n\nfunction getDirectoriesToCheck(filePath: string, defaultsRoot?: string): string[] {\n const dirs: string[] = [];\n let current = resolve(dirname(filePath));\n const boundary = defaultsRoot ? resolve(defaultsRoot) : undefined;\n\n while (true) {\n dirs.unshift(current);\n if ((boundary && current === boundary) || current === dirname(current)) {\n break;\n }\n current = dirname(current);\n }\n\n return dirs;\n}\n\nfunction parseDefaults(content: string): PromptDefaults {\n const { data: frontMatter, content: body } = matter(content);\n const sections = extractSections(body);\n\n return PromptDefaultsSchema.parse({\n ...frontMatter,\n sections: {\n system_instructions: sections.system_instructions,\n },\n });\n}\n\nfunction mergeDefaults(base: PromptDefaults, local: PromptDefaults): PromptDefaults {\n return {\n provider: local.provider ?? base.provider,\n model: local.model ?? base.model,\n cache: mergeCache(base.cache, local.cache),\n metadata: {\n ...(base.metadata ?? {}),\n ...(local.metadata ?? {}),\n },\n sections: {\n ...(base.sections ?? {}),\n ...(local.sections ?? {}),\n },\n };\n}\n\nfunction applyDefaults(asset: ParseResult['asset'], defaults: PromptDefaults): ParseResult['asset'] {\n const cache = mergeCache(defaults.cache, asset.cache);\n const hasDefaultMetadata = defaults.metadata && Object.keys(defaults.metadata).length > 0;\n const hasDefaultSystem = !!defaults.sections?.system_instructions;\n const hasDefaultScalars = defaults.provider !== undefined\n || defaults.model !== undefined;\n const hasDefaultCache = cache !== undefined;\n\n // Short-circuit: nothing to merge\n if (!hasDefaultMetadata && !hasDefaultSystem && !hasDefaultScalars && !hasDefaultCache) {\n return asset;\n }\n\n const mergedMetadata = {\n ...(defaults.metadata ?? {}),\n ...(asset.metadata ?? {}),\n };\n const metadata = Object.keys(mergedMetadata).length > 0 ? mergedMetadata : undefined;\n\n const systemInstructions = asset.sections?.system_instructions ?? defaults.sections?.system_instructions;\n\n const sections = asset.sections\n ? { ...asset.sections, system_instructions: systemInstructions }\n : systemInstructions\n ? { system_instructions: systemInstructions }\n : undefined;\n\n return {\n ...asset,\n provider: asset.provider ?? defaults.provider,\n model: asset.model ?? defaults.model,\n cache,\n metadata,\n sections,\n };\n}\n\nfunction mergeCache(base: PromptDefaults['cache'], local: PromptDefaults['cache']): PromptDefaults['cache'] {\n const merged: NonNullable<PromptDefaults['cache']> = {\n ...(base ?? {}),\n ...(local ?? {}),\n openai: {\n ...(base?.openai ?? {}),\n ...(local?.openai ?? {}),\n },\n anthropic: {\n ...(base?.anthropic ?? {}),\n ...(local?.anthropic ?? {}),\n },\n gemini: {\n ...(base?.gemini ?? {}),\n ...(local?.gemini ?? {}),\n },\n google: {\n ...(base?.google ?? {}),\n ...(local?.google ?? {}),\n },\n };\n\n if (merged.openai && Object.keys(merged.openai).length === 0) delete merged.openai;\n if (merged.anthropic && Object.keys(merged.anthropic).length === 0) delete merged.anthropic;\n if (merged.gemini && Object.keys(merged.gemini).length === 0) delete merged.gemini;\n if (merged.google && Object.keys(merged.google).length === 0) delete merged.google;\n\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n","export interface InterpolateOptions {\n strict?: boolean;\n}\n\nconst VARIABLE_RE = /\\{\\{\\s*([a-zA-Z_][a-zA-Z0-9_]*)\\s*\\}\\}/g;\nconst ESCAPED_OPEN = /\\\\\\{\\\\\\{/g;\nconst ESCAPE_PLACEHOLDER = '\\x00ESCAPED_OPEN\\x00';\n\n/**\n * Interpolate variables into a template string.\n *\n * Syntax: {{ variable_name }}\n * Escape: \\{\\{ produces literal {{\n *\n * In strict mode, throws on missing variables.\n * In permissive mode, leaves {{ placeholder }} intact.\n */\nexport function interpolate(\n template: string,\n variables: Record<string, string>,\n options: InterpolateOptions = {},\n): string {\n const { strict = false } = options;\n\n // Replace escaped sequences with placeholder\n let result = template.replace(ESCAPED_OPEN, ESCAPE_PLACEHOLDER);\n\n result = result.replace(VARIABLE_RE, (match, name: string) => {\n if (name in variables) {\n return variables[name];\n }\n if (strict) {\n throw new Error(`Missing required variable: \"${name}\"`);\n }\n return match; // leave placeholder intact in permissive mode\n });\n\n // Restore escaped sequences\n result = result.replaceAll(ESCAPE_PLACEHOLDER, '{{');\n\n return result;\n}\n\n/**\n * Extract all variable names referenced in a template.\n */\nexport function extractVariables(template: string): string[] {\n const vars = new Set<string>();\n let match: RegExpExecArray | null;\n const re = new RegExp(VARIABLE_RE.source, 'g');\n while ((match = re.exec(template)) !== null) {\n vars.add(match[1]);\n }\n return [...vars];\n}\n","import { readFile } from 'node:fs/promises';\nimport { resolve, dirname } from 'node:path';\nimport { parsePrompt } from '../parser/index.js';\nimport type { PromptAsset } from '../schema/index.js';\n\n/**\n * Resolve includes for a prompt asset, inlining content from referenced files.\n * Detects and rejects circular includes.\n */\nexport async function resolveIncludes(\n asset: PromptAsset,\n basePath: string,\n visited: Set<string> = new Set(),\n): Promise<PromptAsset> {\n if (!asset.includes || asset.includes.length === 0) {\n return asset;\n }\n\n const baseDir = dirname(basePath);\n const resolvedPath = resolve(basePath);\n\n if (visited.has(resolvedPath)) {\n throw new Error(`Circular include detected: ${resolvedPath}`);\n }\n visited.add(resolvedPath);\n\n let mergedSystemInstructions = '';\n\n for (const includePath of asset.includes) {\n const fullPath = resolve(baseDir, includePath);\n\n if (visited.has(fullPath)) {\n throw new Error(`Circular include detected: ${fullPath} (included from ${basePath})`);\n }\n\n const content = await readFile(fullPath, 'utf-8');\n const { asset: includedAsset } = parsePrompt(content, fullPath);\n\n // Recursively resolve nested includes\n const resolved = await resolveIncludes(includedAsset, fullPath, new Set(visited));\n\n // Append included system instructions before local ones\n if (resolved.sections?.system_instructions) {\n mergedSystemInstructions += resolved.sections.system_instructions + '\\n\\n';\n }\n }\n\n // Prepend included system instructions before the local ones\n const localSystem = asset.sections?.system_instructions ?? '';\n const combinedSystem = (mergedSystemInstructions + localSystem).trim() || undefined;\n\n return {\n ...asset,\n sections: {\n ...asset.sections,\n system_instructions: combinedSystem,\n },\n // Drop includes from the resolved asset — they've been inlined\n includes: undefined,\n };\n}\n","import type {\n PromptAsset,\n ResolvedPromptAsset,\n ContextBuiltInValidatorDefinition,\n ContextInputDefinition,\n ContextRegexDefinition,\n} from './schema/index.js';\n\nexport interface ContextValidationShortCircuit {\n returnMessage: string;\n code: 'POK031' | 'POK032' | 'POK033' | 'POK034';\n variable: string;\n field: 'allow_regex' | 'deny_regex' | 'non_empty' | 'reject_secrets';\n}\n\nexport interface SanitizedContextVariablesResult {\n variables: Record<string, string>;\n shortCircuit?: ContextValidationShortCircuit;\n}\n\nexport interface NormalizedContextRegex {\n pattern: string;\n flags: string;\n raw: string;\n invalidLiteral?: boolean;\n returnMessage?: string;\n}\n\nexport interface NormalizedContextBuiltInValidator {\n returnMessage?: string;\n}\n\nexport interface NormalizedContextInput {\n name: string;\n max_size?: number;\n trim?: boolean | 'start' | 'end' | 'both';\n allow_regex?: NormalizedContextRegex;\n deny_regex?: NormalizedContextRegex;\n non_empty?: NormalizedContextBuiltInValidator;\n reject_secrets?: NormalizedContextBuiltInValidator;\n}\n\nexport interface ContextSizeWarning {\n variable: string;\n maxSize: number;\n actualSize: number;\n}\n\nexport interface ContextOverflowInfo {\n promptId: string;\n variable: string;\n value: string;\n maxSize: number;\n actualSize: number;\n}\n\nexport interface SanitizeContextOptions {\n onContextOverflow?: (info: ContextOverflowInfo) => string;\n}\n\nconst textEncoder = new TextEncoder();\nconst REJECT_SECRETS_PATTERN = '(secret|api[_-]?key|password)';\nconst REJECT_SECRETS_FLAGS = 'i';\n\nexport function getContextInputs(\n asset: Pick<PromptAsset | ResolvedPromptAsset, 'context'>,\n): NormalizedContextInput[] {\n return (asset.context?.inputs ?? []).map(normalizeContextInput);\n}\n\nexport function getContextInputNames(\n asset: Pick<PromptAsset | ResolvedPromptAsset, 'context'>,\n): string[] {\n return getContextInputs(asset).map((input) => input.name);\n}\n\nexport function normalizeContextInput(input: ContextInputDefinition): NormalizedContextInput {\n if (typeof input === 'string') {\n return { name: input };\n }\n\n return {\n name: input.name,\n max_size: input.max_size,\n trim: input.trim,\n allow_regex: normalizeContextRegex(input.allow_regex),\n deny_regex: normalizeContextRegex(input.deny_regex),\n non_empty: normalizeBuiltInValidator(input.non_empty),\n reject_secrets: normalizeBuiltInValidator(input.reject_secrets),\n };\n}\n\nexport function normalizeContextRegex(\n value: ContextRegexDefinition | undefined,\n): NormalizedContextRegex | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value === 'string') {\n const literal = parseRegexLiteral(value);\n if (value.startsWith('/') && !literal) {\n return {\n pattern: value,\n flags: '',\n raw: value,\n invalidLiteral: true,\n };\n }\n\n return {\n pattern: literal?.pattern ?? value,\n flags: literal?.flags ?? '',\n raw: value,\n };\n }\n\n return {\n pattern: value.pattern,\n flags: value.flags ?? '',\n raw: JSON.stringify(value),\n returnMessage: value.return_message,\n };\n}\n\nexport function normalizeBuiltInValidator(\n value: ContextBuiltInValidatorDefinition | undefined,\n): NormalizedContextBuiltInValidator | undefined {\n if (value === undefined || value === false) {\n return undefined;\n }\n\n if (value === true) {\n return {};\n }\n\n return {\n returnMessage: value.return_message,\n };\n}\n\nfunction parseRegexLiteral(value: string): { pattern: string; flags: string } | undefined {\n if (!value.startsWith('/')) {\n return undefined;\n }\n\n for (let index = value.length - 1; index > 0; index -= 1) {\n if (value[index] !== '/') {\n continue;\n }\n\n let backslashCount = 0;\n for (let cursor = index - 1; cursor >= 0 && value[cursor] === '\\\\'; cursor -= 1) {\n backslashCount += 1;\n }\n\n if (backslashCount % 2 === 1) {\n continue;\n }\n\n return {\n pattern: value.slice(1, index),\n flags: value.slice(index + 1),\n };\n }\n\n return undefined;\n}\n\nexport function formatInvalidContextRegexMessage(details: {\n promptId: string;\n variable: string;\n field: string;\n raw: string;\n reason: string;\n}): string {\n return [\n `Invalid context regex for prompt \"${details.promptId}\"`,\n `variable \"${details.variable}\"`,\n `field \"${details.field}\"`,\n `value ${JSON.stringify(details.raw)}: ${details.reason}`,\n ].join(', ');\n}\n\nexport function compileContextRegex(\n regex: NormalizedContextRegex,\n details: { promptId: string; variable: string; field: string },\n): RegExp {\n if (regex.invalidLiteral) {\n throw new Error(\n `POK013: ${formatInvalidContextRegexMessage({\n ...details,\n raw: regex.raw,\n reason: 'Malformed regex literal. Use /pattern/flags or { pattern, flags }.',\n })}`,\n );\n }\n\n try {\n return new RegExp(regex.pattern, regex.flags);\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(`POK013: ${formatInvalidContextRegexMessage({ ...details, raw: regex.raw, reason })}`);\n }\n}\n\nfunction getRejectSecretsRegex(): NormalizedContextRegex {\n return {\n pattern: REJECT_SECRETS_PATTERN,\n flags: REJECT_SECRETS_FLAGS,\n raw: JSON.stringify({ pattern: REJECT_SECRETS_PATTERN, flags: REJECT_SECRETS_FLAGS }),\n };\n}\n\ntype TrimMode = boolean | 'start' | 'end' | 'both';\n\nfunction isTrimEnabled(mode: TrimMode | undefined): mode is true | 'start' | 'end' | 'both' {\n return mode === true || mode === 'start' || mode === 'end' || mode === 'both';\n}\n\nfunction normalizeTrimMode(mode: TrimMode): 'start' | 'end' {\n if (mode === 'start') {\n return 'start';\n }\n return 'end';\n}\n\nfunction trimToMaxSize(\n value: string,\n maxSize: number,\n mode: TrimMode,\n): string {\n const measured = measureContextValueSize(value);\n if (measured <= maxSize) {\n return value;\n }\n\n const characters = Array.from(value);\n const normalizedMode = normalizeTrimMode(mode);\n\n if (normalizedMode === 'start') {\n let collected = '';\n let size = 0;\n for (let i = characters.length - 1; i >= 0; i -= 1) {\n const next = characters[i];\n const charSize = measureContextValueSize(next);\n if (size + charSize > maxSize) {\n break;\n }\n collected = next + collected;\n size += charSize;\n }\n return collected;\n }\n\n let collected = '';\n let size = 0;\n for (const char of characters) {\n const charSize = measureContextValueSize(char);\n if (size + charSize > maxSize) {\n break;\n }\n collected += char;\n size += charSize;\n }\n return collected;\n}\n\nexport function sanitizeContextVariables(\n asset: Pick<PromptAsset | ResolvedPromptAsset, 'context' | 'id'>,\n variables: Record<string, string> = {},\n options: SanitizeContextOptions = {},\n): SanitizedContextVariablesResult {\n const { onContextOverflow } = options;\n const sanitized = { ...variables };\n\n for (const input of getContextInputs(asset)) {\n const value = sanitized[input.name];\n if (value === undefined) {\n continue;\n }\n\n let candidate = value;\n\n if (input.max_size !== undefined) {\n const actualSize = measureContextValueSize(candidate);\n if (actualSize > input.max_size && onContextOverflow) {\n candidate = onContextOverflow({\n promptId: asset.id,\n variable: input.name,\n value: candidate,\n maxSize: input.max_size,\n actualSize,\n });\n }\n }\n\n if (isTrimEnabled(input.trim) && input.max_size !== undefined) {\n candidate = trimToMaxSize(candidate, input.max_size, input.trim);\n }\n\n sanitized[input.name] = candidate;\n\n if (input.allow_regex) {\n const candidate = sanitized[input.name];\n const matcher = compileContextRegex(input.allow_regex, {\n promptId: asset.id,\n variable: input.name,\n field: 'allow_regex',\n });\n if (!matcher.test(candidate)) {\n if (input.allow_regex.returnMessage) {\n return {\n variables: sanitized,\n shortCircuit: {\n returnMessage: input.allow_regex.returnMessage,\n code: 'POK031',\n variable: input.name,\n field: 'allow_regex',\n },\n };\n }\n\n throw new Error(\n `POK031: Context variable \"${input.name}\" failed allow_regex validation for prompt \"${asset.id}\".`,\n );\n }\n }\n\n if (input.deny_regex) {\n const candidate = sanitized[input.name];\n const matcher = compileContextRegex(input.deny_regex, {\n promptId: asset.id,\n variable: input.name,\n field: 'deny_regex',\n });\n if (matcher.test(candidate)) {\n if (input.deny_regex.returnMessage) {\n return {\n variables: sanitized,\n shortCircuit: {\n returnMessage: input.deny_regex.returnMessage,\n code: 'POK032',\n variable: input.name,\n field: 'deny_regex',\n },\n };\n }\n\n throw new Error(\n `POK032: Context variable \"${input.name}\" matched deny_regex for prompt \"${asset.id}\".`,\n );\n }\n }\n\n if (input.non_empty && candidate.trim().length === 0) {\n if (input.non_empty.returnMessage) {\n return {\n variables: sanitized,\n shortCircuit: {\n returnMessage: input.non_empty.returnMessage,\n code: 'POK033',\n variable: input.name,\n field: 'non_empty',\n },\n };\n }\n\n throw new Error(\n `POK033: Context variable \"${input.name}\" failed non_empty validation for prompt \"${asset.id}\".`,\n );\n }\n\n if (input.reject_secrets) {\n const matcher = compileContextRegex(getRejectSecretsRegex(), {\n promptId: asset.id,\n variable: input.name,\n field: 'reject_secrets',\n });\n if (matcher.test(candidate)) {\n if (input.reject_secrets.returnMessage) {\n return {\n variables: sanitized,\n shortCircuit: {\n returnMessage: input.reject_secrets.returnMessage,\n code: 'POK034',\n variable: input.name,\n field: 'reject_secrets',\n },\n };\n }\n\n throw new Error(\n `POK034: Context variable \"${input.name}\" matched reject_secrets validation for prompt \"${asset.id}\".`,\n );\n }\n }\n }\n\n return { variables: sanitized };\n}\n\nexport function measureContextValueSize(value: string): number {\n return textEncoder.encode(value).length;\n}\n\nexport function collectContextSizeWarnings(\n asset: Pick<PromptAsset | ResolvedPromptAsset, 'context'>,\n variables: Record<string, string> = {},\n): ContextSizeWarning[] {\n const warnings: ContextSizeWarning[] = [];\n\n for (const input of getContextInputs(asset)) {\n if (input.max_size === undefined) {\n continue;\n }\n\n const value = variables[input.name];\n if (value === undefined) {\n continue;\n }\n\n const actualSize = measureContextValueSize(value);\n if (actualSize > input.max_size) {\n warnings.push({\n variable: input.name,\n maxSize: input.max_size,\n actualSize,\n });\n }\n }\n\n return warnings;\n}\n","/**\n * Compute the Levenshtein distance between two strings.\n * Used for \"did you mean?\" suggestions on unknown fields.\n */\nexport function levenshtein(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n\n if (m === 0) return n;\n if (n === 0) return m;\n\n const dp: number[][] = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0) as number[]);\n\n for (let i = 0; i <= m; i++) dp[i][0] = i;\n for (let j = 0; j <= n; j++) dp[0][j] = j;\n\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n dp[i][j] = Math.min(\n dp[i - 1][j] + 1,\n dp[i][j - 1] + 1,\n dp[i - 1][j - 1] + cost,\n );\n }\n }\n\n return dp[m][n];\n}\n","import { PromptAssetSchema } from '../schema/index.js';\nimport type { PromptAsset } from '../schema/index.js';\nimport { extractVariables } from '../renderer/index.js';\nimport { resolveIncludes } from '../composition/index.js';\nimport {\n compileContextRegex,\n getContextInputs,\n getContextInputNames,\n} from '../context.js';\nimport { levenshtein } from './levenshtein.js';\n\nexport interface ValidationError {\n code: string;\n message: string;\n filePath?: string;\n suggestion?: string;\n}\n\nexport interface PromptValidationResult {\n valid: boolean;\n errors: ValidationError[];\n warnings: ValidationError[];\n}\n\nconst KNOWN_FRONT_MATTER_KEYS = new Set([\n 'id', 'schema_version', 'description', 'provider', 'model', 'fallback_models',\n 'reasoning', 'sampling', 'response', 'tools', 'mcp', 'context', 'includes',\n 'environments', 'tiers', 'metadata', 'cache', 'provider_options', 'raw',\n]);\n\nconst RISKY_UNBOUNDED_INPUT_NAMES = [\n 'message',\n 'prompt',\n 'history',\n 'transcript',\n 'document',\n 'content',\n 'input',\n 'body',\n 'context',\n];\n\n/**\n * Validate a parsed prompt asset, returning all errors and warnings.\n */\nexport function validateAsset(\n asset: PromptAsset,\n frontMatterKeys?: string[],\n filePath?: string,\n): PromptValidationResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationError[] = [];\n\n // Schema validation\n const result = PromptAssetSchema.safeParse(asset);\n if (!result.success) {\n for (const issue of result.error.issues) {\n errors.push({\n code: 'POK001',\n message: `Schema error at ${issue.path.join('.')}: ${issue.message}`,\n filePath,\n });\n }\n }\n\n // Missing id\n if (!asset.id) {\n errors.push({\n code: 'POK002',\n message: 'Missing required field: \"id\"',\n filePath,\n });\n }\n\n // Missing body sections\n if (!asset.sections?.system_instructions && !asset.sections?.prompt_template) {\n errors.push({\n code: 'POK003',\n message: 'Prompt must have at least one body section (System instructions or Prompt template)',\n filePath,\n });\n }\n\n // Unknown front matter keys with \"did you mean?\"\n if (frontMatterKeys) {\n for (const key of frontMatterKeys) {\n if (!KNOWN_FRONT_MATTER_KEYS.has(key)) {\n const suggestion = findClosestMatch(key, KNOWN_FRONT_MATTER_KEYS);\n warnings.push({\n code: 'POK010',\n message: `Unknown front matter field: \"${key}\"`,\n filePath,\n suggestion: suggestion ? `Did you mean \"${suggestion}\"?` : undefined,\n });\n }\n }\n }\n\n // Variable validation: used but not declared\n const declaredInputs = new Set(getContextInputNames(asset));\n const usedVars = new Set<string>();\n\n if (asset.sections?.system_instructions) {\n for (const v of extractVariables(asset.sections.system_instructions)) {\n usedVars.add(v);\n }\n }\n if (asset.sections?.prompt_template) {\n for (const v of extractVariables(asset.sections.prompt_template)) {\n usedVars.add(v);\n }\n }\n\n for (const v of usedVars) {\n if (!declaredInputs.has(v)) {\n warnings.push({\n code: 'POK011',\n message: `Variable \"{{ ${v} }}\" is used but not declared in context.inputs`,\n filePath,\n });\n }\n }\n\n // Declared but unused\n for (const v of declaredInputs) {\n if (!usedVars.has(v)) {\n warnings.push({\n code: 'POK012',\n message: `Variable \"${v}\" is declared in context.inputs but never used`,\n filePath,\n });\n }\n }\n\n if (usedVars.size > 0 && (!asset.context?.inputs || asset.context.inputs.length === 0)) {\n warnings.push({\n code: 'POK046',\n message: `Template uses ${usedVars.size === 1 ? 'a variable' : 'variables'} but context.inputs is not declared.`,\n filePath,\n suggestion: 'Declare context.inputs to enable input policy validation.',\n });\n }\n\n // Context regex definitions compile successfully\n for (const input of getContextInputs(asset)) {\n const lowerName = input.name.toLowerCase();\n\n if (input.max_size === undefined && RISKY_UNBOUNDED_INPUT_NAMES.some((needle) => lowerName.includes(needle))) {\n warnings.push({\n code: 'POK040',\n message: `Context input \"${input.name}\" has no max_size and appears unbounded.`,\n filePath,\n suggestion: 'Add max_size to constrain prompt payload growth.',\n });\n }\n\n if (\n input.allow_regex === undefined\n && input.deny_regex === undefined\n && input.non_empty === undefined\n && input.reject_secrets === undefined\n ) {\n warnings.push({\n code: 'POK041',\n message: `Context input \"${input.name}\" has no input hardening validators.`,\n filePath,\n suggestion: 'Consider non_empty/reject_secrets and allow/deny regex validators.',\n });\n }\n\n if (input.trim !== undefined && input.trim !== false && input.max_size === undefined) {\n warnings.push({\n code: 'POK014',\n message: `Context input \"${input.name}\" sets trim but has no max_size; trim-to-budget will be skipped.`,\n filePath,\n });\n }\n\n const checks: Array<{\n regex: NonNullable<typeof input.allow_regex>;\n kind: 'allow_regex' | 'deny_regex';\n }> = [];\n\n if (input.allow_regex) checks.push({ regex: input.allow_regex, kind: 'allow_regex' });\n if (input.deny_regex) checks.push({ regex: input.deny_regex, kind: 'deny_regex' });\n\n for (const check of checks) {\n try {\n compileContextRegex(check.regex, {\n promptId: asset.id,\n variable: input.name,\n field: check.kind,\n });\n } catch (error) {\n const reason = error instanceof Error ? error.message.replace(/^POK013:\\s*/, '') : String(error);\n errors.push({\n code: 'POK013',\n message: reason,\n filePath,\n });\n }\n }\n }\n\n if (asset.provider) {\n let providerCache: unknown;\n let cacheSuggestionField: string | undefined;\n\n switch (asset.provider) {\n case 'openai':\n providerCache = asset.cache?.openai;\n cacheSuggestionField = 'cache.openai';\n break;\n case 'anthropic':\n providerCache = asset.cache?.anthropic;\n cacheSuggestionField = 'cache.anthropic';\n break;\n case 'gemini':\n case 'google':\n providerCache = asset.cache?.gemini ?? asset.cache?.google;\n cacheSuggestionField = 'cache.gemini';\n break;\n default:\n break;\n }\n\n if (cacheSuggestionField && providerCache === undefined) {\n warnings.push({\n code: 'POK042',\n message: `Provider \"${asset.provider}\" has no provider-specific cache settings.`,\n filePath,\n suggestion: `Consider configuring ${cacheSuggestionField} for better cache-hit behavior.`,\n });\n }\n\n if (!asset.model) {\n warnings.push({\n code: 'POK044',\n message: `Provider \"${asset.provider}\" is configured without a model.`,\n filePath,\n suggestion: 'Set model in prompt or defaults to avoid adapter-time errors.',\n });\n }\n }\n\n if (\n asset.cache?.gemini?.cached_content\n && asset.cache.google?.cached_content\n && asset.cache.gemini.cached_content !== asset.cache.google.cached_content\n ) {\n warnings.push({\n code: 'POK043',\n message: 'cache.gemini.cached_content and cache.google.cached_content are both set to different values.',\n filePath,\n suggestion: 'Use one canonical value; Gemini prefers cache.gemini.cached_content.',\n });\n }\n\n for (const [envName, overrides] of Object.entries(asset.environments ?? {})) {\n if (asset.cache && (!isRecord(overrides) || !overrides.cache)) {\n warnings.push({\n code: 'POK045',\n message: `Environment \"${envName}\" does not override cache while prompt-level cache is defined.`,\n filePath,\n suggestion: 'Confirm cache strategy is intentionally shared across environments.',\n });\n }\n }\n\n for (const [tierName, overrides] of Object.entries(asset.tiers ?? {})) {\n if (asset.cache && (!isRecord(overrides) || !overrides.cache)) {\n warnings.push({\n code: 'POK045',\n message: `Tier \"${tierName}\" does not override cache while prompt-level cache is defined.`,\n filePath,\n suggestion: 'Confirm cache strategy is intentionally shared across tiers.',\n });\n }\n }\n\n for (const tool of asset.tools ?? []) {\n if (isRecord(tool)) {\n if (!tool.description) {\n warnings.push({\n code: 'POK047',\n message: `Inline tool \"${tool.name}\" is missing a description.`,\n filePath,\n suggestion: 'Add description to improve model tool-selection quality.',\n });\n }\n if (!tool.input_schema) {\n warnings.push({\n code: 'POK047',\n message: `Inline tool \"${tool.name}\" is missing input_schema.`,\n filePath,\n suggestion: 'Add input_schema so tool inputs are strongly typed.',\n });\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\n/**\n * Validate a prompt asset including its include graph.\n * Catches missing include files, circular includes, and parse errors in included files.\n */\nexport async function validateAssetWithIncludes(\n asset: PromptAsset,\n filePath: string,\n frontMatterKeys?: string[],\n): Promise<PromptValidationResult> {\n // Run standard validation first\n const result = validateAsset(asset, frontMatterKeys, filePath);\n\n // Validate includes\n if (asset.includes && asset.includes.length > 0) {\n try {\n await resolveIncludes(asset, filePath);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n const isCircular = message.includes('Circular include');\n result.errors.push({\n code: isCircular ? 'POK021' : 'POK020',\n message: isCircular\n ? `Circular include detected: ${message}`\n : `Include resolution failed: ${message}`,\n filePath,\n });\n result.valid = false;\n }\n }\n\n return result;\n}\n\nfunction findClosestMatch(input: string, candidates: Set<string>): string | undefined {\n let best: string | undefined;\n let bestDist = Infinity;\n\n for (const candidate of candidates) {\n const dist = levenshtein(input.toLowerCase(), candidate.toLowerCase());\n if (dist < bestDist && dist <= 3) {\n bestDist = dist;\n best = candidate;\n }\n }\n\n return best;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","import { readFile } from 'node:fs/promises';\nimport { existsSync, statSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\nimport { PromptCache } from './cache.js';\nimport { resolveIncludes } from './composition/index.js';\nimport { applyOverrides } from './overrides/index.js';\nimport { parsePrompt, loadPromptFile } from './parser/index.js';\nimport type { PromptAsset, PromptAssetOverrides, ResolvedPromptAsset } from './schema/index.js';\n\nexport type PromptResolutionMode = 'auto' | 'compiled-only' | 'source-only';\n\nexport const DEFAULT_PROMPTS_DIR = './prompts';\nexport const DEFAULT_COMPILED_JSON_DIR = './.generated-prompts/json';\nexport const DEFAULT_COMPILED_ESM_DIR = './.generated-prompts/esm';\n\nexport interface PromptResolutionConfig {\n sourceDir?: string;\n compiledDir?: string;\n mode?: PromptResolutionMode;\n cache?: boolean;\n}\n\nexport interface ResolvedPromptResolutionConfig {\n sourceDir: string;\n compiledDir: string;\n mode?: PromptResolutionMode;\n cache?: boolean;\n}\n\nexport function defaultCompiledDirForFormat(format: 'json' | 'esm'): string {\n return format === 'esm' ? DEFAULT_COMPILED_ESM_DIR : DEFAULT_COMPILED_JSON_DIR;\n}\n\nexport function withPromptResolutionDefaults(config: PromptResolutionConfig): ResolvedPromptResolutionConfig {\n return {\n ...config,\n sourceDir: config.sourceDir ?? DEFAULT_PROMPTS_DIR,\n compiledDir: config.compiledDir ?? DEFAULT_COMPILED_JSON_DIR,\n };\n}\n\nconst sharedPromptCache = new PromptCache<PromptAsset>();\n\nexport async function loadPromptAsset(\n promptPath: string,\n config: PromptResolutionConfig,\n promptCache: PromptCache<PromptAsset> = sharedPromptCache,\n): Promise<PromptAsset> {\n const resolvedConfig = withPromptResolutionDefaults(config);\n const mode = resolvedConfig.mode ?? 'auto';\n\n if (mode !== 'source-only' && resolvedConfig.compiledDir) {\n const compiledFile = resolve(resolvedConfig.compiledDir, promptPath + '.json');\n if (existsSync(compiledFile)) {\n if (mode === 'auto') {\n const sourceFile = resolve(resolvedConfig.sourceDir, promptPath + '.md');\n if (existsSync(sourceFile)) {\n const compiledMtime = statSync(compiledFile).mtimeMs;\n const sourceMtime = statSync(sourceFile).mtimeMs;\n if (sourceMtime > compiledMtime) {\n console.warn(\n `[promptopskit] Warning: compiled artifact for \"${promptPath}\" is older than source .md file.\\n`\n + ' Run \"promptopskit compile\" or switch to source-only mode.',\n );\n }\n }\n }\n\n const content = await readFile(compiledFile, 'utf-8');\n return JSON.parse(content) as PromptAsset;\n }\n\n if (mode === 'compiled-only') {\n throw new Error(\n `Compiled artifact not found: ${compiledFile}\\n`\n + 'Run \"promptopskit compile\" to generate it.',\n );\n }\n }\n\n if (mode !== 'compiled-only') {\n const sourceFile = resolve(resolvedConfig.sourceDir, promptPath + '.md');\n\n if (resolvedConfig.cache !== false) {\n const cached = promptCache.get(sourceFile);\n if (cached) {\n return cached;\n }\n }\n\n if (!existsSync(sourceFile)) {\n const paths = [sourceFile];\n if (resolvedConfig.compiledDir) {\n paths.unshift(resolve(resolvedConfig.compiledDir, promptPath + '.json'));\n }\n\n throw new Error(\n `Prompt not found: \"${promptPath}\"\\nSearched:\\n${paths.map((candidate) => ` - ${candidate}`).join('\\n')}`,\n );\n }\n\n const { asset } = await loadPromptFile(sourceFile, { defaultsRoot: resolvedConfig.sourceDir });\n\n if (resolvedConfig.cache !== false) {\n promptCache.set(sourceFile, asset);\n }\n\n return asset;\n }\n\n throw new Error(`Prompt not found: \"${promptPath}\"`);\n}\n\nexport async function resolvePromptAsset(\n promptPath: string,\n config: PromptResolutionConfig,\n options: { environment?: string; tier?: string; runtime?: Partial<PromptAssetOverrides> } = {},\n promptCache: PromptCache<PromptAsset> = sharedPromptCache,\n): Promise<ResolvedPromptAsset> {\n const resolvedConfig = withPromptResolutionDefaults(config);\n let asset = await loadPromptAsset(promptPath, resolvedConfig, promptCache);\n\n const sourceFile = resolve(resolvedConfig.sourceDir, promptPath + '.md');\n if (asset.includes && asset.includes.length > 0 && existsSync(sourceFile)) {\n asset = await resolveIncludes(asset, sourceFile);\n }\n\n asset = applyOverrides(asset, {\n environment: options.environment,\n tier: options.tier,\n runtime: options.runtime,\n });\n\n return asset as ResolvedPromptAsset;\n}\n\nexport function resolveInlinePromptSource(\n source: string,\n options: { environment?: string; tier?: string; runtime?: Partial<PromptAssetOverrides> } = {},\n): ResolvedPromptAsset {\n const { asset } = parsePrompt(source);\n return applyOverrides(asset, {\n environment: options.environment,\n tier: options.tier,\n runtime: options.runtime,\n }) as ResolvedPromptAsset;\n}","import { statSync } from 'node:fs';\n\ninterface CacheEntry<T> {\n value: T;\n mtime: number;\n}\n\n/**\n * Simple in-memory LRU cache keyed by file path + mtime.\n * Used to avoid re-parsing prompt files on every renderPrompt() call.\n */\nexport class PromptCache<T> {\n private cache = new Map<string, CacheEntry<T>>();\n private maxSize: number;\n\n constructor(maxSize = 100) {\n this.maxSize = maxSize;\n }\n\n get(filePath: string): T | undefined {\n const entry = this.cache.get(filePath);\n if (!entry) return undefined;\n\n try {\n const stat = statSync(filePath);\n if (stat.mtimeMs !== entry.mtime) {\n this.cache.delete(filePath);\n return undefined;\n }\n } catch {\n this.cache.delete(filePath);\n return undefined;\n }\n\n // Refresh recency for true LRU semantics.\n this.cache.delete(filePath);\n this.cache.set(filePath, entry);\n\n return entry.value;\n }\n\n set(filePath: string, value: T): void {\n try {\n const stat = statSync(filePath);\n\n if (this.cache.has(filePath)) {\n this.cache.delete(filePath);\n } else if (this.cache.size >= this.maxSize) {\n const oldest = this.cache.keys().next().value;\n if (oldest) this.cache.delete(oldest);\n }\n\n this.cache.set(filePath, { value, mtime: stat.mtimeMs });\n } catch {\n // Can't stat the file — don't cache\n }\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n get size(): number {\n return this.cache.size;\n }\n}\n","import type { PromptAsset, PromptAssetOverrides } from '../schema/index.js';\n\nexport interface OverrideOptions {\n environment?: string;\n tier?: string;\n runtime?: Partial<PromptAssetOverrides>;\n}\n\n/**\n * Apply environment, tier, and runtime overrides to a prompt asset.\n *\n * Precedence: base → environment → tier → runtime\n * Scalars are replaced. Arrays are replaced (not concatenated).\n */\nexport function applyOverrides(\n asset: PromptAsset,\n options: OverrideOptions = {},\n): PromptAsset {\n let result = { ...asset };\n\n // Apply environment override\n if (options.environment && result.environments?.[options.environment]) {\n result = mergeOverride(result, result.environments[options.environment]);\n }\n\n // Apply tier override\n if (options.tier && result.tiers?.[options.tier]) {\n result = mergeOverride(result, result.tiers[options.tier]);\n }\n\n // Apply runtime overrides\n if (options.runtime) {\n result = mergeOverride(result, options.runtime);\n }\n\n return result;\n}\n\nfunction mergeOverride(\n base: PromptAsset,\n override: Partial<PromptAssetOverrides>,\n): PromptAsset {\n const result = { ...base };\n\n if (override.model !== undefined) result.model = override.model;\n if (override.fallback_models !== undefined) result.fallback_models = override.fallback_models;\n if (override.tools !== undefined) result.tools = override.tools;\n\n if (override.reasoning !== undefined) {\n result.reasoning = { ...result.reasoning, ...override.reasoning };\n }\n if (override.sampling !== undefined) {\n result.sampling = { ...result.sampling, ...override.sampling };\n }\n if (override.response !== undefined) {\n result.response = { ...result.response, ...override.response };\n }\n if (override.cache !== undefined) {\n result.cache = {\n ...result.cache,\n ...override.cache,\n openai: mergeRecordBlock(result.cache?.openai, override.cache.openai),\n anthropic: mergeRecordBlock(result.cache?.anthropic, override.cache.anthropic),\n gemini: mergeRecordBlock(result.cache?.gemini, override.cache.gemini),\n google: mergeRecordBlock(result.cache?.google, override.cache.google),\n };\n }\n if (override.raw !== undefined) {\n result.raw = {\n ...result.raw,\n ...override.raw,\n openai: mergeRecordBlock(result.raw?.openai, override.raw.openai),\n 'openai-responses': mergeRecordBlock(result.raw?.['openai-responses'], override.raw['openai-responses']),\n openai_responses: mergeRecordBlock(result.raw?.openai_responses, override.raw.openai_responses),\n anthropic: mergeRecordBlock(result.raw?.anthropic, override.raw.anthropic),\n gemini: mergeRecordBlock(result.raw?.gemini, override.raw.gemini),\n google: mergeRecordBlock(result.raw?.google, override.raw.google),\n openrouter: mergeRecordBlock(result.raw?.openrouter, override.raw.openrouter),\n };\n }\n\n if (override.provider_options !== undefined) {\n result.provider_options = {\n ...result.provider_options,\n ...override.provider_options,\n anthropic: {\n ...result.provider_options?.anthropic,\n ...override.provider_options.anthropic,\n },\n gemini: {\n ...result.provider_options?.gemini,\n ...override.provider_options.gemini,\n },\n openrouter: {\n ...result.provider_options?.openrouter,\n ...override.provider_options.openrouter,\n },\n };\n }\n\n return result;\n}\n\nfunction mergeRecordBlock<T extends object>(\n base: T | undefined,\n override: T | undefined,\n): T | undefined {\n if (override === undefined) return base;\n return { ...base, ...override } as T;\n}\n","import { existsSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\n\nexport function findDefaultsRoot(filePath: string): string {\n let current = resolve(dirname(filePath));\n let root = current;\n let foundDefaults = false;\n\n while (true) {\n if (existsSync(join(current, 'defaults.md'))) {\n root = current;\n foundDefaults = true;\n } else if (foundDefaults) {\n return root;\n }\n\n const parent = dirname(current);\n if (parent === current) {\n return root;\n }\n\n current = parent;\n }\n}","import { readdir, writeFile, mkdir, rm } from 'node:fs/promises';\nimport { join, extname, relative, dirname } from 'node:path';\nimport { loadPromptFile } from '../../parser/index.js';\nimport { resolveIncludes } from '../../composition/index.js';\nimport { validateAssetWithIncludes } from '../../validation/index.js';\nimport { DEFAULT_PROMPTS_DIR, defaultCompiledDirForFormat } from '../../prompt-resolution.js';\n\nconst HELP = `\npromptopskit compile [sourceDir] [outputDir] [options]\n\nCompile .md prompt files to JSON or ESM artifacts.\n\nOptions:\n --source, -s Source directory (default: ./prompts)\n --output, -o Output directory (default: ./.generated-prompts/<format>)\n --no-clean Don't clear the output directory before compiling\n --dry-run Show what would be compiled without writing files\n --format Output format: json (default) or esm\n --help, -h Show this help\n`.trim();\n\nexport async function compile(args: string[]): Promise<void> {\n if (args.includes('--help') || args.includes('-h')) {\n console.log(HELP);\n return;\n }\n\n const positional = getPositionalArgs(args, new Set(['--format', '--source', '--output', '-s', '-o']));\n const dryRun = args.includes('--dry-run');\n const noClean = args.includes('--no-clean');\n const format = getFlag(args, '--format') ?? 'json';\n\n if (format !== 'json' && format !== 'esm') {\n console.error(`Error: Unknown format \"${format}\". Use \"json\" or \"esm\".`);\n process.exit(1);\n }\n\n const sourceDir = getFlag(args, '--source', '-s') ?? positional[0] ?? DEFAULT_PROMPTS_DIR;\n const outputDir = getFlag(args, '--output', '-o') ?? positional[1] ?? defaultCompiledDirForFormat(format);\n\n // Collect prompt files\n const files = await collectPromptFiles(sourceDir);\n\n if (files.length === 0) {\n console.log(`No .md prompt files found in ${sourceDir}`);\n return;\n }\n\n // Clean output dir\n if (!noClean && !dryRun) {\n await rm(outputDir, { recursive: true, force: true });\n }\n\n let compiled = 0;\n let errors = 0;\n\n for (const file of files) {\n const rel = relative(sourceDir, file).replace(/\\.md$/, '');\n const outExt = format === 'esm' ? '.mjs' : '.json';\n const outPath = join(outputDir, rel + outExt);\n\n try {\n const { asset: parsed, raw } = await loadPromptFile(file, { defaultsRoot: sourceDir });\n\n const validation = await validateAssetWithIncludes(parsed, file, Object.keys(raw.frontMatter));\n if (validation.errors.length > 0) {\n throw new Error(validation.errors.map((error) => `${error.code}: ${error.message}`).join('\\n '));\n }\n\n // Resolve includes so compiled artifacts are self-sufficient\n const asset = (parsed.includes && parsed.includes.length > 0)\n ? await resolveIncludes(parsed, file)\n : parsed;\n\n if (dryRun) {\n console.log(` Would create: ${outPath}`);\n } else {\n await mkdir(dirname(outPath), { recursive: true });\n\n if (format === 'esm') {\n const esmContent = `export default ${JSON.stringify(asset, null, 2)};\\n`;\n await writeFile(outPath, esmContent, 'utf-8');\n } else {\n await writeFile(outPath, JSON.stringify(asset, null, 2) + '\\n', 'utf-8');\n }\n console.log(` ✓ ${outPath}`);\n }\n compiled++;\n } catch (err) {\n errors++;\n const message = err instanceof Error ? err.message : String(err);\n console.error(` ✗ ${file}`);\n console.error(` ${message}`);\n }\n }\n\n console.log();\n if (dryRun) {\n console.log(`Dry run: ${compiled} file(s) would be compiled, ${errors} error(s)`);\n } else {\n console.log(`Compiled ${compiled} file(s), ${errors} error(s)`);\n }\n\n if (errors > 0) {\n process.exit(1);\n }\n}\nfunction getPositionalArgs(args: string[], flagsWithValues: Set<string>): string[] {\n const positional: string[] = [];\n\n for (let index = 0; index < args.length; index++) {\n const arg = args[index];\n if (flagsWithValues.has(arg)) {\n index++;\n continue;\n }\n\n if (arg.startsWith('-')) {\n continue;\n }\n\n positional.push(arg);\n }\n\n return positional;\n}\n\nfunction getFlag(args: string[], ...flags: string[]): string | undefined {\n for (const flag of flags) {\n const idx = args.indexOf(flag);\n if (idx >= 0 && idx + 1 < args.length) {\n return args[idx + 1];\n }\n }\n return undefined;\n}\n\nasync function collectPromptFiles(dir: string): Promise<string[]> {\n const results: string[] = [];\n const entries = await readdir(dir, { withFileTypes: true, recursive: true });\n for (const entry of entries) {\n if (\n entry.isFile()\n && extname(entry.name) === '.md'\n && !entry.name.endsWith('.test.md')\n && entry.name !== 'defaults.md'\n ) {\n results.push(join(entry.parentPath ?? dir, entry.name));\n }\n }\n return results.sort();\n}\n","import { readFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { loadPromptFile } from '../../parser/index.js';\nimport { resolveIncludes } from '../../composition/index.js';\nimport { applyOverrides } from '../../overrides/index.js';\nimport { interpolate } from '../../renderer/interpolate.js';\nimport { findDefaultsRoot } from './defaults-root.js';\n\nconst HELP = `\npromptopskit render <file> [options]\n\nRender a prompt preview with variables.\n\nOptions:\n --env <name> Environment override\n --tier <name> Tier override\n --vars <file> JSON file with variables\n --json Output raw JSON instead of readable format\n --help, -h Show this help\n`.trim();\n\nexport async function render(args: string[]): Promise<void> {\n if (args.includes('--help') || args.includes('-h')) {\n console.log(HELP);\n return;\n }\n\n const positional = getPositionalArgs(args, new Set(['--env', '--tier', '--vars']));\n const file = positional[0];\n if (!file) {\n console.error('Error: Please provide a prompt file to render.');\n process.exit(1);\n }\n\n const env = getFlag(args, '--env');\n const tier = getFlag(args, '--tier');\n const varsFile = getFlag(args, '--vars');\n const jsonOutput = args.includes('--json');\n\n // Load variables from file or sidecar\n let variables: Record<string, string> = {};\n\n if (varsFile) {\n const varsContent = await readFile(varsFile, 'utf-8');\n variables = JSON.parse(varsContent);\n } else {\n // Try auto-loading sidecar .test.yaml\n const sidecarPath = file.replace(/\\.md$/, '.test.yaml');\n if (existsSync(sidecarPath)) {\n const { default: yaml } = await import('gray-matter');\n const sidecarContent = await readFile(sidecarPath, 'utf-8');\n // Wrap in --- delimiters so gray-matter parses the entire file as front matter\n const parsed = yaml(`---\\n${sidecarContent}---\\n`);\n const data = parsed.data as { cases?: Array<{ variables?: Record<string, string> }> };\n if (data.cases?.[0]?.variables) {\n variables = data.cases[0].variables;\n }\n }\n }\n\n const defaultsRoot = findDefaultsRoot(file);\n const { asset: parsed } = await loadPromptFile(file, { defaultsRoot });\n\n // Resolve includes (matching the library pipeline)\n const resolved = (parsed.includes && parsed.includes.length > 0)\n ? await resolveIncludes(parsed, file)\n : parsed;\n\n // Apply overrides using the standard applyOverrides function\n const overridden = applyOverrides(resolved, {\n environment: env,\n tier: tier,\n });\n\n // Render sections with variables\n const renderedSystem = overridden.sections?.system_instructions\n ? interpolate(overridden.sections.system_instructions, variables)\n : undefined;\n const renderedPrompt = overridden.sections?.prompt_template\n ? interpolate(overridden.sections.prompt_template, variables)\n : undefined;\n\n if (jsonOutput) {\n console.log(JSON.stringify({\n id: overridden.id,\n provider: overridden.provider,\n model: overridden.model,\n system_instructions: renderedSystem,\n prompt_template: renderedPrompt,\n tools: overridden.tools,\n }, null, 2));\n return;\n }\n\n // Readable output\n const label = [\n overridden.provider,\n overridden.model,\n [env, tier].filter(Boolean).join('/'),\n ].filter(Boolean).join(', ');\n\n console.log(`── ${overridden.id} (${label}) ${'─'.repeat(Math.max(0, 50 - overridden.id.length - label.length))}`);\n\n if (renderedSystem) {\n console.log(`System: ${renderedSystem.split('\\n')[0]}${renderedSystem.includes('\\n') ? '...' : ''}`);\n }\n if (renderedPrompt) {\n console.log(`User: ${renderedPrompt.split('\\n')[0]}${renderedPrompt.includes('\\n') ? '...' : ''}`);\n }\n if (overridden.tools?.length) {\n const toolNames = overridden.tools.map((t) => typeof t === 'string' ? t : t.name);\n console.log(`Tools: ${toolNames.join(', ')}`);\n }\n console.log(`Model: ${overridden.model ?? 'not set'}`);\n console.log('─'.repeat(60));\n}\n\nfunction getPositionalArgs(args: string[], flagsWithValues: Set<string>): string[] {\n const positional: string[] = [];\n\n for (let index = 0; index < args.length; index++) {\n const arg = args[index];\n if (flagsWithValues.has(arg)) {\n index += 1;\n continue;\n }\n\n if (arg.startsWith('-')) {\n continue;\n }\n\n positional.push(arg);\n }\n\n return positional;\n}\n\nfunction getFlag(args: string[], flag: string): string | undefined {\n const idx = args.indexOf(flag);\n if (idx >= 0 && idx + 1 < args.length) {\n return args[idx + 1];\n }\n return undefined;\n}\n","import { loadPromptFile } from '../../parser/index.js';\nimport { resolveIncludes } from '../../composition/index.js';\nimport { findDefaultsRoot } from './defaults-root.js';\n\nconst HELP = `\npromptopskit inspect <file>\n\nPrint the normalized prompt asset as JSON.\n\nOptions:\n --help, -h Show this help\n`.trim();\n\nexport async function inspect(args: string[]): Promise<void> {\n if (args.includes('--help') || args.includes('-h')) {\n console.log(HELP);\n return;\n }\n\n const file = args.find((a) => !a.startsWith('--'));\n if (!file) {\n console.error('Error: Please provide a prompt file to inspect.');\n process.exit(1);\n }\n\n const defaultsRoot = findDefaultsRoot(file);\n const { asset: parsed } = await loadPromptFile(file, { defaultsRoot });\n\n // Resolve includes so the output shows the fully resolved asset\n const asset = (parsed.includes && parsed.includes.length > 0)\n ? await resolveIncludes(parsed, file)\n : parsed;\n\n console.log(JSON.stringify(asset, null, 2));\n}\n","import { writeFile, mkdir } from 'node:fs/promises';\nimport { join, dirname, relative } from 'node:path';\nimport { existsSync, readFileSync } from 'node:fs';\n\nconst HELP = `\npromptopskit init [dir]\n\nScaffold a prompts directory with starter files.\n\nArguments:\n dir Target directory (default: ./prompts)\n\nOptions:\n --help, -h Show this help\n`.trim();\n\nconst HELLO_PROMPT = `---\nid: hello\ncontext:\n inputs:\n - name\n - app_context\nincludes:\n - ./shared/tone.md\ncache:\n openai:\n # Keep this stable across requests that share a long static prefix.\n prompt_cache_key: hello-v1\n retention: in_memory\nreasoning:\n effort: high\nenvironments:\n dev:\n model: gpt-5.4-mini\n reasoning:\n effort: low\n sampling:\n temperature: 0.2\n---\n\n# System instructions\n\nYou are a friendly assistant. Be helpful and concise.\nCurrent app context: {{ app_context }}.\n\n# Prompt template\n\nSay hello to {{ name }} and ask how you can help them today.\n`.trimStart();\n\nconst TONE_INCLUDE = `---\nid: shared/tone\nschema_version: 1\n---\n\n# System instructions\n\nAlways be polite, professional, and concise. Avoid jargon unless the user uses it first.\n`.trimStart();\n\nconst DEFAULTS = `---\nprovider: openai\nmodel: gpt-5.4\nmetadata:\n owner: my-team\n review_required: true\n---\n\n# System instructions\n\nYou are a helpful AI assistant. Follow company guidelines at all times.\n`.trimStart();\n\nconst TEST_SIDECAR = `cases:\n - name: basic-greeting\n variables:\n name: \"World\"\n app_context: \"Welcome screen\"\n response:\n message: \"Hello, World! How can I help you today?\"\n - name: named-greeting\n variables:\n name: \"Alice\"\n app_context: \"Settings page\"\n response:\n message: \"Hello, Alice! How can I help you today?\"\n`;\n\nconst EXAMPLE_USAGE = `// Example: render the hello prompt and send it to OpenAI\n// Full docs: https://promptopskit.com/docs/index.html#/\n\nimport { createPromptOpsKit } from 'promptopskit';\n\nasync function main() {\n const kit = createPromptOpsKit({ sourceDir: './prompts' });\n\n // Determine environment from ENV var (defaults to 'dev')\n // - dev: uses gpt-5.4-mini, low reasoning effort, temperature 0.2\n // - production: uses base model gpt-5.4 with high reasoning effort\n const environment = process.env.NODE_ENV === 'production' ? 'prod' : 'dev';\n\n const { request } = await kit.renderPrompt({\n path: 'hello',\n provider: 'openai',\n environment,\n variables: {\n name: 'World',\n app_context: 'Welcome screen',\n },\n });\n\n /*\n request.body is the fully transformed OpenAI Chat Completions payload.\n For the hello.md prompt in the dev environment it looks like:\n\n {\n \"model\": \"gpt-5.4-mini\",\n \"reasoning_effort\": \"low\",\n \"temperature\": 0.2,\n \"messages\": [\n {\n \"role\": \"system\",\n \"content\": \"You are a friendly assistant. Be helpful and concise.\n Current app context: Welcome screen.\n\n Always be polite, professional, and concise. Avoid jargon unless the user uses it first.\"\n },\n {\n \"role\": \"user\",\n \"content\": \"Say hello to World and ask how you can help them today.\"\n }\n ]\n }\n */\n\n console.log('Model:', request.body.model);\n\n const res = await fetch('https://api.openai.com/v1/chat/completions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: \\`Bearer \\${process.env.OPENAI_API_KEY}\\`,\n },\n body: JSON.stringify(request.body),\n });\n\n const data = await res.json();\n console.log(data.choices[0].message.content);\n}\n\nmain();\n`;\n\nexport async function init(args: string[]): Promise<void> {\n if (args.includes('--help') || args.includes('-h')) {\n console.log(HELP);\n return;\n }\n\n const dir = args.find((a) => !a.startsWith('--')) ?? './prompts';\n const testFilePath = join(dirname(dir), 'tests', 'hello.prompt.test.mjs');\n const promptsDirFromTest = relative(dirname(testFilePath), dir) || '.';\n const helloPromptTest = createHelloPromptTest(promptsDirFromTest);\n\n const files: Array<{ path: string; content: string }> = [\n { path: join(dir, 'defaults.md'), content: DEFAULTS },\n { path: join(dir, 'hello.md'), content: HELLO_PROMPT },\n { path: join(dir, 'hello.test.yaml'), content: TEST_SIDECAR },\n { path: join(dir, 'shared', 'tone.md'), content: TONE_INCLUDE },\n { path: join(dir, 'example-usage.ts'), content: EXAMPLE_USAGE },\n { path: testFilePath, content: helloPromptTest },\n ];\n\n let created = 0;\n let skipped = 0;\n\n for (const file of files) {\n if (existsSync(file.path)) {\n console.log(` skip ${file.path} (already exists)`);\n skipped++;\n continue;\n }\n await mkdir(dirname(file.path), { recursive: true });\n await writeFile(file.path, file.content, 'utf-8');\n console.log(` ✓ ${file.path}`);\n created++;\n }\n\n console.log();\n console.log(`Created ${created} file(s), skipped ${skipped} existing.`);\n\n // Suggest build script if package.json exists\n if (existsSync('package.json')) {\n try {\n const pkg = JSON.parse(readFileSync('package.json', 'utf-8'));\n if (!pkg.scripts?.['build:prompts']) {\n console.log();\n console.log(`Tip: Add to your package.json scripts:`);\n console.log(` \"build:prompts\": \"promptopskit compile ${dir}\"`);\n }\n if (!pkg.scripts?.test) {\n console.log();\n console.log(`Tip: Add a test script to run the generated prompt test:`);\n console.log(` \"test\": \"node --test tests/*.test.mjs\"`);\n }\n } catch {\n // Ignore parse errors\n }\n }\n}\n\nfunction createHelloPromptTest(promptsDirFromTest: string): string {\n return `import assert from 'node:assert/strict';\nimport { dirname, resolve } from 'node:path';\nimport test from 'node:test';\nimport { fileURLToPath } from 'node:url';\nimport { createPromptOpsKit } from 'promptopskit';\nimport {\n getHardcodedPromptResponse,\n loadPromptTestSidecar,\n renderPromptTestCase,\n} from 'promptopskit/testing';\n\nconst testDir = dirname(fileURLToPath(import.meta.url));\nconst promptsDir = resolve(testDir, ${JSON.stringify(promptsDirFromTest)});\n\ntest('hello prompt renders every sidecar case', async () => {\n const kit = createPromptOpsKit({ sourceDir: promptsDir, cache: false });\n const sidecar = await loadPromptTestSidecar(resolve(promptsDir, 'hello.test.yaml'));\n\n for (const testCase of sidecar.cases) {\n const { rendered } = await renderPromptTestCase(kit, {\n sidecar,\n caseName: testCase.name,\n path: 'hello',\n provider: 'openai',\n environment: 'dev',\n strict: true,\n });\n\n assert.ok(rendered.request?.body?.messages);\n }\n});\n\ntest('hello prompt can return a deterministic response without calling a model', async () => {\n const sidecar = await loadPromptTestSidecar(resolve(promptsDir, 'hello.test.yaml'));\n\n assert.deepEqual(getHardcodedPromptResponse(sidecar, 'basic-greeting'), {\n message: 'Hello, World! How can I help you today?',\n });\n});\n`;\n}\n","import { writeFile, readFile, mkdir } from 'node:fs/promises';\nimport { dirname } from 'node:path';\nimport { existsSync } from 'node:fs';\n\nconst MARKER_START = '<!-- promptopskit:start -->';\nconst MARKER_END = '<!-- promptopskit:end -->';\n\nconst HELP = `\npromptopskit skill [--target <target>] [--force]\n\nDeploy AI agent instructions so coding assistants know how to\ncreate and manage prompts using promptopskit.\n\nBy default, generates files for all major AI coding assistants:\n\n AGENTS.md Codex, OpenCode, Cursor, Copilot\n CLAUDE.md Claude Code (imports AGENTS.md)\n .github/instructions/promptopskit.instructions.md GitHub Copilot (path-specific)\n .cursor/rules/promptopskit.mdc Cursor (project rule)\n\nIf a file already exists, the promptopskit section is merged (replaced\nin-place or appended). Use --force to overwrite the entire file.\n\nOptions:\n --target, -t Deploy only a specific target (agents, claude, copilot, cursor)\n --force, -f Overwrite entire file instead of merging\n --help, -h Show this help\n`.trim();\n\nconst STUB_CONTENT = `# promptopskit\n\nThis project uses **promptopskit** to manage LLM prompts as code.\nRead the full guide at \\`node_modules/promptopskit/SKILL.md\\` before\ncreating or editing prompt files.`;\n\nconst CLAUDE_LINE = '@AGENTS.md';\n\ninterface TargetConfig {\n path: string;\n wrap: (content: string) => string;\n}\n\nconst TARGETS: Record<string, TargetConfig> = {\n agents: {\n path: 'AGENTS.md',\n wrap: (content) => content,\n },\n claude: {\n path: 'CLAUDE.md',\n wrap: () => CLAUDE_LINE + '\\n',\n },\n copilot: {\n path: '.github/instructions/promptopskit.instructions.md',\n wrap: (content) =>\n `---\\napplyTo: \"**\"\\n---\\n\\n${content}`,\n },\n cursor: {\n path: '.cursor/rules/promptopskit.mdc',\n wrap: (content) =>\n `---\\ndescription: How to create and manage prompts using promptopskit\\nglobs: \"**\"\\nalwaysApply: true\\n---\\n\\n${content}`,\n },\n};\n\nconst ALL_TARGETS = ['agents', 'claude', 'copilot', 'cursor'];\n\nexport async function skill(args: string[]): Promise<void> {\n if (args.includes('--help') || args.includes('-h')) {\n console.log(HELP);\n return;\n }\n\n const force = args.includes('--force') || args.includes('-f');\n\n let targets = ALL_TARGETS;\n const targetIdx = args.findIndex((a) => a === '--target' || a === '-t');\n if (targetIdx !== -1 && args[targetIdx + 1]) {\n const target = args[targetIdx + 1];\n const config = TARGETS[target];\n if (!config) {\n console.error(`Unknown target: ${target}`);\n console.error(`Valid targets: ${Object.keys(TARGETS).join(', ')}`);\n process.exit(1);\n }\n targets = [target];\n }\n\n let written = 0;\n for (const target of targets) {\n const config = TARGETS[target];\n const filePath = config.path;\n\n // CLAUDE.md uses a simple import line — handle dedup separately\n if (target === 'claude') {\n written += await deployClaude(filePath, force);\n continue;\n }\n\n const markedContent = config.wrap(wrapMarkers(STUB_CONTENT));\n\n if (existsSync(filePath) && !force) {\n const existing = await readFile(filePath, 'utf-8');\n const merged = mergeContent(existing, markedContent);\n if (merged === existing) {\n console.log(` skip ${filePath} (already up to date)`);\n continue;\n }\n await writeFile(filePath, merged, 'utf-8');\n console.log(` ✓ ${filePath} (merged)`);\n written++;\n continue;\n }\n\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, markedContent, 'utf-8');\n console.log(` ✓ ${filePath}`);\n written++;\n }\n\n if (written > 0) {\n console.log();\n console.log(`AI agents will now understand how to create and manage prompts with promptopskit.`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// CLAUDE.md — append @AGENTS.md if not already present\n// ---------------------------------------------------------------------------\n\nasync function deployClaude(filePath: string, force: boolean): Promise<number> {\n const content = CLAUDE_LINE + '\\n';\n\n if (!existsSync(filePath) || force) {\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, content, 'utf-8');\n console.log(` ✓ ${filePath}`);\n return 1;\n }\n\n const existing = await readFile(filePath, 'utf-8');\n if (existing.split('\\n').some((line) => line.trim() === CLAUDE_LINE)) {\n console.log(` skip ${filePath} (already up to date)`);\n return 0;\n }\n\n const separator = existing.endsWith('\\n') ? '\\n' : '\\n\\n';\n await writeFile(filePath, existing + separator + content, 'utf-8');\n console.log(` ✓ ${filePath} (merged)`);\n return 1;\n}\n\n// ---------------------------------------------------------------------------\n// Marker helpers\n// ---------------------------------------------------------------------------\n\nfunction wrapMarkers(content: string): string {\n return `${MARKER_START}\\n${content}\\n${MARKER_END}`;\n}\n\nfunction mergeContent(existing: string, markedContent: string): string {\n const startIdx = existing.indexOf(MARKER_START);\n const endIdx = existing.indexOf(MARKER_END);\n\n // Replace existing block in-place\n if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {\n return (\n existing.slice(0, startIdx) +\n markedContent +\n existing.slice(endIdx + MARKER_END.length)\n );\n }\n\n // Append to end\n const separator = existing.endsWith('\\n') ? '\\n' : '\\n\\n';\n return existing + separator + markedContent + '\\n';\n}\n"],"mappings":"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","names":["readFileSync","join","indent","matter","matter","readFile","resolve","dirname","dirname","resolve","readFile","readFile","statSync","resolve","stat","existsSync","dirname","join","resolve","join","readdir","join","extname","dirname","HELP","getPositionalArgs","getFlag","collectPromptFiles","join","dirname","readdir","extname","readFile","existsSync","HELP","getPositionalArgs","getFlag","readFile","existsSync","parsed","HELP","writeFile","mkdir","join","dirname","relative","existsSync","HELP","writeFile","readFile","mkdir","dirname","existsSync","HELP","HELP","readFileSync"]}
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/validate.ts","../../src/parser/parser.ts","../../src/schema/schema.ts","../../src/parser/frontmatter-guard.ts","../../src/parser/sections.ts","../../src/parser/loader.ts","../../src/parser/response-schema-ref.ts","../../src/renderer/interpolate.ts","../../src/context.ts","../../src/composition/resolve-includes.ts","../../src/validation/levenshtein.ts","../../src/validation/validate.ts","../../src/prompt-resolution.ts","../../src/cache.ts","../../src/overrides/apply-overrides.ts","../../src/cli/commands/defaults-root.ts","../../src/cli/commands/compile.ts","../../src/cli/commands/render.ts","../../src/cli/commands/inspect.ts","../../src/cli/commands/init.ts","../../src/cli/commands/skill.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\n\nimport { validate } from './commands/validate.js';\nimport { compile } from './commands/compile.js';\nimport { render } from './commands/render.js';\nimport { inspect } from './commands/inspect.js';\nimport { init } from './commands/init.js';\nimport { skill } from './commands/skill.js';\n\nconst HELP = `\npromptopskit — Manage prompts, system instructions, tools, and model settings as code\n\nUsage:\n promptopskit <command> [options]\n\nCommands:\n init [dir] Scaffold a prompts directory with starter files\n validate [sourceDir] [options] Validate prompt files\n compile [sourceDir] [outputDir] [options]\n Compile .md prompts to JSON/ESM artifacts\n render <file> [options] Render a prompt preview\n inspect <file> Print normalized prompt asset\n skill [options] Deploy AI agent instructions into your project\n\nOptions:\n --help, -h Show this help message\n --version, -v Show version\n\nRun promptopskit <command> --help for command-specific help.\n`.trim();\n\nasync function main() {\n const args = process.argv.slice(2);\n const command = args[0];\n\n if (!command || command === '--help' || command === '-h') {\n console.log(HELP);\n process.exit(0);\n }\n\n if (command === '--version' || command === '-v') {\n const pkg = JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf-8')) as {\n version: string;\n };\n console.log(pkg.version);\n process.exit(0);\n }\n\n const commandArgs = args.slice(1);\n\n switch (command) {\n case 'init':\n await init(commandArgs);\n break;\n case 'validate':\n await validate(commandArgs);\n break;\n case 'compile':\n await compile(commandArgs);\n break;\n case 'render':\n await render(commandArgs);\n break;\n case 'inspect':\n await inspect(commandArgs);\n break;\n case 'skill':\n await skill(commandArgs);\n break;\n default:\n console.error(`Unknown command: ${command}`);\n console.log(HELP);\n process.exit(1);\n }\n}\n\nmain().catch((err) => {\n console.error(err.message);\n process.exit(1);\n});\n","import { readdir, stat } from 'node:fs/promises';\nimport { dirname, join, extname } from 'node:path';\nimport { loadPromptFile } from '../../parser/index.js';\nimport { validateAssetWithIncludes } from '../../validation/index.js';\nimport { DEFAULT_PROMPTS_DIR } from '../../prompt-resolution.js';\nimport { findDefaultsRoot } from './defaults-root.js';\n\nconst HELP = `\npromptopskit validate [sourceDir] [options]\n\nValidate prompt .md files in a directory or a single prompt file.\n\nOptions:\n --source, -s Source directory (default: ./prompts)\n --strict Treat warnings as errors\n --help, -h Show this help\n`.trim();\n\nexport async function validate(args: string[]): Promise<void> {\n if (args.includes('--help') || args.includes('-h')) {\n console.log(HELP);\n return;\n }\n\n const positional = getPositionalArgs(args, new Set(['--source', '-s']));\n const target = getFlag(args, '--source', '-s') ?? positional[0] ?? DEFAULT_PROMPTS_DIR;\n const strict = args.includes('--strict');\n const files = await collectPromptFiles(target);\n\n if (files.length === 0) {\n console.log(`No .md prompt files found in ${target}`);\n return;\n }\n\n let errorCount = 0;\n let warnCount = 0;\n\n for (const file of files) {\n try {\n const defaultsRoot = files.length === 1 && file === target\n ? findDefaultsRoot(file)\n : target;\n const { asset, raw } = await loadPromptFile(file, { defaultsRoot });\n const result = await validateAssetWithIncludes(asset, file, Object.keys(raw.frontMatter));\n\n if (result.errors.length > 0) {\n errorCount += result.errors.length;\n console.error(` ✗ ${file}`);\n for (const err of result.errors) {\n console.error(` ${err.code}: ${err.message}`);\n }\n } else {\n console.log(` ✓ ${file}`);\n }\n\n if (result.warnings.length > 0) {\n warnCount += result.warnings.length;\n for (const warn of result.warnings) {\n const suggestion = warn.suggestion ? ` (${warn.suggestion})` : '';\n console.warn(` ⚠ ${warn.code}: ${warn.message}${suggestion}`);\n }\n }\n } catch (err) {\n errorCount++;\n const message = err instanceof Error ? err.message : String(err);\n console.error(` ✗ ${file}`);\n console.error(` ${message}`);\n }\n }\n\n console.log();\n console.log(`Validated ${files.length} file(s): ${errorCount} error(s), ${warnCount} warning(s)`);\n\n if (errorCount > 0 || (strict && warnCount > 0)) {\n process.exit(1);\n }\n}\n\nfunction getPositionalArgs(args: string[], flagsWithValues: Set<string>): string[] {\n const positional: string[] = [];\n\n for (let index = 0; index < args.length; index++) {\n const arg = args[index];\n if (flagsWithValues.has(arg)) {\n index += 1;\n continue;\n }\n\n if (arg.startsWith('-')) {\n continue;\n }\n\n positional.push(arg);\n }\n\n return positional;\n}\n\nfunction getFlag(args: string[], ...flags: string[]): string | undefined {\n for (const flag of flags) {\n const index = args.indexOf(flag);\n if (index >= 0 && index + 1 < args.length) {\n return args[index + 1];\n }\n }\n\n return undefined;\n}\n\nasync function collectPromptFiles(target: string): Promise<string[]> {\n const targetStats = await stat(target);\n\n if (targetStats.isFile()) {\n if (extname(target) !== '.md' || target.endsWith('defaults.md') || target.endsWith('.test.md')) {\n return [];\n }\n\n return [target];\n }\n\n const results: string[] = [];\n const entries = await readdir(target, { withFileTypes: true, recursive: true });\n for (const entry of entries) {\n if (\n entry.isFile()\n && extname(entry.name) === '.md'\n && !entry.name.endsWith('.test.md')\n && entry.name !== 'defaults.md'\n ) {\n results.push(join(entry.parentPath ?? target, entry.name));\n }\n }\n return results.sort();\n}\n","import matter from 'gray-matter';\nimport { PromptAssetSchema } from '../schema/index.js';\nimport type { PromptAsset } from '../schema/index.js';\nimport { assertRegexFrontMatterQuoting } from './frontmatter-guard.js';\nimport { extractSections } from './sections.js';\n\nexport interface ParseResult {\n asset: PromptAsset;\n raw: {\n frontMatter: Record<string, unknown>;\n body: string;\n };\n}\n\n/**\n * Parse a prompt markdown string (YAML front matter + markdown body)\n * into a validated PromptAsset.\n */\nexport function parsePrompt(content: string, filePath?: string): ParseResult {\n assertRegexFrontMatterQuoting(content, filePath);\n const { data: frontMatter, content: body } = matter(content);\n\n const sections = extractSections(body);\n\n const raw = {\n ...frontMatter,\n sections,\n source: filePath ? { file_path: filePath } : undefined,\n };\n\n const asset = PromptAssetSchema.parse(raw);\n\n return {\n asset,\n raw: {\n frontMatter: frontMatter as Record<string, unknown>,\n body,\n },\n };\n}\n","import { z } from 'zod';\n\n// --- Tool definitions ---\n\nexport const InlineToolDefSchema = z.object({\n name: z.string(),\n description: z.string().optional(),\n input_schema: z.record(z.unknown()).optional(),\n});\n\nexport type InlineToolDef = z.infer<typeof InlineToolDefSchema>;\n\nexport const ToolRefSchema = z.union([z.string(), InlineToolDefSchema]);\n\n// --- MCP ---\n\nexport const MCPServerRefSchema = z.union([\n z.string(),\n z.object({\n name: z.string(),\n config: z.record(z.unknown()).optional(),\n }),\n]);\n\nexport type MCPServerRef = z.infer<typeof MCPServerRefSchema>;\n\n// --- Reasoning ---\n\nexport const ReasoningSchema = z.object({\n effort: z.enum(['low', 'medium', 'high']).optional(),\n budget_tokens: z.number().int().positive().optional(),\n});\n\n// --- Sampling ---\n\nexport const SamplingSchema = z.object({\n temperature: z.number().min(0).max(2).optional(),\n top_p: z.number().min(0).max(1).optional(),\n frequency_penalty: z.number().optional(),\n presence_penalty: z.number().optional(),\n stop: z.array(z.string()).optional(),\n max_output_tokens: z.number().int().positive().optional(),\n});\n\n// --- Response ---\n\nexport const ResponseSchema = z.object({\n format: z.enum(['text', 'json', 'markdown']).optional(),\n stream: z.boolean().optional(),\n schema: z.record(z.unknown()).optional(),\n schema_ref: z.string().min(1).optional(),\n schema_source: z.object({\n mode: z.enum(['inline', 'schema_ref_json', 'schema_ref_zod_module']).optional(),\n ref: z.string().optional(),\n resolved_path: z.string().optional(),\n hash: z.string().optional(),\n }).optional(),\n schema_name: z.string().optional(),\n schema_description: z.string().optional(),\n schema_strict: z.boolean().optional(),\n});\n\nexport const ResponseSchemaWithValidation = ResponseSchema.superRefine((value, ctx) => {\n if (value.schema !== undefined && value.schema_ref !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'response.schema and response.schema_ref are mutually exclusive',\n path: ['schema_ref'],\n });\n }\n});\n\n\n// --- Provider-specific options ---\n\nexport const AnthropicProviderOptionsSchema = z.object({\n top_k: z.number().int().min(0).optional(),\n tool_choice: z.record(z.unknown()).optional(),\n output_config: z.record(z.unknown()).optional(),\n});\n\nexport const GeminiProviderOptionsSchema = z.object({\n candidate_count: z.number().int().positive().optional(),\n top_k: z.number().int().min(0).optional(),\n seed: z.number().int().optional(),\n response_schema: z.record(z.unknown()).optional(),\n response_json_schema: z.record(z.unknown()).optional(),\n response_modalities: z.array(z.string()).optional(),\n thinking_budget_tokens: z.number().int().positive().optional(),\n});\n\nexport const OpenRouterProviderOptionsSchema = z.object({\n provider: z.record(z.unknown()).optional(),\n transforms: z.array(z.string()).optional(),\n plugins: z.array(z.record(z.unknown())).optional(),\n models: z.array(z.string()).optional(),\n});\n\nexport const LLMAsAServiceCustomerSchema = z.object({\n customer_id: z.string(),\n customer_name: z.string().optional(),\n customer_user_id: z.string().optional(),\n customer_user_name: z.string().optional(),\n customer_user_email: z.string().optional(),\n});\n\nexport const LLMAsAServiceProviderOptionsSchema = z.object({\n base_url: z.string().url().optional(),\n project_id: z.string().optional(),\n customer: LLMAsAServiceCustomerSchema.optional(),\n conversationId: z.string().optional(),\n conversationTitle: z.string().optional(),\n projectId: z.string().optional(),\n});\n\nexport const ProviderOptionsSchema = z.object({\n anthropic: AnthropicProviderOptionsSchema.optional(),\n gemini: GeminiProviderOptionsSchema.optional(),\n openrouter: OpenRouterProviderOptionsSchema.optional(),\n llmasaservice: LLMAsAServiceProviderOptionsSchema.optional(),\n});\n\nexport type ProviderOptions = z.infer<typeof ProviderOptionsSchema>;\n\n// --- Raw provider body passthrough ---\n\nexport const RawProviderBodySchema = z.object({\n openai: z.record(z.unknown()).optional(),\n 'openai-responses': z.record(z.unknown()).optional(),\n openai_responses: z.record(z.unknown()).optional(),\n anthropic: z.record(z.unknown()).optional(),\n gemini: z.record(z.unknown()).optional(),\n google: z.record(z.unknown()).optional(),\n openrouter: z.record(z.unknown()).optional(),\n llmasaservice: z.record(z.unknown()).optional(),\n});\n\nexport type RawProviderBody = z.infer<typeof RawProviderBodySchema>;\n\n// --- Cache controls ---\n\nexport const OpenAICacheSchema = z.object({\n prompt_cache_key: z.string().min(1).optional(),\n retention: z.enum(['in_memory', '24h']).optional(),\n});\n\nexport const AnthropicCacheSchema = z.object({\n mode: z.enum(['automatic', 'explicit']).optional(),\n type: z.literal('ephemeral').optional(),\n ttl: z.enum(['5m', '1h']).optional(),\n cache_system_instructions: z.boolean().optional(),\n cache_tools: z.boolean().optional(),\n cache_prompt_template: z.boolean().optional(),\n});\n\nexport const GeminiCacheSchema = z.object({\n cached_content: z.string().min(1).optional(),\n});\n\nexport const CacheSchema = z.object({\n openai: OpenAICacheSchema.optional(),\n anthropic: AnthropicCacheSchema.optional(),\n gemini: GeminiCacheSchema.optional(),\n google: GeminiCacheSchema.optional(),\n});\n\n// --- Context ---\n\nexport const HistorySchema = z.object({\n max_items: z.number().int().positive().optional(),\n});\n\nexport const ContextRegexSchema = z.union([\n z.string(),\n z.object({\n pattern: z.string(),\n flags: z.string().optional(),\n return_message: z.string().optional(),\n }),\n]);\n\nexport const ContextBuiltInValidatorSchema = z.union([\n z.boolean(),\n z.object({\n return_message: z.string().optional(),\n }),\n]);\n\nexport const ContextInputDefinitionObjectSchema = z.object({\n name: z.string(),\n optional: z.boolean().optional(),\n warnings: z.boolean().optional(),\n max_size: z.number().int().positive().optional(),\n trim: z.union([z.boolean(), z.enum(['start', 'end', 'both'])]).optional(),\n allow_regex: ContextRegexSchema.optional(),\n deny_regex: ContextRegexSchema.optional(),\n non_empty: ContextBuiltInValidatorSchema.optional(),\n reject_secrets: ContextBuiltInValidatorSchema.optional(),\n});\n\nexport const ContextInputDefinitionSchema = z.union([\n z.string(),\n ContextInputDefinitionObjectSchema,\n]);\n\nexport type ContextInputDefinition = z.infer<typeof ContextInputDefinitionSchema>;\nexport type ContextRegexDefinition = z.infer<typeof ContextRegexSchema>;\nexport type ContextBuiltInValidatorDefinition = z.infer<typeof ContextBuiltInValidatorSchema>;\n\nexport const ContextSchema = z.object({\n inputs: z.array(ContextInputDefinitionSchema).optional(),\n history: HistorySchema.optional(),\n});\n\n// --- Metadata ---\n\nexport const MetadataSchema = z.object({\n owner: z.string().optional(),\n tags: z.array(z.string()).optional(),\n review_required: z.boolean().optional(),\n stable: z.boolean().optional(),\n});\n\n// --- MCP block ---\n\nexport const MCPSchema = z.object({\n servers: z.array(MCPServerRefSchema).optional(),\n});\n\n// --- Overrides (subset allowed in environments/tiers) ---\n\nexport const PromptAssetOverridesSchema = z.object({\n model: z.string().optional(),\n fallback_models: z.array(z.string()).optional(),\n reasoning: ReasoningSchema.optional(),\n sampling: SamplingSchema.optional(),\n response: ResponseSchemaWithValidation.optional(),\n cache: CacheSchema.optional(),\n raw: RawProviderBodySchema.optional(),\n tools: z.array(ToolRefSchema).optional(),\n provider_options: ProviderOptionsSchema.optional(),\n});\n\nexport type PromptAssetOverrides = z.infer<typeof PromptAssetOverridesSchema>;\n\n// --- Source tracking ---\n\nexport const SourceSchema = z.object({\n file_path: z.string().optional(),\n checksum: z.string().optional(),\n});\n\n// --- Sections (populated by parser) ---\n\nexport const SectionsSchema = z.object({\n system_instructions: z.string().optional(),\n prompt_template: z.string().optional(),\n notes: z.string().optional(),\n});\n\n// --- Defaults files (folder-level inheritance) ---\n\nexport const PromptDefaultsSchema = z.object({\n provider: z.enum(['openai', 'openai-responses', 'anthropic', 'google', 'gemini', 'openrouter', 'llmasaservice', 'any']).optional(),\n model: z.string().optional(),\n fallback_models: z.array(z.string()).optional(),\n reasoning: ReasoningSchema.optional(),\n sampling: SamplingSchema.optional(),\n response: ResponseSchema.optional(),\n cache: CacheSchema.optional(),\n raw: RawProviderBodySchema.optional(),\n tools: z.array(ToolRefSchema).optional(),\n provider_options: ProviderOptionsSchema.optional(),\n mcp: MCPSchema.optional(),\n context: ContextSchema.optional(),\n includes: z.array(z.string()).optional(),\n environments: z.record(PromptAssetOverridesSchema).optional(),\n tiers: z.record(PromptAssetOverridesSchema).optional(),\n metadata: MetadataSchema.optional(),\n sections: z.object({\n system_instructions: z.string().optional(),\n }).optional(),\n});\n\nexport type PromptDefaults = z.infer<typeof PromptDefaultsSchema>;\n\n// --- Top-level PromptAsset ---\n\nexport const PromptAssetSchema = z.object({\n id: z.string(),\n schema_version: z.number().int().positive().default(1),\n description: z.string().optional(),\n\n provider: z.enum(['openai', 'openai-responses', 'anthropic', 'google', 'gemini', 'openrouter', 'llmasaservice', 'any']).optional(),\n model: z.string().optional(),\n fallback_models: z.array(z.string()).optional(),\n\n reasoning: ReasoningSchema.optional(),\n sampling: SamplingSchema.optional(),\n response: ResponseSchemaWithValidation.optional(),\n cache: CacheSchema.optional(),\n raw: RawProviderBodySchema.optional(),\n\n tools: z.array(ToolRefSchema).optional(),\n provider_options: ProviderOptionsSchema.optional(),\n mcp: MCPSchema.optional(),\n\n context: ContextSchema.optional(),\n\n includes: z.array(z.string()).optional(),\n\n environments: z.record(PromptAssetOverridesSchema).optional(),\n tiers: z.record(PromptAssetOverridesSchema).optional(),\n\n metadata: MetadataSchema.optional(),\n\n // Populated by parser, not authored in YAML\n sections: SectionsSchema.optional(),\n source: SourceSchema.optional(),\n});\n\nexport type PromptAsset = z.infer<typeof PromptAssetSchema>;\n\n// --- Resolved asset (after includes, overrides applied) ---\n\nexport interface ResolvedPromptAsset extends PromptAsset {\n sections: {\n system_instructions?: string;\n prompt_template?: string;\n notes?: string;\n };\n source: {\n file_path?: string;\n checksum?: string;\n };\n}\n","const FRONT_MATTER_DELIMITER = /^---[ \\t]*$/;\nconst REGEX_FIELD = /^(?<indent>\\s*)(?<field>allow_regex|deny_regex)\\s*:\\s*(?<value>.*)$/;\nconst PATTERN_FIELD = /^(?<indent>\\s*)pattern\\s*:\\s*(?<value>.*)$/;\nconst INLINE_PATTERN_FIELD = /(?:^|[{,]\\s*)pattern\\s*:\\s*(?<value>\"(?:\\\\.|[^\"\\\\])*\")/;\n\ninterface PendingRegexField {\n field: string;\n indent: number;\n}\n\nexport function assertRegexFrontMatterQuoting(content: string, filePath?: string): void {\n const frontMatter = extractFrontMatter(content);\n if (!frontMatter) {\n return;\n }\n\n let pendingRegex: PendingRegexField | undefined;\n\n for (const [index, line] of frontMatter.lines.entries()) {\n const lineNumber = frontMatter.startLine + index;\n const regexMatch = line.match(REGEX_FIELD);\n\n if (regexMatch?.groups) {\n const field = regexMatch.groups.field;\n const indent = regexMatch.groups.indent.length;\n const value = regexMatch.groups.value.trim();\n pendingRegex = value === '' ? { field, indent } : undefined;\n\n assertNoUnescapedBackslashInDoubleQuotedRegex(value, field, filePath, lineNumber);\n assertNoUnescapedBackslashInInlinePattern(value, field, filePath, lineNumber);\n continue;\n }\n\n if (!pendingRegex) {\n continue;\n }\n\n if (line.trim() === '' || line.trimStart().startsWith('#')) {\n continue;\n }\n\n const indent = line.match(/^\\s*/)?.[0].length ?? 0;\n if (indent <= pendingRegex.indent) {\n pendingRegex = undefined;\n continue;\n }\n\n const patternMatch = line.match(PATTERN_FIELD);\n if (!patternMatch?.groups) {\n continue;\n }\n\n assertNoUnescapedBackslashInDoubleQuotedRegex(\n patternMatch.groups.value.trim(),\n `${pendingRegex.field}.pattern`,\n filePath,\n lineNumber,\n );\n }\n}\n\nfunction assertNoUnescapedBackslashInInlinePattern(\n value: string,\n field: string,\n filePath: string | undefined,\n lineNumber: number,\n): void {\n const match = value.match(INLINE_PATTERN_FIELD);\n const pattern = match?.groups?.value;\n if (!pattern) {\n return;\n }\n\n assertNoUnescapedBackslashInDoubleQuotedRegex(pattern, `${field}.pattern`, filePath, lineNumber);\n}\n\nfunction extractFrontMatter(content: string): { lines: string[]; startLine: number } | undefined {\n const lines = content.split(/\\r?\\n/);\n if (!FRONT_MATTER_DELIMITER.test(lines[0] ?? '')) {\n return undefined;\n }\n\n for (let index = 1; index < lines.length; index += 1) {\n if (FRONT_MATTER_DELIMITER.test(lines[index] ?? '')) {\n return {\n lines: lines.slice(1, index),\n startLine: 2,\n };\n }\n }\n\n return undefined;\n}\n\nfunction assertNoUnescapedBackslashInDoubleQuotedRegex(\n value: string,\n field: string,\n filePath: string | undefined,\n lineNumber: number,\n): void {\n if (!value.startsWith('\"')) {\n return;\n }\n\n const quoted = readDoubleQuotedScalar(value);\n if (!quoted) {\n return;\n }\n\n if (!hasUnescapedBackslash(quoted)) {\n return;\n }\n\n const location = filePath ? `${filePath}:${lineNumber}` : `line ${lineNumber}`;\n throw new Error(\n `POK013: Invalid context regex YAML at ${location}, field \"${field}\": `\n + 'double-quoted regex strings treat backslashes as YAML escapes. '\n + 'Use unquoted /pattern/i literal form, single quotes, or double each backslash.',\n );\n}\n\nfunction readDoubleQuotedScalar(value: string): string | undefined {\n let result = '';\n\n for (let index = 1; index < value.length; index += 1) {\n const char = value[index];\n\n if (char === '\"') {\n return result;\n }\n\n result += char;\n\n if (char === '\\\\' && index + 1 < value.length) {\n index += 1;\n result += value[index];\n }\n }\n\n return undefined;\n}\n\nfunction hasUnescapedBackslash(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n if (value[index] !== '\\\\') {\n continue;\n }\n\n let count = 1;\n while (value[index + count] === '\\\\') {\n count += 1;\n }\n\n if (count % 2 === 1) {\n return true;\n }\n\n index += count - 1;\n }\n\n return false;\n}\n","export interface Sections {\n system_instructions?: string;\n prompt_template?: string;\n notes?: string;\n}\n\nconst SECTION_MAP: Record<string, keyof Sections> = {\n 'system instructions': 'system_instructions',\n 'prompt template': 'prompt_template',\n 'notes': 'notes',\n};\n\n/**\n * Extract named sections from the markdown body using H1 headings.\n * Case-insensitive. H2+ within a section is treated as content.\n * If no H1 headings are found, the entire body is treated as prompt_template.\n */\nexport function extractSections(body: string): Sections {\n const lines = body.split(/\\r?\\n/);\n const sections: Sections = {};\n\n let currentKey: keyof Sections | null = null;\n let currentLines: string[] = [];\n let foundAnyH1 = false;\n\n for (const line of lines) {\n const h1Match = line.match(/^#\\s+(.+)$/);\n if (h1Match) {\n // Flush previous section\n if (currentKey) {\n sections[currentKey] = currentLines.join('\\n').trim();\n }\n\n foundAnyH1 = true;\n const heading = h1Match[1].trim().toLowerCase();\n currentKey = SECTION_MAP[heading] ?? null;\n currentLines = [];\n } else {\n currentLines.push(line);\n }\n }\n\n // Flush last section\n if (currentKey) {\n sections[currentKey] = currentLines.join('\\n').trim();\n }\n\n // If no H1 headings found, treat entire body as prompt_template\n if (!foundAnyH1) {\n const trimmed = body.trim();\n if (trimmed) {\n sections.prompt_template = trimmed;\n }\n }\n\n return sections;\n}\n","import { readFile } from 'node:fs/promises';\nimport { dirname, join, relative, resolve } from 'node:path';\nimport matter from 'gray-matter';\nimport { parsePrompt } from './parser.js';\nimport type { ParseResult } from './parser.js';\nimport { extractSections } from './sections.js';\nimport { PromptDefaultsSchema } from '../schema/index.js';\nimport type { PromptDefaults } from '../schema/index.js';\nimport { resolveResponseSchemaRef } from './response-schema-ref.js';\n\nconst DEFAULTS_FILE_NAME = 'defaults.md';\n\nexport interface LoadPromptOptions {\n /**\n * Optional boundary directory for defaults discovery.\n * If provided, defaults are loaded from this directory down to the prompt directory.\n */\n defaultsRoot?: string;\n}\n\n/**\n * Load and parse a prompt file from disk.\n */\nexport async function loadPromptFile(filePath: string, options: LoadPromptOptions = {}): Promise<ParseResult> {\n const content = await readFile(filePath, 'utf-8');\n const parsed = parsePrompt(content, filePath);\n // Default the boundary to the file's own directory so traversal never\n // walks above the prompt tree when no explicit root is provided.\n const root = options.defaultsRoot ?? dirname(filePath);\n const defaults = await loadDefaultsForPath(filePath, root);\n const withDefaults = applyDefaults(parsed.asset, defaults);\n const resolved = await resolveResponseSchemaRef(withDefaults, filePath);\n const asset = (resolved.response?.schema !== undefined && !resolved.response?.schema_source)\n ? {\n ...resolved,\n response: {\n ...resolved.response,\n schema_source: { mode: 'inline' as const },\n },\n }\n : resolved;\n\n return {\n ...parsed,\n asset,\n };\n}\n\nasync function loadDefaultsForPath(filePath: string, defaultsRoot?: string): Promise<PromptDefaults> {\n const directories = getDirectoriesToCheck(filePath, defaultsRoot);\n let merged: PromptDefaults = {};\n\n for (const dir of directories) {\n const defaultsPath = join(dir, DEFAULTS_FILE_NAME);\n try {\n const defaultsContent = await readFile(defaultsPath, 'utf-8');\n const defaults = normalizeDefaultIncludes(parseDefaults(defaultsContent), defaultsPath, filePath);\n merged = mergeDefaults(merged, defaults);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n }\n\n return merged;\n}\n\nfunction getDirectoriesToCheck(filePath: string, defaultsRoot?: string): string[] {\n const dirs: string[] = [];\n let current = resolve(dirname(filePath));\n const boundary = defaultsRoot ? resolve(defaultsRoot) : undefined;\n\n while (true) {\n dirs.unshift(current);\n if ((boundary && current === boundary) || current === dirname(current)) {\n break;\n }\n current = dirname(current);\n }\n\n return dirs;\n}\n\nfunction parseDefaults(content: string): PromptDefaults {\n const { data: frontMatter, content: body } = matter(content);\n const sections = extractSections(body);\n\n return PromptDefaultsSchema.parse({\n ...frontMatter,\n sections: {\n system_instructions: sections.system_instructions,\n },\n });\n}\n\nfunction mergeDefaults(base: PromptDefaults, local: PromptDefaults): PromptDefaults {\n return {\n provider: local.provider ?? base.provider,\n model: local.model ?? base.model,\n fallback_models: local.fallback_models ?? base.fallback_models,\n reasoning: mergeRecordBlock(base.reasoning, local.reasoning),\n sampling: mergeRecordBlock(base.sampling, local.sampling),\n response: mergeRecordBlock(base.response, local.response),\n cache: mergeCache(base.cache, local.cache),\n raw: mergeRaw(base.raw, local.raw),\n tools: local.tools ?? base.tools,\n provider_options: mergeProviderOptions(base.provider_options, local.provider_options),\n mcp: mergeMcp(base.mcp, local.mcp),\n context: mergeContext(base.context, local.context),\n includes: local.includes ?? base.includes,\n environments: mergeOverrideMap(base.environments, local.environments),\n tiers: mergeOverrideMap(base.tiers, local.tiers),\n metadata: {\n ...(base.metadata ?? {}),\n ...(local.metadata ?? {}),\n },\n sections: {\n ...(base.sections ?? {}),\n ...(local.sections ?? {}),\n },\n };\n}\n\nfunction applyDefaults(asset: ParseResult['asset'], defaults: PromptDefaults): ParseResult['asset'] {\n const cache = mergeCache(defaults.cache, asset.cache);\n const raw = mergeRaw(defaults.raw, asset.raw);\n const providerOptions = mergeProviderOptions(defaults.provider_options, asset.provider_options);\n const reasoning = mergeRecordBlock(defaults.reasoning, asset.reasoning);\n const sampling = mergeRecordBlock(defaults.sampling, asset.sampling);\n const response = mergeRecordBlock(defaults.response, asset.response);\n const mcp = mergeMcp(defaults.mcp, asset.mcp);\n const context = mergeContext(defaults.context, asset.context);\n const environments = mergeOverrideMap(defaults.environments, asset.environments);\n const tiers = mergeOverrideMap(defaults.tiers, asset.tiers);\n const hasDefaultMetadata = defaults.metadata && Object.keys(defaults.metadata).length > 0;\n const hasDefaultSystem = !!defaults.sections?.system_instructions;\n const hasDefaultScalars = defaults.provider !== undefined\n || defaults.model !== undefined\n || defaults.fallback_models !== undefined\n || defaults.tools !== undefined\n || defaults.includes !== undefined;\n const hasDefaultObjects = cache !== undefined\n || raw !== undefined\n || providerOptions !== undefined\n || reasoning !== undefined\n || sampling !== undefined\n || response !== undefined\n || mcp !== undefined\n || context !== undefined\n || environments !== undefined\n || tiers !== undefined;\n\n // Short-circuit: nothing to merge\n if (!hasDefaultMetadata && !hasDefaultSystem && !hasDefaultScalars && !hasDefaultObjects) {\n return asset;\n }\n\n const mergedMetadata = {\n ...(defaults.metadata ?? {}),\n ...(asset.metadata ?? {}),\n };\n const metadata = Object.keys(mergedMetadata).length > 0 ? mergedMetadata : undefined;\n\n const systemInstructions = asset.sections?.system_instructions ?? defaults.sections?.system_instructions;\n\n const sections = asset.sections\n ? { ...asset.sections, system_instructions: systemInstructions }\n : systemInstructions\n ? { system_instructions: systemInstructions }\n : undefined;\n\n return {\n ...asset,\n provider: asset.provider ?? defaults.provider,\n model: asset.model ?? defaults.model,\n fallback_models: asset.fallback_models ?? defaults.fallback_models,\n reasoning,\n sampling,\n response,\n cache,\n raw,\n tools: asset.tools ?? defaults.tools,\n provider_options: providerOptions,\n mcp,\n context,\n includes: asset.includes ?? defaults.includes,\n environments,\n tiers,\n metadata,\n sections,\n };\n}\n\nfunction normalizeDefaultIncludes(\n defaults: PromptDefaults,\n defaultsPath: string,\n filePath: string,\n): PromptDefaults {\n if (!defaults.includes) return defaults;\n\n const promptDir = dirname(filePath);\n const defaultsDir = dirname(defaultsPath);\n const includes = defaults.includes.map((includePath) => {\n const relativePath = relative(promptDir, resolve(defaultsDir, includePath)).replace(/\\\\/g, '/');\n return relativePath.startsWith('.') ? relativePath : `./${relativePath}`;\n });\n\n return {\n ...defaults,\n includes,\n };\n}\n\nfunction mergeRecordBlock<T extends object>(base: T | undefined, local: T | undefined): T | undefined {\n if (base === undefined) return local;\n if (local === undefined) return base;\n return { ...base, ...local };\n}\n\nfunction mergeMcp(base: PromptDefaults['mcp'], local: PromptDefaults['mcp']): PromptDefaults['mcp'] {\n return mergeRecordBlock(base, local);\n}\n\nfunction mergeContext(base: PromptDefaults['context'], local: PromptDefaults['context']): PromptDefaults['context'] {\n const merged = {\n ...(base ?? {}),\n ...(local ?? {}),\n history: mergeRecordBlock(base?.history, local?.history),\n };\n\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\nfunction mergeCache(base: PromptDefaults['cache'], local: PromptDefaults['cache']): PromptDefaults['cache'] {\n const merged: NonNullable<PromptDefaults['cache']> = {\n ...(base ?? {}),\n ...(local ?? {}),\n openai: {\n ...(base?.openai ?? {}),\n ...(local?.openai ?? {}),\n },\n anthropic: {\n ...(base?.anthropic ?? {}),\n ...(local?.anthropic ?? {}),\n },\n gemini: {\n ...(base?.gemini ?? {}),\n ...(local?.gemini ?? {}),\n },\n google: {\n ...(base?.google ?? {}),\n ...(local?.google ?? {}),\n },\n };\n\n if (merged.openai && Object.keys(merged.openai).length === 0) delete merged.openai;\n if (merged.anthropic && Object.keys(merged.anthropic).length === 0) delete merged.anthropic;\n if (merged.gemini && Object.keys(merged.gemini).length === 0) delete merged.gemini;\n if (merged.google && Object.keys(merged.google).length === 0) delete merged.google;\n\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\nfunction mergeRaw(base: PromptDefaults['raw'], local: PromptDefaults['raw']): PromptDefaults['raw'] {\n const merged: NonNullable<PromptDefaults['raw']> = {\n ...(base ?? {}),\n ...(local ?? {}),\n openai: mergeRecordBlock(base?.openai, local?.openai),\n 'openai-responses': mergeRecordBlock(base?.['openai-responses'], local?.['openai-responses']),\n openai_responses: mergeRecordBlock(base?.openai_responses, local?.openai_responses),\n anthropic: mergeRecordBlock(base?.anthropic, local?.anthropic),\n gemini: mergeRecordBlock(base?.gemini, local?.gemini),\n google: mergeRecordBlock(base?.google, local?.google),\n openrouter: mergeRecordBlock(base?.openrouter, local?.openrouter),\n llmasaservice: mergeRecordBlock(base?.llmasaservice, local?.llmasaservice),\n };\n\n removeEmptyProviderBlocks(merged);\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\nfunction mergeProviderOptions(\n base: PromptDefaults['provider_options'],\n local: PromptDefaults['provider_options'],\n): PromptDefaults['provider_options'] {\n const merged: NonNullable<PromptDefaults['provider_options']> = {\n ...(base ?? {}),\n ...(local ?? {}),\n anthropic: mergeRecordBlock(base?.anthropic, local?.anthropic),\n gemini: mergeRecordBlock(base?.gemini, local?.gemini),\n openrouter: mergeRecordBlock(base?.openrouter, local?.openrouter),\n llmasaservice: mergeRecordBlock(base?.llmasaservice, local?.llmasaservice),\n };\n\n removeEmptyProviderBlocks(merged);\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\nfunction mergeOverrideMap(\n base: PromptDefaults['environments'],\n local: PromptDefaults['environments'],\n): PromptDefaults['environments'] {\n const merged: NonNullable<PromptDefaults['environments']> = { ...(base ?? {}) };\n\n for (const [name, localOverride] of Object.entries(local ?? {})) {\n merged[name] = mergeOverrideConfig(merged[name], localOverride);\n }\n\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\nfunction mergeOverrideConfig(\n base: NonNullable<PromptDefaults['environments']>[string] | undefined,\n local: NonNullable<PromptDefaults['environments']>[string],\n): NonNullable<PromptDefaults['environments']>[string] {\n const merged: NonNullable<PromptDefaults['environments']>[string] = {\n ...(base ?? {}),\n ...local,\n };\n\n const reasoning = mergeRecordBlock(base?.reasoning, local.reasoning);\n const sampling = mergeRecordBlock(base?.sampling, local.sampling);\n const response = mergeRecordBlock(base?.response, local.response);\n const cache = mergeCache(base?.cache, local.cache);\n const raw = mergeRaw(base?.raw, local.raw);\n const providerOptions = mergeProviderOptions(base?.provider_options, local.provider_options);\n\n if (reasoning !== undefined) merged.reasoning = reasoning;\n if (sampling !== undefined) merged.sampling = sampling;\n if (response !== undefined) merged.response = response;\n if (cache !== undefined) merged.cache = cache;\n if (raw !== undefined) merged.raw = raw;\n if (providerOptions !== undefined) merged.provider_options = providerOptions;\n\n return merged;\n}\n\nfunction removeEmptyProviderBlocks<T extends Record<string, unknown>>(value: T): void {\n for (const key of Object.keys(value)) {\n const block = value[key];\n if (block === undefined) {\n delete value[key];\n continue;\n }\n\n if (\n block !== null\n &&\n typeof block === 'object'\n && !Array.isArray(block)\n && Object.keys(block).length === 0\n ) {\n delete value[key];\n }\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport { createHash } from 'node:crypto';\nimport { dirname, extname, resolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { z } from 'zod';\nimport { zodToJsonSchema } from 'zod-to-json-schema';\nimport type { PromptAsset } from '../schema/index.js';\n\nconst SUPPORTED_SCHEMA_REF_EXTENSIONS = new Set(['.json', '.js', '.mjs', '.cjs']);\n\n\nasync function resolveJsonSchemaRef(schemaRef: string, promptFilePath: string): Promise<{ schema: Record<string, unknown>; resolvedPath: string; hash: string }> {\n const resolvedPath = resolve(dirname(promptFilePath), schemaRef);\n let raw: string;\n\n try {\n raw = await readFile(resolvedPath, 'utf-8');\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') {\n throw new Error(`POK050: response.schema_ref \"${schemaRef}\" not found (resolved from ${promptFilePath})`);\n }\n throw error;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(`POK050: response.schema_ref \"${schemaRef}\" is not valid JSON`);\n }\n\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error(`POK050: response.schema_ref \"${schemaRef}\" must resolve to a JSON object schema`);\n }\n\n return {\n schema: parsed as Record<string, unknown>,\n resolvedPath,\n hash: createHash('sha256').update(raw).digest('hex'),\n };\n}\n\nasync function resolveZodSchemaRef(schemaRef: string, promptFilePath: string): Promise<{ schema: Record<string, unknown>; resolvedPath: string; hash: string }> {\n const resolvedPath = resolve(dirname(promptFilePath), schemaRef);\n\n let moduleSource: string;\n try {\n moduleSource = await readFile(resolvedPath, 'utf-8');\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') {\n throw new Error(`POK051: response.schema_ref \"${schemaRef}\" not found (resolved from ${promptFilePath})`);\n }\n throw error;\n }\n\n let imported: unknown;\n try {\n imported = await import(pathToFileURL(resolvedPath).href);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`POK051: response.schema_ref \"${schemaRef}\" could not be imported as a module (${message})`);\n }\n\n const mod = imported as Record<string, unknown>;\n const candidate = mod.default ?? mod.schema;\n\n if (!(candidate instanceof z.ZodType)) {\n throw new Error('POK051: zod schema modules must export a Zod schema as default export or named export \"schema\"');\n }\n\n const jsonSchema = zodToJsonSchema(candidate, {\n target: 'jsonSchema7',\n $refStrategy: 'none',\n });\n\n if (!jsonSchema || typeof jsonSchema !== 'object' || Array.isArray(jsonSchema)) {\n throw new Error(`POK051: response.schema_ref \"${schemaRef}\" did not produce a valid JSON schema object`);\n }\n\n return {\n schema: jsonSchema as Record<string, unknown>,\n resolvedPath,\n hash: createHash('sha256').update(moduleSource).digest('hex'),\n };\n}\n\nexport async function resolveResponseSchemaRef(asset: PromptAsset, promptFilePath: string): Promise<PromptAsset> {\n const schemaRef = asset.response?.schema_ref;\n if (!schemaRef) return asset;\n\n const ext = extname(schemaRef).toLowerCase();\n if (!SUPPORTED_SCHEMA_REF_EXTENSIONS.has(ext)) {\n throw new Error(`POK051: response.schema_ref \"${schemaRef}\" has unsupported extension \"${ext}\". Use .json, .js, .mjs, or .cjs`);\n }\n\n const resolved = (ext === '.json')\n ? await resolveJsonSchemaRef(schemaRef, promptFilePath)\n : await resolveZodSchemaRef(schemaRef, promptFilePath);\n\n return {\n ...asset,\n response: {\n ...asset.response,\n schema: resolved.schema,\n schema_ref: undefined,\n schema_source: {\n mode: ext === '.json' ? 'schema_ref_json' : 'schema_ref_zod_module',\n ref: schemaRef,\n resolved_path: resolved.resolvedPath,\n hash: resolved.hash,\n },\n },\n };\n}\n","export interface InterpolateOptions {\n strict?: boolean;\n optionalVariables?: Iterable<string>;\n}\n\nconst VARIABLE_RE = /\\{\\{\\s*([a-zA-Z_][a-zA-Z0-9_]*)\\s*\\}\\}/g;\nconst ESCAPED_OPEN = /\\\\\\{\\\\\\{/g;\nconst ESCAPE_PLACEHOLDER = '\\x00ESCAPED_OPEN\\x00';\n\n/**\n * Interpolate variables into a template string.\n *\n * Syntax: {{ variable_name }}\n * Escape: \\{\\{ produces literal {{\n *\n * In strict mode, throws on missing variables.\n * In permissive mode, leaves {{ placeholder }} intact.\n */\nexport function interpolate(\n template: string,\n variables: Record<string, string>,\n options: InterpolateOptions = {},\n): string {\n const { strict = false } = options;\n const optionalVariables = new Set(options.optionalVariables ?? []);\n\n // Replace escaped sequences with placeholder\n let result = template.replace(ESCAPED_OPEN, ESCAPE_PLACEHOLDER);\n\n result = result.replace(VARIABLE_RE, (match, name: string) => {\n if (name in variables) {\n return variables[name];\n }\n if (strict && !optionalVariables.has(name)) {\n throw new Error(`Missing required variable: \"${name}\"`);\n }\n return match; // leave placeholder intact in permissive mode\n });\n\n // Restore escaped sequences\n result = result.replaceAll(ESCAPE_PLACEHOLDER, '{{');\n\n return result;\n}\n\n/**\n * Extract all variable names referenced in a template.\n */\nexport function extractVariables(template: string): string[] {\n const vars = new Set<string>();\n let match: RegExpExecArray | null;\n const re = new RegExp(VARIABLE_RE.source, 'g');\n while ((match = re.exec(template)) !== null) {\n vars.add(match[1]);\n }\n return [...vars];\n}\n","import type {\n PromptAsset,\n ResolvedPromptAsset,\n ContextBuiltInValidatorDefinition,\n ContextInputDefinition,\n ContextRegexDefinition,\n} from './schema/index.js';\n\nexport interface ContextValidationShortCircuit {\n returnMessage: string;\n code: 'POK031' | 'POK032' | 'POK033' | 'POK034';\n variable: string;\n field: 'allow_regex' | 'deny_regex' | 'non_empty' | 'reject_secrets';\n}\n\nexport interface SanitizedContextVariablesResult {\n variables: Record<string, string>;\n shortCircuit?: ContextValidationShortCircuit;\n}\n\nexport interface NormalizedContextRegex {\n pattern: string;\n flags: string;\n raw: string;\n invalidLiteral?: boolean;\n returnMessage?: string;\n}\n\nexport interface NormalizedContextBuiltInValidator {\n returnMessage?: string;\n}\n\nexport interface NormalizedContextInput {\n name: string;\n optional?: boolean;\n warnings?: boolean;\n max_size?: number;\n trim?: boolean | 'start' | 'end' | 'both';\n allow_regex?: NormalizedContextRegex;\n deny_regex?: NormalizedContextRegex;\n non_empty?: NormalizedContextBuiltInValidator;\n reject_secrets?: NormalizedContextBuiltInValidator;\n}\n\nexport interface ContextSizeWarning {\n variable: string;\n maxSize: number;\n actualSize: number;\n}\n\nexport interface ContextOverflowInfo {\n promptId: string;\n variable: string;\n value: string;\n maxSize: number;\n actualSize: number;\n}\n\nexport interface SanitizeContextOptions {\n onContextOverflow?: (info: ContextOverflowInfo) => string;\n}\n\nconst textEncoder = new TextEncoder();\nconst REJECT_SECRETS_PATTERN = '(secret|api[_-]?key|password)';\nconst REJECT_SECRETS_FLAGS = 'i';\n\nexport function getContextInputs(\n asset: Pick<PromptAsset | ResolvedPromptAsset, 'context'>,\n): NormalizedContextInput[] {\n return (asset.context?.inputs ?? []).map(normalizeContextInput);\n}\n\nexport function getContextInputNames(\n asset: Pick<PromptAsset | ResolvedPromptAsset, 'context'>,\n): string[] {\n return getContextInputs(asset).map((input) => input.name);\n}\n\nexport function normalizeContextInput(input: ContextInputDefinition): NormalizedContextInput {\n if (typeof input === 'string') {\n return { name: input };\n }\n\n return {\n name: input.name,\n optional: input.optional,\n warnings: input.warnings,\n max_size: input.max_size,\n trim: input.trim,\n allow_regex: normalizeContextRegex(input.allow_regex),\n deny_regex: normalizeContextRegex(input.deny_regex),\n non_empty: normalizeBuiltInValidator(input.non_empty),\n reject_secrets: normalizeBuiltInValidator(input.reject_secrets),\n };\n}\n\nexport function areContextInputWarningsEnabled(input: Pick<NormalizedContextInput, 'warnings'>): boolean {\n return input.warnings !== false;\n}\n\nexport function normalizeContextRegex(\n value: ContextRegexDefinition | undefined,\n): NormalizedContextRegex | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value === 'string') {\n const literal = parseRegexLiteral(value);\n if (value.startsWith('/') && !literal) {\n return {\n pattern: value,\n flags: '',\n raw: value,\n invalidLiteral: true,\n };\n }\n\n return {\n pattern: literal?.pattern ?? value,\n flags: literal?.flags ?? '',\n raw: value,\n };\n }\n\n return {\n pattern: value.pattern,\n flags: value.flags ?? '',\n raw: JSON.stringify(value),\n returnMessage: value.return_message,\n };\n}\n\nexport function normalizeBuiltInValidator(\n value: ContextBuiltInValidatorDefinition | undefined,\n): NormalizedContextBuiltInValidator | undefined {\n if (value === undefined || value === false) {\n return undefined;\n }\n\n if (value === true) {\n return {};\n }\n\n return {\n returnMessage: value.return_message,\n };\n}\n\nfunction parseRegexLiteral(value: string): { pattern: string; flags: string } | undefined {\n if (!value.startsWith('/')) {\n return undefined;\n }\n\n for (let index = value.length - 1; index > 0; index -= 1) {\n if (value[index] !== '/') {\n continue;\n }\n\n let backslashCount = 0;\n for (let cursor = index - 1; cursor >= 0 && value[cursor] === '\\\\'; cursor -= 1) {\n backslashCount += 1;\n }\n\n if (backslashCount % 2 === 1) {\n continue;\n }\n\n return {\n pattern: value.slice(1, index),\n flags: value.slice(index + 1),\n };\n }\n\n return undefined;\n}\n\nexport function formatInvalidContextRegexMessage(details: {\n promptId: string;\n variable: string;\n field: string;\n raw: string;\n reason: string;\n}): string {\n return [\n `Invalid context regex for prompt \"${details.promptId}\"`,\n `variable \"${details.variable}\"`,\n `field \"${details.field}\"`,\n `value ${JSON.stringify(details.raw)}: ${details.reason}`,\n ].join(', ');\n}\n\nexport function compileContextRegex(\n regex: NormalizedContextRegex,\n details: { promptId: string; variable: string; field: string },\n): RegExp {\n if (regex.invalidLiteral) {\n throw new Error(\n `POK013: ${formatInvalidContextRegexMessage({\n ...details,\n raw: regex.raw,\n reason: 'Malformed regex literal. Use /pattern/flags or { pattern, flags }.',\n })}`,\n );\n }\n\n try {\n return new RegExp(regex.pattern, regex.flags);\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(`POK013: ${formatInvalidContextRegexMessage({ ...details, raw: regex.raw, reason })}`);\n }\n}\n\nfunction getRejectSecretsRegex(): NormalizedContextRegex {\n return {\n pattern: REJECT_SECRETS_PATTERN,\n flags: REJECT_SECRETS_FLAGS,\n raw: JSON.stringify({ pattern: REJECT_SECRETS_PATTERN, flags: REJECT_SECRETS_FLAGS }),\n };\n}\n\ntype TrimMode = boolean | 'start' | 'end' | 'both';\n\nfunction isTrimEnabled(mode: TrimMode | undefined): mode is true | 'start' | 'end' | 'both' {\n return mode === true || mode === 'start' || mode === 'end' || mode === 'both';\n}\n\nfunction normalizeTrimMode(mode: TrimMode): 'start' | 'end' {\n if (mode === 'start') {\n return 'start';\n }\n return 'end';\n}\n\nfunction trimToMaxSize(\n value: string,\n maxSize: number,\n mode: TrimMode,\n): string {\n const measured = measureContextValueSize(value);\n if (measured <= maxSize) {\n return value;\n }\n\n const characters = Array.from(value);\n const normalizedMode = normalizeTrimMode(mode);\n\n if (normalizedMode === 'start') {\n let collected = '';\n let size = 0;\n for (let i = characters.length - 1; i >= 0; i -= 1) {\n const next = characters[i];\n const charSize = measureContextValueSize(next);\n if (size + charSize > maxSize) {\n break;\n }\n collected = next + collected;\n size += charSize;\n }\n return collected;\n }\n\n let collected = '';\n let size = 0;\n for (const char of characters) {\n const charSize = measureContextValueSize(char);\n if (size + charSize > maxSize) {\n break;\n }\n collected += char;\n size += charSize;\n }\n return collected;\n}\n\nexport function sanitizeContextVariables(\n asset: Pick<PromptAsset | ResolvedPromptAsset, 'context' | 'id'>,\n variables: Record<string, string> = {},\n options: SanitizeContextOptions = {},\n): SanitizedContextVariablesResult {\n const { onContextOverflow } = options;\n const sanitized = { ...variables };\n\n for (const input of getContextInputs(asset)) {\n const value = sanitized[input.name];\n if (value === undefined) {\n continue;\n }\n\n let candidate = value;\n\n if (input.max_size !== undefined) {\n const actualSize = measureContextValueSize(candidate);\n if (actualSize > input.max_size && onContextOverflow) {\n candidate = onContextOverflow({\n promptId: asset.id,\n variable: input.name,\n value: candidate,\n maxSize: input.max_size,\n actualSize,\n });\n }\n }\n\n if (isTrimEnabled(input.trim) && input.max_size !== undefined) {\n candidate = trimToMaxSize(candidate, input.max_size, input.trim);\n }\n\n sanitized[input.name] = candidate;\n\n if (input.allow_regex) {\n const candidate = sanitized[input.name];\n const matcher = compileContextRegex(input.allow_regex, {\n promptId: asset.id,\n variable: input.name,\n field: 'allow_regex',\n });\n if (!matcher.test(candidate)) {\n if (input.allow_regex.returnMessage) {\n return {\n variables: sanitized,\n shortCircuit: {\n returnMessage: input.allow_regex.returnMessage,\n code: 'POK031',\n variable: input.name,\n field: 'allow_regex',\n },\n };\n }\n\n throw new Error(\n `POK031: Context variable \"${input.name}\" failed allow_regex validation for prompt \"${asset.id}\".`,\n );\n }\n }\n\n if (input.deny_regex) {\n const candidate = sanitized[input.name];\n const matcher = compileContextRegex(input.deny_regex, {\n promptId: asset.id,\n variable: input.name,\n field: 'deny_regex',\n });\n if (matcher.test(candidate)) {\n if (input.deny_regex.returnMessage) {\n return {\n variables: sanitized,\n shortCircuit: {\n returnMessage: input.deny_regex.returnMessage,\n code: 'POK032',\n variable: input.name,\n field: 'deny_regex',\n },\n };\n }\n\n throw new Error(\n `POK032: Context variable \"${input.name}\" matched deny_regex for prompt \"${asset.id}\".`,\n );\n }\n }\n\n if (input.non_empty && candidate.trim().length === 0) {\n if (input.non_empty.returnMessage) {\n return {\n variables: sanitized,\n shortCircuit: {\n returnMessage: input.non_empty.returnMessage,\n code: 'POK033',\n variable: input.name,\n field: 'non_empty',\n },\n };\n }\n\n throw new Error(\n `POK033: Context variable \"${input.name}\" failed non_empty validation for prompt \"${asset.id}\".`,\n );\n }\n\n if (input.reject_secrets) {\n const matcher = compileContextRegex(getRejectSecretsRegex(), {\n promptId: asset.id,\n variable: input.name,\n field: 'reject_secrets',\n });\n if (matcher.test(candidate)) {\n if (input.reject_secrets.returnMessage) {\n return {\n variables: sanitized,\n shortCircuit: {\n returnMessage: input.reject_secrets.returnMessage,\n code: 'POK034',\n variable: input.name,\n field: 'reject_secrets',\n },\n };\n }\n\n throw new Error(\n `POK034: Context variable \"${input.name}\" matched reject_secrets validation for prompt \"${asset.id}\".`,\n );\n }\n }\n }\n\n return { variables: sanitized };\n}\n\nexport function measureContextValueSize(value: string): number {\n return textEncoder.encode(value).length;\n}\n\nexport function collectContextSizeWarnings(\n asset: Pick<PromptAsset | ResolvedPromptAsset, 'context'>,\n variables: Record<string, string> = {},\n): ContextSizeWarning[] {\n const warnings: ContextSizeWarning[] = [];\n\n for (const input of getContextInputs(asset)) {\n if (!areContextInputWarningsEnabled(input)) {\n continue;\n }\n\n if (input.max_size === undefined) {\n continue;\n }\n\n const value = variables[input.name];\n if (value === undefined) {\n continue;\n }\n\n const actualSize = measureContextValueSize(value);\n if (actualSize > input.max_size) {\n warnings.push({\n variable: input.name,\n maxSize: input.max_size,\n actualSize,\n });\n }\n }\n\n return warnings;\n}\n","import { readFile } from 'node:fs/promises';\nimport { resolve, dirname } from 'node:path';\nimport { parsePrompt } from '../parser/index.js';\nimport type { PromptAsset } from '../schema/index.js';\n\n/**\n * Resolve includes for a prompt asset, inlining content from referenced files.\n * Detects and rejects circular includes.\n */\nexport async function resolveIncludes(\n asset: PromptAsset,\n basePath: string,\n visited: Set<string> = new Set(),\n): Promise<PromptAsset> {\n if (!asset.includes || asset.includes.length === 0) {\n return asset;\n }\n\n const baseDir = dirname(basePath);\n const resolvedPath = resolve(basePath);\n\n if (visited.has(resolvedPath)) {\n throw new Error(`Circular include detected: ${resolvedPath}`);\n }\n visited.add(resolvedPath);\n\n let mergedSystemInstructions = '';\n\n for (const includePath of asset.includes) {\n const fullPath = resolve(baseDir, includePath);\n\n if (visited.has(fullPath)) {\n throw new Error(`Circular include detected: ${fullPath} (included from ${basePath})`);\n }\n\n const content = await readFile(fullPath, 'utf-8');\n const { asset: includedAsset } = parsePrompt(content, fullPath);\n\n // Recursively resolve nested includes\n const resolved = await resolveIncludes(includedAsset, fullPath, new Set(visited));\n\n // Append included system instructions before local ones\n if (resolved.sections?.system_instructions) {\n mergedSystemInstructions += resolved.sections.system_instructions + '\\n\\n';\n }\n }\n\n // Prepend included system instructions before the local ones\n const localSystem = asset.sections?.system_instructions ?? '';\n const combinedSystem = (mergedSystemInstructions + localSystem).trim() || undefined;\n\n return {\n ...asset,\n sections: {\n ...asset.sections,\n system_instructions: combinedSystem,\n },\n // Drop includes from the resolved asset — they've been inlined\n includes: undefined,\n };\n}\n","/**\n * Compute the Levenshtein distance between two strings.\n * Used for \"did you mean?\" suggestions on unknown fields.\n */\nexport function levenshtein(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n\n if (m === 0) return n;\n if (n === 0) return m;\n\n const dp: number[][] = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0) as number[]);\n\n for (let i = 0; i <= m; i++) dp[i][0] = i;\n for (let j = 0; j <= n; j++) dp[0][j] = j;\n\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n dp[i][j] = Math.min(\n dp[i - 1][j] + 1,\n dp[i][j - 1] + 1,\n dp[i - 1][j - 1] + cost,\n );\n }\n }\n\n return dp[m][n];\n}\n","import { PromptAssetSchema } from '../schema/index.js';\nimport type { PromptAsset } from '../schema/index.js';\nimport { extractVariables } from '../renderer/index.js';\nimport { resolveIncludes } from '../composition/index.js';\nimport {\n areContextInputWarningsEnabled,\n compileContextRegex,\n getContextInputs,\n} from '../context.js';\nimport { levenshtein } from './levenshtein.js';\n\nexport interface ValidationError {\n code: string;\n message: string;\n filePath?: string;\n suggestion?: string;\n}\n\nexport interface PromptValidationResult {\n valid: boolean;\n errors: ValidationError[];\n warnings: ValidationError[];\n}\n\nconst KNOWN_FRONT_MATTER_KEYS = new Set([\n 'id', 'schema_version', 'description', 'provider', 'model', 'fallback_models',\n 'reasoning', 'sampling', 'response', 'tools', 'mcp', 'context', 'includes',\n 'environments', 'tiers', 'metadata', 'cache', 'provider_options', 'raw',\n]);\n\n\n\nfunction collectSchemaKeywords(value: unknown, acc: Set<string>): void {\n if (!value || typeof value !== 'object') return;\n if (Array.isArray(value)) {\n for (const item of value) collectSchemaKeywords(item, acc);\n return;\n }\n\n const record = value as Record<string, unknown>;\n for (const [key, child] of Object.entries(record)) {\n acc.add(key);\n collectSchemaKeywords(child, acc);\n }\n}\n\nconst RISKY_UNBOUNDED_INPUT_NAMES = [\n 'message',\n 'prompt',\n 'history',\n 'transcript',\n 'document',\n 'content',\n 'input',\n 'body',\n 'context',\n];\n\n/**\n * Validate a parsed prompt asset, returning all errors and warnings.\n */\nexport function validateAsset(\n asset: PromptAsset,\n frontMatterKeys?: string[],\n filePath?: string,\n): PromptValidationResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationError[] = [];\n\n // Schema validation\n const result = PromptAssetSchema.safeParse(asset);\n if (!result.success) {\n for (const issue of result.error.issues) {\n errors.push({\n code: 'POK001',\n message: `Schema error at ${issue.path.join('.')}: ${issue.message}`,\n filePath,\n });\n }\n }\n\n // Missing id\n if (!asset.id) {\n errors.push({\n code: 'POK002',\n message: 'Missing required field: \"id\"',\n filePath,\n });\n }\n\n // Missing body sections\n if (!asset.sections?.system_instructions && !asset.sections?.prompt_template) {\n errors.push({\n code: 'POK003',\n message: 'Prompt must have at least one body section (System instructions or Prompt template)',\n filePath,\n });\n }\n\n // Unknown front matter keys with \"did you mean?\"\n if (frontMatterKeys) {\n for (const key of frontMatterKeys) {\n if (!KNOWN_FRONT_MATTER_KEYS.has(key)) {\n const suggestion = findClosestMatch(key, KNOWN_FRONT_MATTER_KEYS);\n warnings.push({\n code: 'POK010',\n message: `Unknown front matter field: \"${key}\"`,\n filePath,\n suggestion: suggestion ? `Did you mean \"${suggestion}\"?` : undefined,\n });\n }\n }\n }\n\n // Variable validation: used but not declared\n const contextInputs = getContextInputs(asset);\n const declaredInputs = new Set(contextInputs.map((input) => input.name));\n const declaredInputsByName = new Map(contextInputs.map((input) => [input.name, input]));\n const usedVars = new Set<string>();\n\n if (asset.sections?.system_instructions) {\n for (const v of extractVariables(asset.sections.system_instructions)) {\n usedVars.add(v);\n }\n }\n if (asset.sections?.prompt_template) {\n for (const v of extractVariables(asset.sections.prompt_template)) {\n usedVars.add(v);\n }\n }\n\n for (const v of usedVars) {\n if (!declaredInputs.has(v)) {\n warnings.push({\n code: 'POK011',\n message: `Variable \"{{ ${v} }}\" is used but not declared in context.inputs`,\n filePath,\n });\n }\n }\n\n // Declared but unused\n for (const v of declaredInputs) {\n const input = declaredInputsByName.get(v);\n if (!usedVars.has(v) && input?.optional !== true && areContextInputWarningsEnabled(input ?? {})) {\n warnings.push({\n code: 'POK012',\n message: `Variable \"${v}\" is declared in context.inputs but never used`,\n filePath,\n });\n }\n }\n\n if (usedVars.size > 0 && (!asset.context?.inputs || asset.context.inputs.length === 0)) {\n warnings.push({\n code: 'POK046',\n message: `Template uses ${usedVars.size === 1 ? 'a variable' : 'variables'} but context.inputs is not declared.`,\n filePath,\n suggestion: 'Declare context.inputs to enable input policy validation.',\n });\n }\n\n // Context regex definitions compile successfully\n for (const input of contextInputs) {\n const lowerName = input.name.toLowerCase();\n const inputWarningsEnabled = areContextInputWarningsEnabled(input);\n\n if (\n inputWarningsEnabled\n && input.max_size === undefined\n && RISKY_UNBOUNDED_INPUT_NAMES.some((needle) => lowerName.includes(needle))\n ) {\n warnings.push({\n code: 'POK040',\n message: `Context input \"${input.name}\" has no max_size and appears unbounded.`,\n filePath,\n suggestion: 'Add max_size to constrain prompt payload growth.',\n });\n }\n\n if (\n inputWarningsEnabled\n && input.optional !== true\n && input.allow_regex === undefined\n && input.deny_regex === undefined\n && input.non_empty === undefined\n && input.reject_secrets === undefined\n ) {\n warnings.push({\n code: 'POK041',\n message: `Context input \"${input.name}\" has no input hardening validators.`,\n filePath,\n suggestion: 'Consider non_empty/reject_secrets and allow/deny regex validators.',\n });\n }\n\n if (inputWarningsEnabled && input.trim !== undefined && input.trim !== false && input.max_size === undefined) {\n warnings.push({\n code: 'POK014',\n message: `Context input \"${input.name}\" sets trim but has no max_size; trim-to-budget will be skipped.`,\n filePath,\n });\n }\n\n const checks: Array<{\n regex: NonNullable<typeof input.allow_regex>;\n kind: 'allow_regex' | 'deny_regex';\n }> = [];\n\n if (input.allow_regex) checks.push({ regex: input.allow_regex, kind: 'allow_regex' });\n if (input.deny_regex) checks.push({ regex: input.deny_regex, kind: 'deny_regex' });\n\n for (const check of checks) {\n try {\n compileContextRegex(check.regex, {\n promptId: asset.id,\n variable: input.name,\n field: check.kind,\n });\n } catch (error) {\n const reason = error instanceof Error ? error.message.replace(/^POK013:\\s*/, '') : String(error);\n errors.push({\n code: 'POK013',\n message: reason,\n filePath,\n });\n }\n }\n }\n\n\n if (asset.response?.schema && asset.provider) {\n const keywords = new Set<string>();\n collectSchemaKeywords(asset.response.schema, keywords);\n\n const openAIUnsupported = ['patternProperties', 'unevaluatedProperties', '$dynamicRef'];\n const geminiUnsupported = ['patternProperties', '$dynamicRef', 'dependentSchemas'];\n const anthropicCaution = ['if', 'then', 'else'];\n\n const checks: Array<{ provider: string[]; unsupported: string[]; code: string }> = [\n { provider: ['openai', 'openai-responses', 'openrouter', 'llmasaservice'], unsupported: openAIUnsupported, code: 'POK052' },\n { provider: ['gemini', 'google'], unsupported: geminiUnsupported, code: 'POK053' },\n { provider: ['anthropic'], unsupported: anthropicCaution, code: 'POK054' },\n ];\n\n for (const check of checks) {\n if (!check.provider.includes(asset.provider)) continue;\n const hits = check.unsupported.filter((k) => keywords.has(k));\n if (hits.length > 0) {\n warnings.push({\n code: check.code,\n message: `response.schema includes provider-sensitive JSON Schema keywords for \"${asset.provider}\": ${hits.join(', ')}`,\n filePath,\n suggestion: 'Validate schema compatibility with your provider docs or simplify the schema dialect.',\n });\n }\n }\n }\n\n if (asset.provider) {\n let providerCache: unknown;\n let cacheSuggestionField: string | undefined;\n\n switch (asset.provider) {\n case 'openai':\n providerCache = asset.cache?.openai;\n cacheSuggestionField = 'cache.openai';\n break;\n case 'anthropic':\n providerCache = asset.cache?.anthropic;\n cacheSuggestionField = 'cache.anthropic';\n break;\n case 'gemini':\n case 'google':\n providerCache = asset.cache?.gemini ?? asset.cache?.google;\n cacheSuggestionField = 'cache.gemini';\n break;\n default:\n break;\n }\n\n if (cacheSuggestionField && providerCache === undefined) {\n warnings.push({\n code: 'POK042',\n message: `Provider \"${asset.provider}\" has no provider-specific cache settings.`,\n filePath,\n suggestion: `Consider configuring ${cacheSuggestionField} for better cache-hit behavior.`,\n });\n }\n\n if (!asset.model) {\n warnings.push({\n code: 'POK044',\n message: `Provider \"${asset.provider}\" is configured without a model.`,\n filePath,\n suggestion: 'Set model in prompt or defaults to avoid adapter-time errors.',\n });\n }\n }\n\n if (\n asset.cache?.gemini?.cached_content\n && asset.cache.google?.cached_content\n && asset.cache.gemini.cached_content !== asset.cache.google.cached_content\n ) {\n warnings.push({\n code: 'POK043',\n message: 'cache.gemini.cached_content and cache.google.cached_content are both set to different values.',\n filePath,\n suggestion: 'Use one canonical value; Gemini prefers cache.gemini.cached_content.',\n });\n }\n\n for (const [envName, overrides] of Object.entries(asset.environments ?? {})) {\n if (asset.cache && (!isRecord(overrides) || !overrides.cache)) {\n warnings.push({\n code: 'POK045',\n message: `Environment \"${envName}\" does not override cache while prompt-level cache is defined.`,\n filePath,\n suggestion: 'Confirm cache strategy is intentionally shared across environments.',\n });\n }\n }\n\n for (const [tierName, overrides] of Object.entries(asset.tiers ?? {})) {\n if (asset.cache && (!isRecord(overrides) || !overrides.cache)) {\n warnings.push({\n code: 'POK045',\n message: `Tier \"${tierName}\" does not override cache while prompt-level cache is defined.`,\n filePath,\n suggestion: 'Confirm cache strategy is intentionally shared across tiers.',\n });\n }\n }\n\n for (const tool of asset.tools ?? []) {\n if (isRecord(tool)) {\n if (!tool.description) {\n warnings.push({\n code: 'POK047',\n message: `Inline tool \"${tool.name}\" is missing a description.`,\n filePath,\n suggestion: 'Add description to improve model tool-selection quality.',\n });\n }\n if (!tool.input_schema) {\n warnings.push({\n code: 'POK047',\n message: `Inline tool \"${tool.name}\" is missing input_schema.`,\n filePath,\n suggestion: 'Add input_schema so tool inputs are strongly typed.',\n });\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\n/**\n * Validate a prompt asset including its include graph.\n * Catches missing include files, circular includes, and parse errors in included files.\n */\nexport async function validateAssetWithIncludes(\n asset: PromptAsset,\n filePath: string,\n frontMatterKeys?: string[],\n): Promise<PromptValidationResult> {\n // Run standard validation first\n const result = validateAsset(asset, frontMatterKeys, filePath);\n\n // Validate includes\n if (asset.includes && asset.includes.length > 0) {\n try {\n await resolveIncludes(asset, filePath);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n const isCircular = message.includes('Circular include');\n result.errors.push({\n code: isCircular ? 'POK021' : 'POK020',\n message: isCircular\n ? `Circular include detected: ${message}`\n : `Include resolution failed: ${message}`,\n filePath,\n });\n result.valid = false;\n }\n }\n\n return result;\n}\n\nfunction findClosestMatch(input: string, candidates: Set<string>): string | undefined {\n let best: string | undefined;\n let bestDist = Infinity;\n\n for (const candidate of candidates) {\n const dist = levenshtein(input.toLowerCase(), candidate.toLowerCase());\n if (dist < bestDist && dist <= 3) {\n bestDist = dist;\n best = candidate;\n }\n }\n\n return best;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","import { readFile } from 'node:fs/promises';\nimport { existsSync, statSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\nimport { PromptCache } from './cache.js';\nimport { resolveIncludes } from './composition/index.js';\nimport { applyOverrides } from './overrides/index.js';\nimport { parsePrompt, loadPromptFile } from './parser/index.js';\nimport type { PromptAsset, PromptAssetOverrides, ResolvedPromptAsset } from './schema/index.js';\n\nexport type PromptResolutionMode = 'auto' | 'compiled-only' | 'source-only';\n\nexport const DEFAULT_PROMPTS_DIR = './prompts';\nexport const DEFAULT_COMPILED_JSON_DIR = './.generated-prompts/json';\nexport const DEFAULT_COMPILED_ESM_DIR = './.generated-prompts/esm';\n\nexport interface PromptResolutionConfig {\n sourceDir?: string;\n compiledDir?: string;\n mode?: PromptResolutionMode;\n cache?: boolean;\n}\n\nexport interface ResolvedPromptResolutionConfig {\n sourceDir: string;\n compiledDir: string;\n mode?: PromptResolutionMode;\n cache?: boolean;\n}\n\nexport function defaultCompiledDirForFormat(format: 'json' | 'esm'): string {\n return format === 'esm' ? DEFAULT_COMPILED_ESM_DIR : DEFAULT_COMPILED_JSON_DIR;\n}\n\nexport function withPromptResolutionDefaults(config: PromptResolutionConfig): ResolvedPromptResolutionConfig {\n return {\n ...config,\n sourceDir: config.sourceDir ?? DEFAULT_PROMPTS_DIR,\n compiledDir: config.compiledDir ?? DEFAULT_COMPILED_JSON_DIR,\n };\n}\n\nconst sharedPromptCache = new PromptCache<PromptAsset>();\n\nexport async function loadPromptAsset(\n promptPath: string,\n config: PromptResolutionConfig,\n promptCache: PromptCache<PromptAsset> = sharedPromptCache,\n): Promise<PromptAsset> {\n const resolvedConfig = withPromptResolutionDefaults(config);\n const mode = resolvedConfig.mode ?? 'auto';\n\n if (mode !== 'source-only' && resolvedConfig.compiledDir) {\n const compiledFile = resolve(resolvedConfig.compiledDir, promptPath + '.json');\n if (existsSync(compiledFile)) {\n if (mode === 'auto') {\n const sourceFile = resolve(resolvedConfig.sourceDir, promptPath + '.md');\n if (existsSync(sourceFile)) {\n const compiledMtime = statSync(compiledFile).mtimeMs;\n const sourceMtime = statSync(sourceFile).mtimeMs;\n if (sourceMtime > compiledMtime) {\n console.warn(\n `[promptopskit] Warning: compiled artifact for \"${promptPath}\" is older than source .md file.\\n`\n + ' Run \"promptopskit compile\" or switch to source-only mode.',\n );\n }\n }\n }\n\n const content = await readFile(compiledFile, 'utf-8');\n return JSON.parse(content) as PromptAsset;\n }\n\n if (mode === 'compiled-only') {\n throw new Error(\n `Compiled artifact not found: ${compiledFile}\\n`\n + 'Run \"promptopskit compile\" to generate it.',\n );\n }\n }\n\n if (mode !== 'compiled-only') {\n const sourceFile = resolve(resolvedConfig.sourceDir, promptPath + '.md');\n\n if (resolvedConfig.cache !== false) {\n const cached = promptCache.get(sourceFile);\n if (cached) {\n return cached;\n }\n }\n\n if (!existsSync(sourceFile)) {\n const paths = [sourceFile];\n if (resolvedConfig.compiledDir) {\n paths.unshift(resolve(resolvedConfig.compiledDir, promptPath + '.json'));\n }\n\n throw new Error(\n `Prompt not found: \"${promptPath}\"\\nSearched:\\n${paths.map((candidate) => ` - ${candidate}`).join('\\n')}`,\n );\n }\n\n const { asset } = await loadPromptFile(sourceFile, { defaultsRoot: resolvedConfig.sourceDir });\n\n if (resolvedConfig.cache !== false) {\n promptCache.set(sourceFile, asset);\n }\n\n return asset;\n }\n\n throw new Error(`Prompt not found: \"${promptPath}\"`);\n}\n\nexport async function resolvePromptAsset(\n promptPath: string,\n config: PromptResolutionConfig,\n options: { environment?: string; tier?: string; runtime?: Partial<PromptAssetOverrides> } = {},\n promptCache: PromptCache<PromptAsset> = sharedPromptCache,\n): Promise<ResolvedPromptAsset> {\n const resolvedConfig = withPromptResolutionDefaults(config);\n let asset = await loadPromptAsset(promptPath, resolvedConfig, promptCache);\n\n const sourceFile = resolve(resolvedConfig.sourceDir, promptPath + '.md');\n if (asset.includes && asset.includes.length > 0 && existsSync(sourceFile)) {\n asset = await resolveIncludes(asset, sourceFile);\n }\n\n asset = applyOverrides(asset, {\n environment: options.environment,\n tier: options.tier,\n runtime: options.runtime,\n });\n\n return asset as ResolvedPromptAsset;\n}\n\nexport function resolveInlinePromptSource(\n source: string,\n options: { environment?: string; tier?: string; runtime?: Partial<PromptAssetOverrides> } = {},\n): ResolvedPromptAsset {\n const { asset } = parsePrompt(source);\n return applyOverrides(asset, {\n environment: options.environment,\n tier: options.tier,\n runtime: options.runtime,\n }) as ResolvedPromptAsset;\n}","import { statSync } from 'node:fs';\n\ninterface CacheEntry<T> {\n value: T;\n mtime: number;\n}\n\n/**\n * Simple in-memory LRU cache keyed by file path + mtime.\n * Used to avoid re-parsing prompt files on every renderPrompt() call.\n */\nexport class PromptCache<T> {\n private cache = new Map<string, CacheEntry<T>>();\n private maxSize: number;\n\n constructor(maxSize = 100) {\n this.maxSize = maxSize;\n }\n\n get(filePath: string): T | undefined {\n const entry = this.cache.get(filePath);\n if (!entry) return undefined;\n\n try {\n const stat = statSync(filePath);\n if (stat.mtimeMs !== entry.mtime) {\n this.cache.delete(filePath);\n return undefined;\n }\n } catch {\n this.cache.delete(filePath);\n return undefined;\n }\n\n // Refresh recency for true LRU semantics.\n this.cache.delete(filePath);\n this.cache.set(filePath, entry);\n\n return entry.value;\n }\n\n set(filePath: string, value: T): void {\n try {\n const stat = statSync(filePath);\n\n if (this.cache.has(filePath)) {\n this.cache.delete(filePath);\n } else if (this.cache.size >= this.maxSize) {\n const oldest = this.cache.keys().next().value;\n if (oldest) this.cache.delete(oldest);\n }\n\n this.cache.set(filePath, { value, mtime: stat.mtimeMs });\n } catch {\n // Can't stat the file — don't cache\n }\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n get size(): number {\n return this.cache.size;\n }\n}\n","import type { PromptAsset, PromptAssetOverrides } from '../schema/index.js';\n\nexport interface OverrideOptions {\n environment?: string;\n tier?: string;\n runtime?: Partial<PromptAssetOverrides>;\n}\n\n/**\n * Apply environment, tier, and runtime overrides to a prompt asset.\n *\n * Precedence: base → environment → tier → runtime\n * Scalars are replaced. Arrays are replaced (not concatenated).\n */\nexport function applyOverrides(\n asset: PromptAsset,\n options: OverrideOptions = {},\n): PromptAsset {\n let result = { ...asset };\n\n // Apply environment override\n if (options.environment && result.environments?.[options.environment]) {\n result = mergeOverride(result, result.environments[options.environment]);\n }\n\n // Apply tier override\n if (options.tier && result.tiers?.[options.tier]) {\n result = mergeOverride(result, result.tiers[options.tier]);\n }\n\n // Apply runtime overrides\n if (options.runtime) {\n result = mergeOverride(result, options.runtime);\n }\n\n return result;\n}\n\nfunction mergeOverride(\n base: PromptAsset,\n override: Partial<PromptAssetOverrides>,\n): PromptAsset {\n const result = { ...base };\n\n if (override.model !== undefined) result.model = override.model;\n if (override.fallback_models !== undefined) result.fallback_models = override.fallback_models;\n if (override.tools !== undefined) result.tools = override.tools;\n\n if (override.reasoning !== undefined) {\n result.reasoning = { ...result.reasoning, ...override.reasoning };\n }\n if (override.sampling !== undefined) {\n result.sampling = { ...result.sampling, ...override.sampling };\n }\n if (override.response !== undefined) {\n result.response = { ...result.response, ...override.response };\n }\n if (override.cache !== undefined) {\n result.cache = {\n ...result.cache,\n ...override.cache,\n openai: mergeRecordBlock(result.cache?.openai, override.cache.openai),\n anthropic: mergeRecordBlock(result.cache?.anthropic, override.cache.anthropic),\n gemini: mergeRecordBlock(result.cache?.gemini, override.cache.gemini),\n google: mergeRecordBlock(result.cache?.google, override.cache.google),\n };\n }\n if (override.raw !== undefined) {\n result.raw = {\n ...result.raw,\n ...override.raw,\n openai: mergeRecordBlock(result.raw?.openai, override.raw.openai),\n 'openai-responses': mergeRecordBlock(result.raw?.['openai-responses'], override.raw['openai-responses']),\n openai_responses: mergeRecordBlock(result.raw?.openai_responses, override.raw.openai_responses),\n anthropic: mergeRecordBlock(result.raw?.anthropic, override.raw.anthropic),\n gemini: mergeRecordBlock(result.raw?.gemini, override.raw.gemini),\n google: mergeRecordBlock(result.raw?.google, override.raw.google),\n openrouter: mergeRecordBlock(result.raw?.openrouter, override.raw.openrouter),\n llmasaservice: mergeRecordBlock(result.raw?.llmasaservice, override.raw.llmasaservice),\n };\n }\n\n if (override.provider_options !== undefined) {\n result.provider_options = {\n ...result.provider_options,\n ...override.provider_options,\n anthropic: {\n ...result.provider_options?.anthropic,\n ...override.provider_options.anthropic,\n },\n gemini: {\n ...result.provider_options?.gemini,\n ...override.provider_options.gemini,\n },\n openrouter: {\n ...result.provider_options?.openrouter,\n ...override.provider_options.openrouter,\n },\n llmasaservice: {\n ...result.provider_options?.llmasaservice,\n ...override.provider_options.llmasaservice,\n },\n };\n }\n\n return result;\n}\n\nfunction mergeRecordBlock<T extends object>(\n base: T | undefined,\n override: T | undefined,\n): T | undefined {\n if (override === undefined) return base;\n return { ...base, ...override } as T;\n}\n","import { existsSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\n\nexport function findDefaultsRoot(filePath: string): string {\n let current = resolve(dirname(filePath));\n let root = current;\n let foundDefaults = false;\n\n while (true) {\n if (existsSync(join(current, 'defaults.md'))) {\n root = current;\n foundDefaults = true;\n } else if (foundDefaults) {\n return root;\n }\n\n const parent = dirname(current);\n if (parent === current) {\n return root;\n }\n\n current = parent;\n }\n}","import { readdir, writeFile, mkdir, rm } from 'node:fs/promises';\nimport { join, extname, relative, dirname } from 'node:path';\nimport { loadPromptFile } from '../../parser/index.js';\nimport { resolveIncludes } from '../../composition/index.js';\nimport { validateAssetWithIncludes } from '../../validation/index.js';\nimport { DEFAULT_PROMPTS_DIR, defaultCompiledDirForFormat } from '../../prompt-resolution.js';\n\nconst HELP = `\npromptopskit compile [sourceDir] [outputDir] [options]\n\nCompile .md prompt files to JSON or ESM artifacts.\n\nOptions:\n --source, -s Source directory (default: ./prompts)\n --output, -o Output directory (default: ./.generated-prompts/<format>)\n --no-clean Don't clear the output directory before compiling\n --dry-run Show what would be compiled without writing files\n --format Output format: json (default) or esm\n --help, -h Show this help\n`.trim();\n\nexport async function compile(args: string[]): Promise<void> {\n if (args.includes('--help') || args.includes('-h')) {\n console.log(HELP);\n return;\n }\n\n const positional = getPositionalArgs(args, new Set(['--format', '--source', '--output', '-s', '-o']));\n const dryRun = args.includes('--dry-run');\n const noClean = args.includes('--no-clean');\n const format = getFlag(args, '--format') ?? 'json';\n\n if (format !== 'json' && format !== 'esm') {\n console.error(`Error: Unknown format \"${format}\". Use \"json\" or \"esm\".`);\n process.exit(1);\n }\n\n const sourceDir = getFlag(args, '--source', '-s') ?? positional[0] ?? DEFAULT_PROMPTS_DIR;\n const outputDir = getFlag(args, '--output', '-o') ?? positional[1] ?? defaultCompiledDirForFormat(format);\n\n // Collect prompt files\n const files = await collectPromptFiles(sourceDir);\n\n if (files.length === 0) {\n console.log(`No .md prompt files found in ${sourceDir}`);\n return;\n }\n\n // Clean output dir\n if (!noClean && !dryRun) {\n await rm(outputDir, { recursive: true, force: true });\n }\n\n let compiled = 0;\n let errors = 0;\n\n for (const file of files) {\n const rel = relative(sourceDir, file).replace(/\\.md$/, '');\n const outExt = format === 'esm' ? '.mjs' : '.json';\n const outPath = join(outputDir, rel + outExt);\n\n try {\n const { asset: parsed, raw } = await loadPromptFile(file, { defaultsRoot: sourceDir });\n\n const validation = await validateAssetWithIncludes(parsed, file, Object.keys(raw.frontMatter));\n if (validation.errors.length > 0) {\n throw new Error(validation.errors.map((error) => `${error.code}: ${error.message}`).join('\\n '));\n }\n\n // Resolve includes so compiled artifacts are self-sufficient\n const asset = (parsed.includes && parsed.includes.length > 0)\n ? await resolveIncludes(parsed, file)\n : parsed;\n\n if (dryRun) {\n console.log(` Would create: ${outPath}`);\n } else {\n await mkdir(dirname(outPath), { recursive: true });\n\n if (format === 'esm') {\n const esmContent = `export default ${JSON.stringify(asset, null, 2)};\\n`;\n await writeFile(outPath, esmContent, 'utf-8');\n } else {\n await writeFile(outPath, JSON.stringify(asset, null, 2) + '\\n', 'utf-8');\n }\n console.log(` ✓ ${outPath}`);\n }\n compiled++;\n } catch (err) {\n errors++;\n const message = err instanceof Error ? err.message : String(err);\n console.error(` ✗ ${file}`);\n console.error(` ${message}`);\n }\n }\n\n console.log();\n if (dryRun) {\n console.log(`Dry run: ${compiled} file(s) would be compiled, ${errors} error(s)`);\n } else {\n console.log(`Compiled ${compiled} file(s), ${errors} error(s)`);\n }\n\n if (errors > 0) {\n process.exit(1);\n }\n}\nfunction getPositionalArgs(args: string[], flagsWithValues: Set<string>): string[] {\n const positional: string[] = [];\n\n for (let index = 0; index < args.length; index++) {\n const arg = args[index];\n if (flagsWithValues.has(arg)) {\n index++;\n continue;\n }\n\n if (arg.startsWith('-')) {\n continue;\n }\n\n positional.push(arg);\n }\n\n return positional;\n}\n\nfunction getFlag(args: string[], ...flags: string[]): string | undefined {\n for (const flag of flags) {\n const idx = args.indexOf(flag);\n if (idx >= 0 && idx + 1 < args.length) {\n return args[idx + 1];\n }\n }\n return undefined;\n}\n\nasync function collectPromptFiles(dir: string): Promise<string[]> {\n const results: string[] = [];\n const entries = await readdir(dir, { withFileTypes: true, recursive: true });\n for (const entry of entries) {\n if (\n entry.isFile()\n && extname(entry.name) === '.md'\n && !entry.name.endsWith('.test.md')\n && entry.name !== 'defaults.md'\n ) {\n results.push(join(entry.parentPath ?? dir, entry.name));\n }\n }\n return results.sort();\n}\n","import { readFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { loadPromptFile } from '../../parser/index.js';\nimport { resolveIncludes } from '../../composition/index.js';\nimport { applyOverrides } from '../../overrides/index.js';\nimport { interpolate } from '../../renderer/interpolate.js';\nimport { findDefaultsRoot } from './defaults-root.js';\n\nconst HELP = `\npromptopskit render <file> [options]\n\nRender a prompt preview with variables.\n\nOptions:\n --env <name> Environment override\n --tier <name> Tier override\n --vars <file> JSON file with variables\n --json Output raw JSON instead of readable format\n --help, -h Show this help\n`.trim();\n\nexport async function render(args: string[]): Promise<void> {\n if (args.includes('--help') || args.includes('-h')) {\n console.log(HELP);\n return;\n }\n\n const positional = getPositionalArgs(args, new Set(['--env', '--tier', '--vars']));\n const file = positional[0];\n if (!file) {\n console.error('Error: Please provide a prompt file to render.');\n process.exit(1);\n }\n\n const env = getFlag(args, '--env');\n const tier = getFlag(args, '--tier');\n const varsFile = getFlag(args, '--vars');\n const jsonOutput = args.includes('--json');\n\n // Load variables from file or sidecar\n let variables: Record<string, string> = {};\n\n if (varsFile) {\n const varsContent = await readFile(varsFile, 'utf-8');\n variables = JSON.parse(varsContent);\n } else {\n // Try auto-loading sidecar .test.yaml\n const sidecarPath = file.replace(/\\.md$/, '.test.yaml');\n if (existsSync(sidecarPath)) {\n const { default: yaml } = await import('gray-matter');\n const sidecarContent = await readFile(sidecarPath, 'utf-8');\n // Wrap in --- delimiters so gray-matter parses the entire file as front matter\n const parsed = yaml(`---\\n${sidecarContent}---\\n`);\n const data = parsed.data as { cases?: Array<{ variables?: Record<string, string> }> };\n if (data.cases?.[0]?.variables) {\n variables = data.cases[0].variables;\n }\n }\n }\n\n const defaultsRoot = findDefaultsRoot(file);\n const { asset: parsed } = await loadPromptFile(file, { defaultsRoot });\n\n // Resolve includes (matching the library pipeline)\n const resolved = (parsed.includes && parsed.includes.length > 0)\n ? await resolveIncludes(parsed, file)\n : parsed;\n\n // Apply overrides using the standard applyOverrides function\n const overridden = applyOverrides(resolved, {\n environment: env,\n tier: tier,\n });\n\n // Render sections with variables\n const renderedSystem = overridden.sections?.system_instructions\n ? interpolate(overridden.sections.system_instructions, variables)\n : undefined;\n const renderedPrompt = overridden.sections?.prompt_template\n ? interpolate(overridden.sections.prompt_template, variables)\n : undefined;\n\n if (jsonOutput) {\n console.log(JSON.stringify({\n id: overridden.id,\n provider: overridden.provider,\n model: overridden.model,\n system_instructions: renderedSystem,\n prompt_template: renderedPrompt,\n tools: overridden.tools,\n }, null, 2));\n return;\n }\n\n // Readable output\n const label = [\n overridden.provider,\n overridden.model,\n [env, tier].filter(Boolean).join('/'),\n ].filter(Boolean).join(', ');\n\n console.log(`── ${overridden.id} (${label}) ${'─'.repeat(Math.max(0, 50 - overridden.id.length - label.length))}`);\n\n if (renderedSystem) {\n console.log(`System: ${renderedSystem.split('\\n')[0]}${renderedSystem.includes('\\n') ? '...' : ''}`);\n }\n if (renderedPrompt) {\n console.log(`User: ${renderedPrompt.split('\\n')[0]}${renderedPrompt.includes('\\n') ? '...' : ''}`);\n }\n if (overridden.tools?.length) {\n const toolNames = overridden.tools.map((t) => typeof t === 'string' ? t : t.name);\n console.log(`Tools: ${toolNames.join(', ')}`);\n }\n console.log(`Model: ${overridden.model ?? 'not set'}`);\n console.log('─'.repeat(60));\n}\n\nfunction getPositionalArgs(args: string[], flagsWithValues: Set<string>): string[] {\n const positional: string[] = [];\n\n for (let index = 0; index < args.length; index++) {\n const arg = args[index];\n if (flagsWithValues.has(arg)) {\n index += 1;\n continue;\n }\n\n if (arg.startsWith('-')) {\n continue;\n }\n\n positional.push(arg);\n }\n\n return positional;\n}\n\nfunction getFlag(args: string[], flag: string): string | undefined {\n const idx = args.indexOf(flag);\n if (idx >= 0 && idx + 1 < args.length) {\n return args[idx + 1];\n }\n return undefined;\n}\n","import { loadPromptFile } from '../../parser/index.js';\nimport { resolveIncludes } from '../../composition/index.js';\nimport { findDefaultsRoot } from './defaults-root.js';\n\nconst HELP = `\npromptopskit inspect <file>\n\nPrint the normalized prompt asset as JSON.\n\nOptions:\n --help, -h Show this help\n`.trim();\n\nexport async function inspect(args: string[]): Promise<void> {\n if (args.includes('--help') || args.includes('-h')) {\n console.log(HELP);\n return;\n }\n\n const file = args.find((a) => !a.startsWith('--'));\n if (!file) {\n console.error('Error: Please provide a prompt file to inspect.');\n process.exit(1);\n }\n\n const defaultsRoot = findDefaultsRoot(file);\n const { asset: parsed } = await loadPromptFile(file, { defaultsRoot });\n\n // Resolve includes so the output shows the fully resolved asset\n const asset = (parsed.includes && parsed.includes.length > 0)\n ? await resolveIncludes(parsed, file)\n : parsed;\n\n console.log(JSON.stringify(asset, null, 2));\n}\n","import { writeFile, mkdir } from 'node:fs/promises';\nimport { join, dirname, relative } from 'node:path';\nimport { existsSync, readFileSync } from 'node:fs';\n\nconst HELP = `\npromptopskit init [dir]\n\nScaffold a prompts directory with starter files.\n\nArguments:\n dir Target directory (default: ./prompts)\n\nOptions:\n --help, -h Show this help\n`.trim();\n\nconst HELLO_PROMPT = `---\nid: hello\ncontext:\n inputs:\n - name\n - app_context\nincludes:\n - ./shared/tone.md\ncache:\n openai:\n # Keep this stable across requests that share a long static prefix.\n prompt_cache_key: hello-v1\n retention: in_memory\nreasoning:\n effort: high\nenvironments:\n dev:\n model: gpt-5.4-mini\n reasoning:\n effort: low\n sampling:\n temperature: 0.2\n---\n\n# System instructions\n\nYou are a friendly assistant. Be helpful and concise.\nCurrent app context: {{ app_context }}.\n\n# Prompt template\n\nSay hello to {{ name }} and ask how you can help them today.\n`.trimStart();\n\nconst TONE_INCLUDE = `---\nid: shared/tone\nschema_version: 1\n---\n\n# System instructions\n\nAlways be polite, professional, and concise. Avoid jargon unless the user uses it first.\n`.trimStart();\n\nconst DEFAULTS = `---\nprovider: openai\nmodel: gpt-5.4\nmetadata:\n owner: my-team\n review_required: true\n---\n\n# System instructions\n\nYou are a helpful AI assistant. Follow company guidelines at all times.\n`.trimStart();\n\nconst TEST_SIDECAR = `cases:\n - name: basic-greeting\n variables:\n name: \"World\"\n app_context: \"Welcome screen\"\n response:\n message: \"Hello, World! How can I help you today?\"\n - name: named-greeting\n variables:\n name: \"Alice\"\n app_context: \"Settings page\"\n response:\n message: \"Hello, Alice! How can I help you today?\"\n`;\n\nconst EXAMPLE_USAGE = `// Example: render the hello prompt and send it to OpenAI\n// Full docs: https://promptopskit.com/docs/index.html#/\n\nimport { createPromptOpsKit } from 'promptopskit';\n\nasync function main() {\n const kit = createPromptOpsKit({ sourceDir: './prompts' });\n\n // Determine environment from ENV var (defaults to 'dev')\n // - dev: uses gpt-5.4-mini, low reasoning effort, temperature 0.2\n // - production: uses base model gpt-5.4 with high reasoning effort\n const environment = process.env.NODE_ENV === 'production' ? 'prod' : 'dev';\n\n const { request } = await kit.renderPrompt({\n path: 'hello',\n provider: 'openai',\n environment,\n variables: {\n name: 'World',\n app_context: 'Welcome screen',\n },\n });\n\n /*\n request.body is the fully transformed OpenAI Chat Completions payload.\n For the hello.md prompt in the dev environment it looks like:\n\n {\n \"model\": \"gpt-5.4-mini\",\n \"reasoning_effort\": \"low\",\n \"temperature\": 0.2,\n \"messages\": [\n {\n \"role\": \"system\",\n \"content\": \"You are a friendly assistant. Be helpful and concise.\n Current app context: Welcome screen.\n\n Always be polite, professional, and concise. Avoid jargon unless the user uses it first.\"\n },\n {\n \"role\": \"user\",\n \"content\": \"Say hello to World and ask how you can help them today.\"\n }\n ]\n }\n */\n\n console.log('Model:', request.body.model);\n\n const res = await fetch('https://api.openai.com/v1/chat/completions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: \\`Bearer \\${process.env.OPENAI_API_KEY}\\`,\n },\n body: JSON.stringify(request.body),\n });\n\n const data = await res.json();\n console.log(data.choices[0].message.content);\n}\n\nmain();\n`;\n\nexport async function init(args: string[]): Promise<void> {\n if (args.includes('--help') || args.includes('-h')) {\n console.log(HELP);\n return;\n }\n\n const dir = args.find((a) => !a.startsWith('--')) ?? './prompts';\n const testFilePath = join(dirname(dir), 'tests', 'hello.prompt.test.mjs');\n const promptsDirFromTest = relative(dirname(testFilePath), dir) || '.';\n const helloPromptTest = createHelloPromptTest(promptsDirFromTest);\n\n const files: Array<{ path: string; content: string }> = [\n { path: join(dir, 'defaults.md'), content: DEFAULTS },\n { path: join(dir, 'hello.md'), content: HELLO_PROMPT },\n { path: join(dir, 'hello.test.yaml'), content: TEST_SIDECAR },\n { path: join(dir, 'shared', 'tone.md'), content: TONE_INCLUDE },\n { path: join(dir, 'example-usage.ts'), content: EXAMPLE_USAGE },\n { path: testFilePath, content: helloPromptTest },\n ];\n\n let created = 0;\n let skipped = 0;\n\n for (const file of files) {\n if (existsSync(file.path)) {\n console.log(` skip ${file.path} (already exists)`);\n skipped++;\n continue;\n }\n await mkdir(dirname(file.path), { recursive: true });\n await writeFile(file.path, file.content, 'utf-8');\n console.log(` ✓ ${file.path}`);\n created++;\n }\n\n console.log();\n console.log(`Created ${created} file(s), skipped ${skipped} existing.`);\n\n // Suggest build script if package.json exists\n if (existsSync('package.json')) {\n try {\n const pkg = JSON.parse(readFileSync('package.json', 'utf-8'));\n if (!pkg.scripts?.['build:prompts']) {\n console.log();\n console.log(`Tip: Add to your package.json scripts:`);\n console.log(` \"build:prompts\": \"promptopskit compile ${dir}\"`);\n }\n if (!pkg.scripts?.test) {\n console.log();\n console.log(`Tip: Add a test script to run the generated prompt test:`);\n console.log(` \"test\": \"node --test tests/*.test.mjs\"`);\n }\n } catch {\n // Ignore parse errors\n }\n }\n}\n\nfunction createHelloPromptTest(promptsDirFromTest: string): string {\n return `import assert from 'node:assert/strict';\nimport { dirname, resolve } from 'node:path';\nimport test from 'node:test';\nimport { fileURLToPath } from 'node:url';\nimport { createPromptOpsKit } from 'promptopskit';\nimport {\n getHardcodedPromptResponse,\n loadPromptTestSidecar,\n renderPromptTestCase,\n} from 'promptopskit/testing';\n\nconst testDir = dirname(fileURLToPath(import.meta.url));\nconst promptsDir = resolve(testDir, ${JSON.stringify(promptsDirFromTest)});\n\ntest('hello prompt renders every sidecar case', async () => {\n const kit = createPromptOpsKit({ sourceDir: promptsDir, cache: false });\n const sidecar = await loadPromptTestSidecar(resolve(promptsDir, 'hello.test.yaml'));\n\n for (const testCase of sidecar.cases) {\n const { rendered } = await renderPromptTestCase(kit, {\n sidecar,\n caseName: testCase.name,\n path: 'hello',\n provider: 'openai',\n environment: 'dev',\n strict: true,\n });\n\n assert.ok(rendered.request?.body?.messages);\n }\n});\n\ntest('hello prompt can return a deterministic response without calling a model', async () => {\n const sidecar = await loadPromptTestSidecar(resolve(promptsDir, 'hello.test.yaml'));\n\n assert.deepEqual(getHardcodedPromptResponse(sidecar, 'basic-greeting'), {\n message: 'Hello, World! How can I help you today?',\n });\n});\n`;\n}\n","import { writeFile, readFile, mkdir } from 'node:fs/promises';\nimport { dirname } from 'node:path';\nimport { existsSync } from 'node:fs';\n\nconst MARKER_START = '<!-- promptopskit:start -->';\nconst MARKER_END = '<!-- promptopskit:end -->';\n\nconst HELP = `\npromptopskit skill [--target <target>] [--force]\n\nDeploy AI agent instructions so coding assistants know how to\ncreate and manage prompts using promptopskit.\n\nBy default, generates files for all major AI coding assistants:\n\n AGENTS.md Codex, OpenCode, Cursor, Copilot\n CLAUDE.md Claude Code (imports AGENTS.md)\n .github/instructions/promptopskit.instructions.md GitHub Copilot (path-specific)\n .cursor/rules/promptopskit.mdc Cursor (project rule)\n\nIf a file already exists, the promptopskit section is merged (replaced\nin-place or appended). Use --force to overwrite the entire file.\n\nOptions:\n --target, -t Deploy only a specific target (agents, claude, copilot, cursor)\n --force, -f Overwrite entire file instead of merging\n --help, -h Show this help\n`.trim();\n\nconst STUB_CONTENT = `# promptopskit\n\nThis project uses **promptopskit** to manage LLM prompts as code.\nRead the full guide at \\`node_modules/promptopskit/SKILL.md\\` before\ncreating or editing prompt files.`;\n\nconst CLAUDE_LINE = '@AGENTS.md';\n\ninterface TargetConfig {\n path: string;\n wrap: (content: string) => string;\n}\n\nconst TARGETS: Record<string, TargetConfig> = {\n agents: {\n path: 'AGENTS.md',\n wrap: (content) => content,\n },\n claude: {\n path: 'CLAUDE.md',\n wrap: () => CLAUDE_LINE + '\\n',\n },\n copilot: {\n path: '.github/instructions/promptopskit.instructions.md',\n wrap: (content) =>\n `---\\napplyTo: \"**\"\\n---\\n\\n${content}`,\n },\n cursor: {\n path: '.cursor/rules/promptopskit.mdc',\n wrap: (content) =>\n `---\\ndescription: How to create and manage prompts using promptopskit\\nglobs: \"**\"\\nalwaysApply: true\\n---\\n\\n${content}`,\n },\n};\n\nconst ALL_TARGETS = ['agents', 'claude', 'copilot', 'cursor'];\n\nexport async function skill(args: string[]): Promise<void> {\n if (args.includes('--help') || args.includes('-h')) {\n console.log(HELP);\n return;\n }\n\n const force = args.includes('--force') || args.includes('-f');\n\n let targets = ALL_TARGETS;\n const targetIdx = args.findIndex((a) => a === '--target' || a === '-t');\n if (targetIdx !== -1 && args[targetIdx + 1]) {\n const target = args[targetIdx + 1];\n const config = TARGETS[target];\n if (!config) {\n console.error(`Unknown target: ${target}`);\n console.error(`Valid targets: ${Object.keys(TARGETS).join(', ')}`);\n process.exit(1);\n }\n targets = [target];\n }\n\n let written = 0;\n for (const target of targets) {\n const config = TARGETS[target];\n const filePath = config.path;\n\n // CLAUDE.md uses a simple import line — handle dedup separately\n if (target === 'claude') {\n written += await deployClaude(filePath, force);\n continue;\n }\n\n const markedContent = config.wrap(wrapMarkers(STUB_CONTENT));\n\n if (existsSync(filePath) && !force) {\n const existing = await readFile(filePath, 'utf-8');\n const merged = mergeContent(existing, markedContent);\n if (merged === existing) {\n console.log(` skip ${filePath} (already up to date)`);\n continue;\n }\n await writeFile(filePath, merged, 'utf-8');\n console.log(` ✓ ${filePath} (merged)`);\n written++;\n continue;\n }\n\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, markedContent, 'utf-8');\n console.log(` ✓ ${filePath}`);\n written++;\n }\n\n if (written > 0) {\n console.log();\n console.log(`AI agents will now understand how to create and manage prompts with promptopskit.`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// CLAUDE.md — append @AGENTS.md if not already present\n// ---------------------------------------------------------------------------\n\nasync function deployClaude(filePath: string, force: boolean): Promise<number> {\n const content = CLAUDE_LINE + '\\n';\n\n if (!existsSync(filePath) || force) {\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, content, 'utf-8');\n console.log(` ✓ ${filePath}`);\n return 1;\n }\n\n const existing = await readFile(filePath, 'utf-8');\n if (existing.split('\\n').some((line) => line.trim() === CLAUDE_LINE)) {\n console.log(` skip ${filePath} (already up to date)`);\n return 0;\n }\n\n const separator = existing.endsWith('\\n') ? '\\n' : '\\n\\n';\n await writeFile(filePath, existing + separator + content, 'utf-8');\n console.log(` ✓ ${filePath} (merged)`);\n return 1;\n}\n\n// ---------------------------------------------------------------------------\n// Marker helpers\n// ---------------------------------------------------------------------------\n\nfunction wrapMarkers(content: string): string {\n return `${MARKER_START}\\n${content}\\n${MARKER_END}`;\n}\n\nfunction mergeContent(existing: string, markedContent: string): string {\n const startIdx = existing.indexOf(MARKER_START);\n const endIdx = existing.indexOf(MARKER_END);\n\n // Replace existing block in-place\n if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {\n return (\n existing.slice(0, startIdx) +\n markedContent +\n existing.slice(endIdx + MARKER_END.length)\n );\n }\n\n // Append to end\n const separator = existing.endsWith('\\n') ? '\\n' : '\\n\\n';\n return existing + separator + markedContent + '\\n';\n}\n"],"mappings":"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","names":["readFileSync","join","extname","indent","readFile","dirname","resolve","matter","z","readFile","dirname","resolve","matter","readFile","resolve","dirname","dirname","resolve","readFile","readFile","statSync","resolve","stat","mergeRecordBlock","existsSync","dirname","join","resolve","extname","join","readdir","join","extname","relative","dirname","HELP","getPositionalArgs","getFlag","collectPromptFiles","relative","join","dirname","readdir","extname","readFile","existsSync","HELP","getPositionalArgs","getFlag","readFile","existsSync","parsed","HELP","writeFile","mkdir","join","dirname","relative","existsSync","HELP","writeFile","readFile","mkdir","dirname","existsSync","HELP","HELP","readFileSync"]}