promptopskit 0.2.1 → 0.2.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.
package/README.md CHANGED
@@ -174,11 +174,15 @@ id: support/reply
174
174
  schema_version: 1
175
175
  provider: openai
176
176
  model: gpt-5.4
177
+ reasoning:
178
+ effort: high
177
179
  sampling:
178
180
  temperature: 0.7
179
181
  environments:
180
182
  dev:
181
183
  model: gpt-5.4-mini
184
+ reasoning:
185
+ effort: low
182
186
  sampling:
183
187
  temperature: 0.2
184
188
  prod:
@@ -257,32 +261,30 @@ promptopskit render <file> [--env <name>] [--tier <name>] [--vars <file>] [--jso
257
261
  # Print normalized asset as JSON
258
262
  promptopskit inspect <file>
259
263
 
260
- # Deploy AI agent instructions into your project
261
- promptopskit skill [--target copilot|cursor|generic] [--force]
264
+ # Deploy AI agent instructions for all major coding assistants
265
+ promptopskit skill [--target agents|claude|copilot|cursor] [--force]
262
266
  ```
263
267
 
264
268
  ## AI Agent Instructions
265
269
 
266
- The `skill` command deploys a comprehensive instructions file so AI coding assistants (GitHub Copilot, Cursor, etc.) automatically understand how to create and manage prompts with promptopskit.
270
+ The `skill` command deploys instruction files so AI coding assistants automatically understand how to create and manage prompts with promptopskit. By default it generates files for **all** major vendors:
267
271
 
268
272
  ```bash
269
- # Deploy for GitHub Copilot (default)
273
+ # Deploy for all AI coding assistants (default)
270
274
  promptopskit skill
271
- # → .github/instructions/promptopskit.instructions.md
272
-
273
- # Deploy for Cursor
274
- promptopskit skill --target cursor
275
- # → .cursor/rules/promptopskit.mdc
275
+ # → AGENTS.md (Codex, OpenCode, Cursor, Copilot)
276
+ # → CLAUDE.md (Claude Code — imports AGENTS.md)
277
+ # .github/instructions/promptopskit.instructions.md (GitHub Copilot)
278
+ # .cursor/rules/promptopskit.mdc (Cursor)
276
279
 
277
- # Deploy a generic instructions file
278
- promptopskit skill --target generic
279
- # → .ai/promptopskit-skill.md
280
+ # Deploy only a specific target
281
+ promptopskit skill --target copilot
280
282
 
281
- # Overwrite an existing instructions file
283
+ # Overwrite existing instructions files
282
284
  promptopskit skill --force
283
285
  ```
284
286
 
285
- The deployed file covers the prompt format, front matter schema, variable interpolation, includes, overrides, the TypeScript API, provider adapters, and project conventions — everything an AI agent needs to write correct prompts on the first try.
287
+ The `CLAUDE.md` file uses Claude Code's `@AGENTS.md` import syntax to avoid duplicating content. The deployed files cover the prompt format, front matter schema, variable interpolation, includes, overrides, the TypeScript API, provider adapters, and project conventions — everything an AI agent needs to write correct prompts on the first try.
286
288
 
287
289
  ## Inline Source
288
290
 
package/dist/cli/index.js CHANGED
@@ -809,9 +809,13 @@ context:
809
809
  - app_context
810
810
  includes:
811
811
  - ./shared/tone.md
812
+ reasoning:
813
+ effort: high
812
814
  environments:
813
815
  dev:
814
816
  model: gpt-5.4-mini
817
+ reasoning:
818
+ effort: low
815
819
  sampling:
816
820
  temperature: 0.2
817
821
  ---
@@ -865,8 +869,8 @@ async function main() {
865
869
  const kit = createPromptOpsKit({ sourceDir: './prompts' });
866
870
 
867
871
  // Determine environment from ENV var (defaults to 'dev')
868
- // - dev: uses gpt-5.4-mini with temperature 0.2 (see hello.md environments)
869
- // - production: uses base model gpt-5.4 with default settings
872
+ // - dev: uses gpt-5.4-mini, low reasoning effort, temperature 0.2
873
+ // - production: uses base model gpt-5.4 with high reasoning effort
870
874
  const environment = process.env.NODE_ENV === 'production' ? 'prod' : 'dev';
871
875
 
872
876
  const { request } = await kit.renderPrompt({
@@ -879,6 +883,28 @@ async function main() {
879
883
  },
880
884
  });
881
885
 
886
+ // request.body is the fully transformed OpenAI Chat Completions payload.
887
+ // For the hello.md prompt in the dev environment it looks like:
888
+ //
889
+ // {
890
+ // "model": "gpt-5.4-mini",
891
+ // "reasoning_effort": "low",
892
+ // "temperature": 0.2,
893
+ // "messages": [
894
+ // {
895
+ // "role": "system",
896
+ // "content": "You are a friendly assistant. Be helpful and concise.
897
+ Current app context: Welcome screen.
898
+
899
+ Always be polite, professional, and concise. Avoid jargon unless the user uses it first."
900
+ // },
901
+ // {
902
+ // "role": "user",
903
+ // "content": "Say hello to World and ask how you can help them today."
904
+ // }
905
+ // ]
906
+ // }
907
+
882
908
  console.log('Model:', request.body.model);
883
909
 
884
910
  const res = await fetch('https://api.openai.com/v1/chat/completions', {
@@ -947,17 +973,27 @@ promptopskit skill [--target <target>] [--force]
947
973
  Deploy AI agent instructions so coding assistants know how to
948
974
  create and manage prompts using promptopskit.
949
975
 
950
- Targets:
951
- copilot (default) .github/instructions/promptopskit.instructions.md
952
- cursor .cursor/rules/promptopskit.mdc
953
- generic .ai/promptopskit-skill.md
976
+ By default, generates files for all major AI coding assistants:
977
+
978
+ AGENTS.md Codex, OpenCode, Cursor, Copilot
979
+ CLAUDE.md Claude Code (imports AGENTS.md)
980
+ .github/instructions/promptopskit.instructions.md GitHub Copilot (path-specific)
981
+ .cursor/rules/promptopskit.mdc Cursor (project rule)
954
982
 
955
983
  Options:
956
- --target, -t Target AI tool (copilot, cursor, generic)
957
- --force, -f Overwrite existing file
984
+ --target, -t Deploy only a specific target (agents, claude, copilot, cursor)
985
+ --force, -f Overwrite existing files
958
986
  --help, -h Show this help
959
987
  `.trim();
960
988
  var TARGETS = {
989
+ agents: {
990
+ path: "AGENTS.md",
991
+ wrap: (content) => content
992
+ },
993
+ claude: {
994
+ path: "CLAUDE.md",
995
+ wrap: () => "@AGENTS.md\n"
996
+ },
961
997
  copilot: {
962
998
  path: ".github/instructions/promptopskit.instructions.md",
963
999
  wrap: (content) => `---
@@ -975,40 +1011,45 @@ alwaysApply: true
975
1011
  ---
976
1012
 
977
1013
  ${content}`
978
- },
979
- generic: {
980
- path: ".ai/promptopskit-skill.md",
981
- wrap: (content) => content
982
1014
  }
983
1015
  };
1016
+ var ALL_TARGETS = ["agents", "claude", "copilot", "cursor"];
984
1017
  async function skill(args) {
985
1018
  if (args.includes("--help") || args.includes("-h")) {
986
1019
  console.log(HELP6);
987
1020
  return;
988
1021
  }
989
1022
  const force = args.includes("--force") || args.includes("-f");
990
- let target = "copilot";
1023
+ let targets = ALL_TARGETS;
991
1024
  const targetIdx = args.findIndex((a) => a === "--target" || a === "-t");
992
1025
  if (targetIdx !== -1 && args[targetIdx + 1]) {
993
- target = args[targetIdx + 1];
994
- }
995
- const config = TARGETS[target];
996
- if (!config) {
997
- console.error(`Unknown target: ${target}`);
998
- console.error(`Valid targets: ${Object.keys(TARGETS).join(", ")}`);
999
- process.exit(1);
1026
+ const target = args[targetIdx + 1];
1027
+ const config = TARGETS[target];
1028
+ if (!config) {
1029
+ console.error(`Unknown target: ${target}`);
1030
+ console.error(`Valid targets: ${Object.keys(TARGETS).join(", ")}`);
1031
+ process.exit(1);
1032
+ }
1033
+ targets = [target];
1034
+ }
1035
+ let written = 0;
1036
+ for (const target of targets) {
1037
+ const config = TARGETS[target];
1038
+ const filePath = config.path;
1039
+ if (existsSync3(filePath) && !force) {
1040
+ console.log(` skip ${filePath} (already exists, use --force to overwrite)`);
1041
+ continue;
1042
+ }
1043
+ const content = config.wrap(SKILL_CONTENT);
1044
+ await mkdir3(dirname5(filePath), { recursive: true });
1045
+ await writeFile3(filePath, content, "utf-8");
1046
+ console.log(` \u2713 ${filePath}`);
1047
+ written++;
1000
1048
  }
1001
- const filePath = config.path;
1002
- if (existsSync3(filePath) && !force) {
1003
- console.log(` skip ${filePath} (already exists, use --force to overwrite)`);
1004
- return;
1049
+ if (written > 0) {
1050
+ console.log();
1051
+ console.log(`AI agents will now understand how to create and manage prompts with promptopskit.`);
1005
1052
  }
1006
- const content = config.wrap(SKILL_CONTENT);
1007
- await mkdir3(dirname5(filePath), { recursive: true });
1008
- await writeFile3(filePath, content, "utf-8");
1009
- console.log(` \u2713 ${filePath}`);
1010
- console.log();
1011
- console.log(`AI agents will now understand how to create and manage prompts with promptopskit.`);
1012
1053
  }
1013
1054
  var SKILL_CONTENT = `# promptopskit \u2014 Prompt Engineering Skill
1014
1055
 
@@ -1160,10 +1201,14 @@ Override model settings per environment or tier:
1160
1201
  environments:
1161
1202
  development:
1162
1203
  model: gpt-4.1-mini
1204
+ reasoning:
1205
+ effort: low
1163
1206
  sampling:
1164
1207
  temperature: 0.9
1165
1208
  production:
1166
1209
  model: gpt-5.4
1210
+ reasoning:
1211
+ effort: high
1167
1212
  sampling:
1168
1213
  temperature: 0.3
1169
1214
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/commands/validate.ts","../../src/parser/parser.ts","../../src/schema/schema.ts","../../src/parser/sections.ts","../../src/parser/loader.ts","../../src/renderer/interpolate.ts","../../src/composition/resolve-includes.ts","../../src/validation/levenshtein.ts","../../src/validation/validate.ts","../../src/cli/commands/compile.ts","../../src/cli/commands/render.ts","../../src/overrides/apply-overrides.ts","../../src/cli/commands/inspect.ts","../../src/cli/commands/init.ts","../../src/cli/commands/skill.ts","../../src/cli/index.ts"],"sourcesContent":["import { readdir } from 'node:fs/promises';\nimport { join, extname } from 'node:path';\nimport { loadPromptFile } from '../../parser/index.js';\nimport { validateAssetWithIncludes } from '../../validation/index.js';\n\nconst HELP = `\npromptopskit validate <dir>\n\nValidate all prompt .md files in a directory.\n\nOptions:\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 dir = args.find((a) => !a.startsWith('--'));\n if (!dir) {\n console.error('Error: Please provide a directory to validate.');\n process.exit(1);\n }\n\n const strict = args.includes('--strict');\n const files = await collectPromptFiles(dir);\n\n if (files.length === 0) {\n console.log(`No .md prompt files found in ${dir}`);\n return;\n }\n\n let errorCount = 0;\n let warnCount = 0;\n\n for (const file of files) {\n try {\n const { asset, raw } = await loadPromptFile(file, { defaultsRoot: dir });\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\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 matter from 'gray-matter';\nimport { PromptAssetSchema } from '../schema/index.js';\nimport type { PromptAsset } from '../schema/index.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 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});\n\n// --- Context ---\n\nexport const HistorySchema = z.object({\n max_items: z.number().int().positive().optional(),\n});\n\nexport const ContextSchema = z.object({\n inputs: z.array(z.string()).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 tools: z.array(ToolRefSchema).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', 'anthropic', 'google', 'gemini', 'openrouter', 'any']).optional(),\n model: z.string().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', '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\n tools: z.array(ToolRefSchema).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","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 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 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\n // Short-circuit: nothing to merge\n if (!hasDefaultMetadata && !hasDefaultSystem && !hasDefaultScalars) {\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 metadata,\n sections,\n };\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","/**\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 { 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',\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(asset.context?.inputs ?? []);\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.size > 0 && !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 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","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';\n\nconst HELP = `\npromptopskit compile <sourceDir> <outputDir> [options]\n\nCompile .md prompt files to JSON artifacts.\n\nOptions:\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 = args.filter((a) => !a.startsWith('--'));\n const sourceDir = positional[0];\n const outputDir = positional[1];\n\n if (!sourceDir || !outputDir) {\n console.error('Error: Please provide source and output directories.');\n console.error('Usage: promptopskit compile <sourceDir> <outputDir>');\n process.exit(1);\n }\n\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 // 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 } = await loadPromptFile(file, { defaultsRoot: sourceDir });\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}\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\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';\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 file = args.find((a) => !a.startsWith('--'));\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 { asset: parsed } = await loadPromptFile(file);\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 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 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\n return result;\n}\n","import { loadPromptFile } from '../../parser/index.js';\nimport { resolveIncludes } from '../../composition/index.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 { asset: parsed } = await loadPromptFile(file);\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 } from 'node:path';\nimport { existsSync, readFileSync } from 'node:fs';\n\nconst HELP = `\npromptopskit init [dir]\n\nScaffold a prompts directory with starter files.\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\nenvironments:\n dev:\n model: gpt-5.4-mini\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 - name: named-greeting\n variables:\n name: \"Alice\"\n app_context: \"Settings page\"\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 with temperature 0.2 (see hello.md environments)\n // - production: uses base model gpt-5.4 with default settings\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 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\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 ];\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} ./dist/prompts\"`);\n }\n } catch {\n // Ignore parse errors\n }\n }\n}\n","import { writeFile, mkdir } from 'node:fs/promises';\nimport { join, dirname } from 'node:path';\nimport { existsSync } from 'node:fs';\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\nTargets:\n copilot (default) .github/instructions/promptopskit.instructions.md\n cursor .cursor/rules/promptopskit.mdc\n generic .ai/promptopskit-skill.md\n\nOptions:\n --target, -t Target AI tool (copilot, cursor, generic)\n --force, -f Overwrite existing file\n --help, -h Show this help\n`.trim();\n\ninterface TargetConfig {\n path: string;\n wrap: (content: string) => string;\n}\n\nconst TARGETS: Record<string, TargetConfig> = {\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 generic: {\n path: '.ai/promptopskit-skill.md',\n wrap: (content) => content,\n },\n};\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 target = 'copilot';\n const targetIdx = args.findIndex((a) => a === '--target' || a === '-t');\n if (targetIdx !== -1 && args[targetIdx + 1]) {\n target = args[targetIdx + 1];\n }\n\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\n const filePath = config.path;\n\n if (existsSync(filePath) && !force) {\n console.log(` skip ${filePath} (already exists, use --force to overwrite)`);\n return;\n }\n\n const content = config.wrap(SKILL_CONTENT);\n\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, content, 'utf-8');\n console.log(` ✓ ${filePath}`);\n console.log();\n console.log(`AI agents will now understand how to create and manage prompts with promptopskit.`);\n}\n\n// ---------------------------------------------------------------------------\n// Skill content — comprehensive instructions for AI coding agents\n// ---------------------------------------------------------------------------\n\nconst SKILL_CONTENT = `# promptopskit — Prompt Engineering Skill\n\nThis project uses **promptopskit** to manage LLM prompts as code.\nPrompts live in markdown files with YAML front matter, are validated against\na schema, and render into provider-specific request bodies (OpenAI, Anthropic,\nGemini, OpenRouter). Follow these instructions when creating or editing prompts.\n\n---\n\n## Prompt file format\n\nEvery prompt is a \\`.md\\` file with two parts:\n\n1. **YAML front matter** — model settings, provider config, variables, overrides\n2. **Markdown body** — sections separated by H1 headings\n\n### Minimal example\n\n\\`\\`\\`markdown\n---\nid: greeting\nschema_version: 1\nprovider: openai\nmodel: gpt-5.4\ncontext:\n inputs:\n - name\n---\n\n# System instructions\n\nYou are a helpful assistant.\n\n# Prompt template\n\nHello {{ name }}, how can I help you?\n\\`\\`\\`\n\n---\n\n## Front matter reference\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| \\`id\\` | string | **yes** | Unique identifier for the prompt |\n| \\`schema_version\\` | number | yes | Always \\`1\\` |\n| \\`description\\` | string | no | Human-readable description |\n| \\`provider\\` | enum | no | \\`openai\\`, \\`anthropic\\`, \\`google\\`, \\`gemini\\`, \\`openrouter\\`, or \\`any\\` |\n| \\`model\\` | string | no | Model identifier (e.g. \\`gpt-5.4\\`, \\`claude-sonnet-4-20250514\\`) |\n| \\`fallback_models\\` | string[] | no | Ordered fallback model list |\n| \\`reasoning\\` | object | no | \\`{ effort: low|medium|high, budget_tokens: number }\\` |\n| \\`sampling\\` | object | no | \\`{ temperature, top_p, frequency_penalty, presence_penalty, stop, max_output_tokens }\\` |\n| \\`response\\` | object | no | \\`{ format: text|json|markdown, stream: boolean }\\` |\n| \\`tools\\` | array | no | Tool names (strings) or inline definitions with \\`{ name, description, input_schema }\\` |\n| \\`mcp\\` | object | no | \\`{ servers: [string | { name, config }] }\\` |\n| \\`context.inputs\\` | string[] | no | Declared variable names used in templates |\n| \\`context.history\\` | object | no | \\`{ max_items: number }\\` |\n| \\`includes\\` | string[] | no | Relative paths to other prompt files to include |\n| \\`environments\\` | object | no | Per-environment overrides (see Overrides) |\n| \\`tiers\\` | object | no | Per-tier overrides (see Overrides) |\n| \\`metadata\\` | object | no | \\`{ owner, tags, review_required, stable }\\` |\n\n---\n\n## Sections (markdown body)\n\nUse H1 headings to define sections. The parser recognizes these headings\n(case-insensitive):\n\n| Heading | Maps to | Purpose |\n|---------|---------|---------|\n| \\`# System instructions\\` | \\`system_instructions\\` | System/developer message |\n| \\`# Prompt template\\` | \\`prompt_template\\` | User message template |\n| \\`# Notes\\` | \\`notes\\` | Documentation only — not sent to the model |\n\nIf the body has **no H1 headings**, the entire body becomes the \\`prompt_template\\`.\n\n---\n\n## Variable interpolation\n\nUse \\`{{ variable_name }}\\` syntax in system instructions and prompt template\nsections. Variables are replaced at render time.\n\nRules:\n- Declare all variables in \\`context.inputs\\` — validation warns on undeclared usage\n- Escape literal braces with \\`\\\\\\\\{{\\` and \\`\\\\\\\\}}\\`\n- In strict mode, missing variables throw an error\n- In permissive mode, unresolved placeholders are left intact\n\n---\n\n## Includes (composition)\n\nCompose prompts from shared fragments:\n\n\\`\\`\\`yaml\nincludes:\n - ./shared/tone.md\n - ./shared/safety.md\n\\`\\`\\`\n\nIncluded files are parsed and their \\`system_instructions\\` are **prepended**\nbefore the including file's own system instructions. Includes resolve\nrecursively. Circular includes are detected and rejected.\n\n> **Note:** Included files do not inherit folder defaults. Only the top-level\n> prompt that is loaded via \\`loadPromptFile\\` receives defaults.\n\n---\n\n## Folder defaults (\\`defaults.md\\`)\n\nDefine shared defaults for a prompt tree by adding a \\`defaults.md\\` file in any\nfolder:\n\n\\`\\`\\`text\nprompts/\n├── defaults.md # global provider, model, metadata + system instructions\n└── support/\n ├── defaults.md # overrides for support/*\n └── reply.md # inherits from support/defaults.md\n\\`\\`\\`\n\nSupported default fields:\n- \\`provider\\` (front matter) — default provider for the folder\n- \\`model\\` (front matter) — default model for the folder\n- \\`metadata\\` (front matter) — merged with prompt-local metadata\n- \\`# System instructions\\` (body section) — used when the prompt has none\n\nThis lets you configure app-wide settings like \\`provider\\` and \\`model\\`\nin a single root \\`defaults.md\\`, so individual prompts only declare what\\u2019s unique to them.\n\nRules:\n- Nearest subfolder \\`defaults.md\\` overrides parent defaults\n- Prompt-local values always take precedence over defaults\n- \\`defaults.md\\` files are skipped during compilation and validation\n- \\`loadPromptFile\\` defaults the search boundary to the file's own directory;\n pass \\`defaultsRoot\\` to enable ancestor traversal\n\n---\n\n## Environment & tier overrides\n\nOverride model settings per environment or tier:\n\n\\`\\`\\`yaml\nenvironments:\n development:\n model: gpt-4.1-mini\n sampling:\n temperature: 0.9\n production:\n model: gpt-5.4\n sampling:\n temperature: 0.3\n\ntiers:\n free:\n model: gpt-4.1-mini\n sampling:\n max_output_tokens: 500\n premium:\n model: gpt-5.4\n\\`\\`\\`\n\nOverridable fields: \\`model\\`, \\`fallback_models\\`, \\`reasoning\\`, \\`sampling\\`,\n\\`response\\`, \\`tools\\`.\n\nOverride application order: **base → environment → tier → runtime**.\n\n---\n\n## Test sidecars\n\nCreate a \\`.test.yaml\\` file alongside a prompt to define test cases:\n\n\\`\\`\\`yaml\n# greeting.test.yaml\ncases:\n - name: basic\n variables:\n name: \"World\"\n - name: formal\n variables:\n name: \"Dr. Smith\"\n\\`\\`\\`\n\n---\n\n## Using the library (TypeScript / JavaScript)\n\n### Quick start\n\n\\`\\`\\`typescript\nimport { createPromptOpsKit } from 'promptopskit';\n\nconst kit = createPromptOpsKit({ sourceDir: './prompts' });\n\n// Load → resolve includes → apply overrides → render\nconst request = await kit.renderPrompt('greeting', {\n variables: { name: 'Alice' },\n environment: 'production',\n});\n\n// request.body is ready for the provider's API\nconst response = await fetch('https://api.openai.com/v1/chat/completions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: \\`Bearer $\\{apiKey}\\`,\n },\n body: JSON.stringify(request.body),\n});\n\\`\\`\\`\n\n### Step-by-step API\n\n\\`\\`\\`typescript\nimport {\n parsePrompt,\n resolveIncludes,\n applyOverrides,\n getAdapter,\n} from 'promptopskit';\nimport { readFileSync } from 'fs';\n\n// 1. Parse a prompt file\nconst source = readFileSync('./prompts/greeting.md', 'utf-8');\nconst asset = parsePrompt(source, 'greeting.md');\n\n// 2. Resolve includes\nconst resolved = await resolveIncludes(asset, './prompts');\n\n// 3. Apply overrides\nconst configured = applyOverrides(resolved, {\n environment: 'production',\n tier: 'premium',\n});\n\n// 4. Get provider adapter and render\nconst adapter = getAdapter(configured.provider ?? 'openai');\nconst request = adapter.render(configured, {\n variables: { name: 'Alice' },\n history: [\n { role: 'user', content: 'Previous message' },\n { role: 'assistant', content: 'Previous response' },\n ],\n});\n\\`\\`\\`\n\n### Available provider adapters\n\n| Provider | Import path | Provider request format |\n|----------|------------|----------------------|\n| OpenAI | \\`promptopskit\\` or \\`promptopskit/openai\\` | Chat Completions API |\n| Anthropic | \\`promptopskit/anthropic\\` | Messages API |\n| Gemini | \\`promptopskit/gemini\\` | GenerateContent API |\n| OpenRouter | \\`promptopskit/openrouter\\` | OpenAI-compatible + extras |\n\n### Validation\n\n\\`\\`\\`typescript\nimport { validateAsset, parsePrompt } from 'promptopskit';\n\nconst asset = parsePrompt(source);\nconst result = validateAsset(asset);\n\nif (!result.valid) {\n console.error(result.errors); // Error codes: POK001-POK021\n}\n\\`\\`\\`\n\n### Testing helpers\n\n\\`\\`\\`typescript\nimport { createMockAsset, parseTestPrompt } from 'promptopskit/testing';\n\n// Create a mock asset for unit tests\nconst mock = createMockAsset({ model: 'gpt-4.1-mini' });\n\n// Parse an inline prompt string for tests\nconst asset = parseTestPrompt(\\`\n---\nid: test\nschema_version: 1\nprovider: openai\nmodel: gpt-5.4\n---\n\n# Prompt template\n\nHello {{ name }}\n\\`);\n\\`\\`\\`\n\n---\n\n## CLI commands\n\n| Command | Description |\n|---------|-------------|\n| \\`promptopskit init [dir]\\` | Scaffold a prompts directory with starter files (including \\`defaults.md\\`) |\n| \\`promptopskit validate <dir>\\` | Validate all prompt files in a directory |\n| \\`promptopskit compile <src> <out>\\` | Compile .md prompts to JSON artifacts |\n| \\`promptopskit render <file> [--set key=value]\\` | Render a prompt preview |\n| \\`promptopskit inspect <file>\\` | Print the normalized prompt asset |\n\n---\n\n## Conventions to follow\n\n1. **One prompt per file** — each \\`.md\\` file is a single prompt asset\n2. **Always set \\`id\\` and \\`schema_version: 1\\`** in front matter (or inherit \\`schema_version\\` from \\`defaults.md\\`)\n3. **Declare all variables** in \\`context.inputs\\` that appear in templates\n4. **Use includes** for shared system instructions (tone, safety, formatting)\n5. **Keep prompt templates focused** — compose behavior via includes, not duplication\n6. **Use environment overrides** for dev/staging/prod model differences\n7. **Add test sidecars** (\\`.test.yaml\\`) for critical prompts\n8. **Run \\`promptopskit validate\\`** before committing changes\n9. **Use \\`defaults.md\\`** to share provider, model, metadata, and system instructions across a folder\n10. **Variable names** should be \\`snake_case\\`\n11. **Prompt file names** should be \\`kebab-case.md\\`\n`.trimEnd();\n","import { 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 <dir> Validate prompt files\n compile <src> <out> [options] 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 // Dynamic import to read version from package.json\n console.log('0.0.1');\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"],"mappings":";;;AAAA,SAAS,eAAe;AACxB,SAAS,QAAAA,OAAM,eAAe;;;ACD9B,OAAO,YAAY;;;ACAnB,SAAS,SAAS;AAIX,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,MAAM,EAAE,OAAO;AAAA,EACf,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,cAAc,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAC/C,CAAC;AAIM,IAAM,gBAAgB,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,mBAAmB,CAAC;AAI/D,IAAM,qBAAqB,EAAE,MAAM;AAAA,EACxC,EAAE,OAAO;AAAA,EACT,EAAE,OAAO;AAAA,IACP,MAAM,EAAE,OAAO;AAAA,IACf,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACzC,CAAC;AACH,CAAC;AAMM,IAAM,kBAAkB,EAAE,OAAO;AAAA,EACtC,QAAQ,EAAE,KAAK,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,SAAS;AAAA,EACnD,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AACtD,CAAC;AAIM,IAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC/C,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACzC,mBAAmB,EAAE,OAAO,EAAE,SAAS;AAAA,EACvC,kBAAkB,EAAE,OAAO,EAAE,SAAS;AAAA,EACtC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,mBAAmB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAC1D,CAAC;AAIM,IAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,QAAQ,EAAE,KAAK,CAAC,QAAQ,QAAQ,UAAU,CAAC,EAAE,SAAS;AAAA,EACtD,QAAQ,EAAE,QAAQ,EAAE,SAAS;AAC/B,CAAC;AAIM,IAAM,gBAAgB,EAAE,OAAO;AAAA,EACpC,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAClD,CAAC;AAEM,IAAM,gBAAgB,EAAE,OAAO;AAAA,EACpC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACrC,SAAS,cAAc,SAAS;AAClC,CAAC;AAIM,IAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,iBAAiB,EAAE,QAAQ,EAAE,SAAS;AAAA,EACtC,QAAQ,EAAE,QAAQ,EAAE,SAAS;AAC/B,CAAC;AAIM,IAAM,YAAY,EAAE,OAAO;AAAA,EAChC,SAAS,EAAE,MAAM,kBAAkB,EAAE,SAAS;AAChD,CAAC;AAIM,IAAM,6BAA6B,EAAE,OAAO;AAAA,EACjD,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,iBAAiB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC9C,WAAW,gBAAgB,SAAS;AAAA,EACpC,UAAU,eAAe,SAAS;AAAA,EAClC,UAAU,eAAe,SAAS;AAAA,EAClC,OAAO,EAAE,MAAM,aAAa,EAAE,SAAS;AACzC,CAAC;AAMM,IAAM,eAAe,EAAE,OAAO;AAAA,EACnC,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,UAAU,EAAE,OAAO,EAAE,SAAS;AAChC,CAAC;AAIM,IAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,qBAAqB,EAAE,OAAO,EAAE,SAAS;AAAA,EACzC,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,EACrC,OAAO,EAAE,OAAO,EAAE,SAAS;AAC7B,CAAC;AAIM,IAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,UAAU,EAAE,KAAK,CAAC,UAAU,aAAa,UAAU,UAAU,cAAc,KAAK,CAAC,EAAE,SAAS;AAAA,EAC5F,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,UAAU,eAAe,SAAS;AAAA,EAClC,UAAU,EAAE,OAAO;AAAA,IACjB,qBAAqB,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3C,CAAC,EAAE,SAAS;AACd,CAAC;AAMM,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,IAAI,EAAE,OAAO;AAAA,EACb,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EACrD,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EAEjC,UAAU,EAAE,KAAK,CAAC,UAAU,aAAa,UAAU,UAAU,cAAc,KAAK,CAAC,EAAE,SAAS;AAAA,EAC5F,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,iBAAiB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAE9C,WAAW,gBAAgB,SAAS;AAAA,EACpC,UAAU,eAAe,SAAS;AAAA,EAClC,UAAU,eAAe,SAAS;AAAA,EAElC,OAAO,EAAE,MAAM,aAAa,EAAE,SAAS;AAAA,EACvC,KAAK,UAAU,SAAS;AAAA,EAExB,SAAS,cAAc,SAAS;AAAA,EAEhC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAEvC,cAAc,EAAE,OAAO,0BAA0B,EAAE,SAAS;AAAA,EAC5D,OAAO,EAAE,OAAO,0BAA0B,EAAE,SAAS;AAAA,EAErD,UAAU,eAAe,SAAS;AAAA;AAAA,EAGlC,UAAU,eAAe,SAAS;AAAA,EAClC,QAAQ,aAAa,SAAS;AAChC,CAAC;;;AC9ID,IAAM,cAA8C;AAAA,EAClD,uBAAuB;AAAA,EACvB,mBAAmB;AAAA,EACnB,SAAS;AACX;AAOO,SAAS,gBAAgB,MAAwB;AACtD,QAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,QAAM,WAAqB,CAAC;AAE5B,MAAI,aAAoC;AACxC,MAAI,eAAyB,CAAC;AAC9B,MAAI,aAAa;AAEjB,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,KAAK,MAAM,YAAY;AACvC,QAAI,SAAS;AAEX,UAAI,YAAY;AACd,iBAAS,UAAU,IAAI,aAAa,KAAK,IAAI,EAAE,KAAK;AAAA,MACtD;AAEA,mBAAa;AACb,YAAM,UAAU,QAAQ,CAAC,EAAE,KAAK,EAAE,YAAY;AAC9C,mBAAa,YAAY,OAAO,KAAK;AACrC,qBAAe,CAAC;AAAA,IAClB,OAAO;AACL,mBAAa,KAAK,IAAI;AAAA,IACxB;AAAA,EACF;AAGA,MAAI,YAAY;AACd,aAAS,UAAU,IAAI,aAAa,KAAK,IAAI,EAAE,KAAK;AAAA,EACtD;AAGA,MAAI,CAAC,YAAY;AACf,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,SAAS;AACX,eAAS,kBAAkB;AAAA,IAC7B;AAAA,EACF;AAEA,SAAO;AACT;;;AFvCO,SAAS,YAAY,SAAiB,UAAgC;AAC3E,QAAM,EAAE,MAAM,aAAa,SAAS,KAAK,IAAI,OAAO,OAAO;AAE3D,QAAM,WAAW,gBAAgB,IAAI;AAErC,QAAM,MAAM;AAAA,IACV,GAAG;AAAA,IACH;AAAA,IACA,QAAQ,WAAW,EAAE,WAAW,SAAS,IAAI;AAAA,EAC/C;AAEA,QAAM,QAAQ,kBAAkB,MAAM,GAAG;AAEzC,SAAO;AAAA,IACL;AAAA,IACA,KAAK;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AGrCA,SAAS,gBAAgB;AACzB,SAAS,SAAS,MAAM,eAAe;AACvC,OAAOC,aAAY;AAOnB,IAAM,qBAAqB;AAa3B,eAAsB,eAAe,UAAkB,UAA6B,CAAC,GAAyB;AAC5G,QAAM,UAAU,MAAM,SAAS,UAAU,OAAO;AAChD,QAAM,SAAS,YAAY,SAAS,QAAQ;AAG5C,QAAM,OAAO,QAAQ,gBAAgB,QAAQ,QAAQ;AACrD,QAAM,WAAW,MAAM,oBAAoB,UAAU,IAAI;AACzD,QAAM,QAAQ,cAAc,OAAO,OAAO,QAAQ;AAElD,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;AAEA,eAAe,oBAAoB,UAAkB,cAAgD;AACnG,QAAM,cAAc,sBAAsB,UAAU,YAAY;AAChE,MAAI,SAAyB,CAAC;AAE9B,aAAW,OAAO,aAAa;AAC7B,UAAM,eAAe,KAAK,KAAK,kBAAkB;AACjD,QAAI;AACF,YAAM,kBAAkB,MAAM,SAAS,cAAc,OAAO;AAC5D,YAAM,WAAW,cAAc,eAAe;AAC9C,eAAS,cAAc,QAAQ,QAAQ;AAAA,IACzC,SAAS,OAAO;AACd,UAAK,MAAgC,SAAS,UAAU;AACtD,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,UAAkB,cAAiC;AAChF,QAAM,OAAiB,CAAC;AACxB,MAAI,UAAU,QAAQ,QAAQ,QAAQ,CAAC;AACvC,QAAM,WAAW,eAAe,QAAQ,YAAY,IAAI;AAExD,SAAO,MAAM;AACX,SAAK,QAAQ,OAAO;AACpB,QAAK,YAAY,YAAY,YAAa,YAAY,QAAQ,OAAO,GAAG;AACtE;AAAA,IACF;AACA,cAAU,QAAQ,OAAO;AAAA,EAC3B;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,SAAiC;AACtD,QAAM,EAAE,MAAM,aAAa,SAAS,KAAK,IAAIC,QAAO,OAAO;AAC3D,QAAM,WAAW,gBAAgB,IAAI;AAErC,SAAO,qBAAqB,MAAM;AAAA,IAChC,GAAG;AAAA,IACH,UAAU;AAAA,MACR,qBAAqB,SAAS;AAAA,IAChC;AAAA,EACF,CAAC;AACH;AAEA,SAAS,cAAc,MAAsB,OAAuC;AAClF,SAAO;AAAA,IACL,UAAU,MAAM,YAAY,KAAK;AAAA,IACjC,OAAO,MAAM,SAAS,KAAK;AAAA,IAC3B,UAAU;AAAA,MACR,GAAI,KAAK,YAAY,CAAC;AAAA,MACtB,GAAI,MAAM,YAAY,CAAC;AAAA,IACzB;AAAA,IACA,UAAU;AAAA,MACR,GAAI,KAAK,YAAY,CAAC;AAAA,MACtB,GAAI,MAAM,YAAY,CAAC;AAAA,IACzB;AAAA,EACF;AACF;AAEA,SAAS,cAAc,OAA6B,UAAgD;AAClG,QAAM,qBAAqB,SAAS,YAAY,OAAO,KAAK,SAAS,QAAQ,EAAE,SAAS;AACxF,QAAM,mBAAmB,CAAC,CAAC,SAAS,UAAU;AAC9C,QAAM,oBAAoB,SAAS,aAAa,UAC3C,SAAS,UAAU;AAGxB,MAAI,CAAC,sBAAsB,CAAC,oBAAoB,CAAC,mBAAmB;AAClE,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB;AAAA,IACrB,GAAI,SAAS,YAAY,CAAC;AAAA,IAC1B,GAAI,MAAM,YAAY,CAAC;AAAA,EACzB;AACA,QAAM,WAAW,OAAO,KAAK,cAAc,EAAE,SAAS,IAAI,iBAAiB;AAE3E,QAAM,qBAAqB,MAAM,UAAU,uBAAuB,SAAS,UAAU;AAErF,QAAM,WAAW,MAAM,WACnB,EAAE,GAAG,MAAM,UAAU,qBAAqB,mBAAmB,IAC7D,qBACE,EAAE,qBAAqB,mBAAmB,IAC1C;AAEN,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAU,MAAM,YAAY,SAAS;AAAA,IACrC,OAAO,MAAM,SAAS,SAAS;AAAA,IAC/B;AAAA,IACA;AAAA,EACF;AACF;;;AChIA,IAAM,cAAc;AACpB,IAAM,eAAe;AACrB,IAAM,qBAAqB;AAWpB,SAAS,YACd,UACA,WACA,UAA8B,CAAC,GACvB;AACR,QAAM,EAAE,SAAS,MAAM,IAAI;AAG3B,MAAI,SAAS,SAAS,QAAQ,cAAc,kBAAkB;AAE9D,WAAS,OAAO,QAAQ,aAAa,CAAC,OAAO,SAAiB;AAC5D,QAAI,QAAQ,WAAW;AACrB,aAAO,UAAU,IAAI;AAAA,IACvB;AACA,QAAI,QAAQ;AACV,YAAM,IAAI,MAAM,+BAA+B,IAAI,GAAG;AAAA,IACxD;AACA,WAAO;AAAA,EACT,CAAC;AAGD,WAAS,OAAO,WAAW,oBAAoB,IAAI;AAEnD,SAAO;AACT;AAKO,SAAS,iBAAiB,UAA4B;AAC3D,QAAM,OAAO,oBAAI,IAAY;AAC7B,MAAI;AACJ,QAAM,KAAK,IAAI,OAAO,YAAY,QAAQ,GAAG;AAC7C,UAAQ,QAAQ,GAAG,KAAK,QAAQ,OAAO,MAAM;AAC3C,SAAK,IAAI,MAAM,CAAC,CAAC;AAAA,EACnB;AACA,SAAO,CAAC,GAAG,IAAI;AACjB;;;ACtDA,SAAS,YAAAC,iBAAgB;AACzB,SAAS,WAAAC,UAAS,WAAAC,gBAAe;AAQjC,eAAsB,gBACpB,OACA,UACA,UAAuB,oBAAI,IAAI,GACT;AACtB,MAAI,CAAC,MAAM,YAAY,MAAM,SAAS,WAAW,GAAG;AAClD,WAAO;AAAA,EACT;AAEA,QAAM,UAAUC,SAAQ,QAAQ;AAChC,QAAM,eAAeC,SAAQ,QAAQ;AAErC,MAAI,QAAQ,IAAI,YAAY,GAAG;AAC7B,UAAM,IAAI,MAAM,8BAA8B,YAAY,EAAE;AAAA,EAC9D;AACA,UAAQ,IAAI,YAAY;AAExB,MAAI,2BAA2B;AAE/B,aAAW,eAAe,MAAM,UAAU;AACxC,UAAM,WAAWA,SAAQ,SAAS,WAAW;AAE7C,QAAI,QAAQ,IAAI,QAAQ,GAAG;AACzB,YAAM,IAAI,MAAM,8BAA8B,QAAQ,mBAAmB,QAAQ,GAAG;AAAA,IACtF;AAEA,UAAM,UAAU,MAAMC,UAAS,UAAU,OAAO;AAChD,UAAM,EAAE,OAAO,cAAc,IAAI,YAAY,SAAS,QAAQ;AAG9D,UAAM,WAAW,MAAM,gBAAgB,eAAe,UAAU,IAAI,IAAI,OAAO,CAAC;AAGhF,QAAI,SAAS,UAAU,qBAAqB;AAC1C,kCAA4B,SAAS,SAAS,sBAAsB;AAAA,IACtE;AAAA,EACF;AAGA,QAAM,cAAc,MAAM,UAAU,uBAAuB;AAC3D,QAAM,kBAAkB,2BAA2B,aAAa,KAAK,KAAK;AAE1E,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAU;AAAA,MACR,GAAG,MAAM;AAAA,MACT,qBAAqB;AAAA,IACvB;AAAA;AAAA,IAEA,UAAU;AAAA,EACZ;AACF;;;ACxDO,SAAS,YAAY,GAAW,GAAmB;AACxD,QAAM,IAAI,EAAE;AACZ,QAAM,IAAI,EAAE;AAEZ,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,MAAM,EAAG,QAAO;AAEpB,QAAM,KAAiB,MAAM,KAAK,EAAE,QAAQ,IAAI,EAAE,GAAG,MAAM,MAAM,IAAI,CAAC,EAAE,KAAK,CAAC,CAAa;AAE3F,WAAS,IAAI,GAAG,KAAK,GAAG,IAAK,IAAG,CAAC,EAAE,CAAC,IAAI;AACxC,WAAS,IAAI,GAAG,KAAK,GAAG,IAAK,IAAG,CAAC,EAAE,CAAC,IAAI;AAExC,WAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC3B,aAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC3B,YAAM,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI;AACzC,SAAG,CAAC,EAAE,CAAC,IAAI,KAAK;AAAA,QACd,GAAG,IAAI,CAAC,EAAE,CAAC,IAAI;AAAA,QACf,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI;AAAA,QACf,GAAG,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,SAAO,GAAG,CAAC,EAAE,CAAC;AAChB;;;ACTA,IAAM,0BAA0B,oBAAI,IAAI;AAAA,EACtC;AAAA,EAAM;AAAA,EAAkB;AAAA,EAAe;AAAA,EAAY;AAAA,EAAS;AAAA,EAC5D;AAAA,EAAa;AAAA,EAAY;AAAA,EAAY;AAAA,EAAS;AAAA,EAAO;AAAA,EAAW;AAAA,EAChE;AAAA,EAAgB;AAAA,EAAS;AAC3B,CAAC;AAKM,SAAS,cACd,OACA,iBACA,UACwB;AACxB,QAAM,SAA4B,CAAC;AACnC,QAAM,WAA8B,CAAC;AAGrC,QAAM,SAAS,kBAAkB,UAAU,KAAK;AAChD,MAAI,CAAC,OAAO,SAAS;AACnB,eAAW,SAAS,OAAO,MAAM,QAAQ;AACvC,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS,mBAAmB,MAAM,KAAK,KAAK,GAAG,CAAC,KAAK,MAAM,OAAO;AAAA,QAClE;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAGA,MAAI,CAAC,MAAM,IAAI;AACb,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH;AAGA,MAAI,CAAC,MAAM,UAAU,uBAAuB,CAAC,MAAM,UAAU,iBAAiB;AAC5E,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH;AAGA,MAAI,iBAAiB;AACnB,eAAW,OAAO,iBAAiB;AACjC,UAAI,CAAC,wBAAwB,IAAI,GAAG,GAAG;AACrC,cAAM,aAAa,iBAAiB,KAAK,uBAAuB;AAChE,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS,gCAAgC,GAAG;AAAA,UAC5C;AAAA,UACA,YAAY,aAAa,iBAAiB,UAAU,OAAO;AAAA,QAC7D,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,QAAM,iBAAiB,IAAI,IAAI,MAAM,SAAS,UAAU,CAAC,CAAC;AAC1D,QAAM,WAAW,oBAAI,IAAY;AAEjC,MAAI,MAAM,UAAU,qBAAqB;AACvC,eAAW,KAAK,iBAAiB,MAAM,SAAS,mBAAmB,GAAG;AACpE,eAAS,IAAI,CAAC;AAAA,IAChB;AAAA,EACF;AACA,MAAI,MAAM,UAAU,iBAAiB;AACnC,eAAW,KAAK,iBAAiB,MAAM,SAAS,eAAe,GAAG;AAChE,eAAS,IAAI,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,aAAW,KAAK,UAAU;AACxB,QAAI,eAAe,OAAO,KAAK,CAAC,eAAe,IAAI,CAAC,GAAG;AACrD,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,gBAAgB,CAAC;AAAA,QAC1B;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAGA,aAAW,KAAK,gBAAgB;AAC9B,QAAI,CAAC,SAAS,IAAI,CAAC,GAAG;AACpB,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,aAAa,CAAC;AAAA,QACvB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AACF;AAMA,eAAsB,0BACpB,OACA,UACA,iBACiC;AAEjC,QAAM,SAAS,cAAc,OAAO,iBAAiB,QAAQ;AAG7D,MAAI,MAAM,YAAY,MAAM,SAAS,SAAS,GAAG;AAC/C,QAAI;AACF,YAAM,gBAAgB,OAAO,QAAQ;AAAA,IACvC,SAAS,KAAK;AACZ,YAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,YAAM,aAAa,QAAQ,SAAS,kBAAkB;AACtD,aAAO,OAAO,KAAK;AAAA,QACjB,MAAM,aAAa,WAAW;AAAA,QAC9B,SAAS,aACL,8BAA8B,OAAO,KACrC,8BAA8B,OAAO;AAAA,QACzC;AAAA,MACF,CAAC;AACD,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAe,YAA6C;AACpF,MAAI;AACJ,MAAI,WAAW;AAEf,aAAW,aAAa,YAAY;AAClC,UAAM,OAAO,YAAY,MAAM,YAAY,GAAG,UAAU,YAAY,CAAC;AACrE,QAAI,OAAO,YAAY,QAAQ,GAAG;AAChC,iBAAW;AACX,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;;;ARrKA,IAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQX,KAAK;AAEP,eAAsB,SAAS,MAA+B;AAC5D,MAAI,KAAK,SAAS,QAAQ,KAAK,KAAK,SAAS,IAAI,GAAG;AAClD,YAAQ,IAAI,IAAI;AAChB;AAAA,EACF;AAEA,QAAM,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,IAAI,CAAC;AAChD,MAAI,CAAC,KAAK;AACR,YAAQ,MAAM,gDAAgD;AAC9D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,KAAK,SAAS,UAAU;AACvC,QAAM,QAAQ,MAAM,mBAAmB,GAAG;AAE1C,MAAI,MAAM,WAAW,GAAG;AACtB,YAAQ,IAAI,gCAAgC,GAAG,EAAE;AACjD;AAAA,EACF;AAEA,MAAI,aAAa;AACjB,MAAI,YAAY;AAEhB,aAAW,QAAQ,OAAO;AACxB,QAAI;AACF,YAAM,EAAE,OAAO,IAAI,IAAI,MAAM,eAAe,MAAM,EAAE,cAAc,IAAI,CAAC;AACvE,YAAM,SAAS,MAAM,0BAA0B,OAAO,MAAM,OAAO,KAAK,IAAI,WAAW,CAAC;AAExF,UAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,sBAAc,OAAO,OAAO;AAC5B,gBAAQ,MAAM,YAAO,IAAI,EAAE;AAC3B,mBAAW,OAAO,OAAO,QAAQ;AAC/B,kBAAQ,MAAM,OAAO,IAAI,IAAI,KAAK,IAAI,OAAO,EAAE;AAAA,QACjD;AAAA,MACF,OAAO;AACL,gBAAQ,IAAI,YAAO,IAAI,EAAE;AAAA,MAC3B;AAEA,UAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,qBAAa,OAAO,SAAS;AAC7B,mBAAW,QAAQ,OAAO,UAAU;AAClC,gBAAM,aAAa,KAAK,aAAa,KAAK,KAAK,UAAU,MAAM;AAC/D,kBAAQ,KAAK,cAAS,KAAK,IAAI,KAAK,KAAK,OAAO,GAAG,UAAU,EAAE;AAAA,QACjE;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ;AACA,YAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,cAAQ,MAAM,YAAO,IAAI,EAAE;AAC3B,cAAQ,MAAM,OAAO,OAAO,EAAE;AAAA,IAChC;AAAA,EACF;AAEA,UAAQ,IAAI;AACZ,UAAQ,IAAI,aAAa,MAAM,MAAM,aAAa,UAAU,cAAc,SAAS,aAAa;AAEhG,MAAI,aAAa,KAAM,UAAU,YAAY,GAAI;AAC/C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,eAAe,mBAAmB,KAAgC;AAChE,QAAM,UAAoB,CAAC;AAC3B,QAAM,UAAU,MAAM,QAAQ,KAAK,EAAE,eAAe,MAAM,WAAW,KAAK,CAAC;AAC3E,aAAW,SAAS,SAAS;AAC3B,QACE,MAAM,OAAO,KACV,QAAQ,MAAM,IAAI,MAAM,SACxB,CAAC,MAAM,KAAK,SAAS,UAAU,KAC/B,MAAM,SAAS,eAClB;AACA,cAAQ,KAAKC,MAAK,MAAM,cAAc,KAAK,MAAM,IAAI,CAAC;AAAA,IACxD;AAAA,EACF;AACA,SAAO,QAAQ,KAAK;AACtB;;;AS1FA,SAAS,WAAAC,UAAS,WAAW,OAAO,UAAU;AAC9C,SAAS,QAAAC,OAAM,WAAAC,UAAS,UAAU,WAAAC,gBAAe;AAIjD,IAAMC,QAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUX,KAAK;AAEP,eAAsB,QAAQ,MAA+B;AAC3D,MAAI,KAAK,SAAS,QAAQ,KAAK,KAAK,SAAS,IAAI,GAAG;AAClD,YAAQ,IAAIA,KAAI;AAChB;AAAA,EACF;AAEA,QAAM,aAAa,KAAK,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,IAAI,CAAC;AACzD,QAAM,YAAY,WAAW,CAAC;AAC9B,QAAM,YAAY,WAAW,CAAC;AAE9B,MAAI,CAAC,aAAa,CAAC,WAAW;AAC5B,YAAQ,MAAM,sDAAsD;AACpE,YAAQ,MAAM,qDAAqD;AACnE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,KAAK,SAAS,WAAW;AACxC,QAAM,UAAU,KAAK,SAAS,YAAY;AAC1C,QAAM,SAAS,QAAQ,MAAM,UAAU,KAAK;AAE5C,MAAI,WAAW,UAAU,WAAW,OAAO;AACzC,YAAQ,MAAM,0BAA0B,MAAM,yBAAyB;AACvE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,QAAQ,MAAMC,oBAAmB,SAAS;AAEhD,MAAI,MAAM,WAAW,GAAG;AACtB,YAAQ,IAAI,gCAAgC,SAAS,EAAE;AACvD;AAAA,EACF;AAGA,MAAI,CAAC,WAAW,CAAC,QAAQ;AACvB,UAAM,GAAG,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EACtD;AAEA,MAAI,WAAW;AACf,MAAI,SAAS;AAEb,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,SAAS,WAAW,IAAI,EAAE,QAAQ,SAAS,EAAE;AACzD,UAAM,SAAS,WAAW,QAAQ,SAAS;AAC3C,UAAM,UAAUC,MAAK,WAAW,MAAM,MAAM;AAE5C,QAAI;AACF,YAAM,EAAE,OAAO,OAAO,IAAI,MAAM,eAAe,MAAM,EAAE,cAAc,UAAU,CAAC;AAGhF,YAAM,QAAS,OAAO,YAAY,OAAO,SAAS,SAAS,IACvD,MAAM,gBAAgB,QAAQ,IAAI,IAClC;AAEJ,UAAI,QAAQ;AACV,gBAAQ,IAAI,mBAAmB,OAAO,EAAE;AAAA,MAC1C,OAAO;AACL,cAAM,MAAMC,SAAQ,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;AAEjD,YAAI,WAAW,OAAO;AACpB,gBAAM,aAAa,kBAAkB,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA;AACnE,gBAAM,UAAU,SAAS,YAAY,OAAO;AAAA,QAC9C,OAAO;AACL,gBAAM,UAAU,SAAS,KAAK,UAAU,OAAO,MAAM,CAAC,IAAI,MAAM,OAAO;AAAA,QACzE;AACA,gBAAQ,IAAI,YAAO,OAAO,EAAE;AAAA,MAC9B;AACA;AAAA,IACF,SAAS,KAAK;AACZ;AACA,YAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,cAAQ,MAAM,YAAO,IAAI,EAAE;AAC3B,cAAQ,MAAM,OAAO,OAAO,EAAE;AAAA,IAChC;AAAA,EACF;AAEA,UAAQ,IAAI;AACZ,MAAI,QAAQ;AACV,YAAQ,IAAI,YAAY,QAAQ,+BAA+B,MAAM,WAAW;AAAA,EAClF,OAAO;AACL,YAAQ,IAAI,YAAY,QAAQ,aAAa,MAAM,WAAW;AAAA,EAChE;AAEA,MAAI,SAAS,GAAG;AACd,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,SAAS,QAAQ,MAAgB,MAAkC;AACjE,QAAM,MAAM,KAAK,QAAQ,IAAI;AAC7B,MAAI,OAAO,KAAK,MAAM,IAAI,KAAK,QAAQ;AACrC,WAAO,KAAK,MAAM,CAAC;AAAA,EACrB;AACA,SAAO;AACT;AAEA,eAAeF,oBAAmB,KAAgC;AAChE,QAAM,UAAoB,CAAC;AAC3B,QAAM,UAAU,MAAMG,SAAQ,KAAK,EAAE,eAAe,MAAM,WAAW,KAAK,CAAC;AAC3E,aAAW,SAAS,SAAS;AAC3B,QACE,MAAM,OAAO,KACVC,SAAQ,MAAM,IAAI,MAAM,SACxB,CAAC,MAAM,KAAK,SAAS,UAAU,KAC/B,MAAM,SAAS,eAClB;AACA,cAAQ,KAAKH,MAAK,MAAM,cAAc,KAAK,MAAM,IAAI,CAAC;AAAA,IACxD;AAAA,EACF;AACA,SAAO,QAAQ,KAAK;AACtB;;;AC/HA,SAAS,YAAAI,iBAAgB;AACzB,SAAS,kBAAkB;;;ACapB,SAAS,eACd,OACA,UAA2B,CAAC,GACf;AACb,MAAI,SAAS,EAAE,GAAG,MAAM;AAGxB,MAAI,QAAQ,eAAe,OAAO,eAAe,QAAQ,WAAW,GAAG;AACrE,aAAS,cAAc,QAAQ,OAAO,aAAa,QAAQ,WAAW,CAAC;AAAA,EACzE;AAGA,MAAI,QAAQ,QAAQ,OAAO,QAAQ,QAAQ,IAAI,GAAG;AAChD,aAAS,cAAc,QAAQ,OAAO,MAAM,QAAQ,IAAI,CAAC;AAAA,EAC3D;AAGA,MAAI,QAAQ,SAAS;AACnB,aAAS,cAAc,QAAQ,QAAQ,OAAO;AAAA,EAChD;AAEA,SAAO;AACT;AAEA,SAAS,cACP,MACA,UACa;AACb,QAAM,SAAS,EAAE,GAAG,KAAK;AAEzB,MAAI,SAAS,UAAU,OAAW,QAAO,QAAQ,SAAS;AAC1D,MAAI,SAAS,oBAAoB,OAAW,QAAO,kBAAkB,SAAS;AAC9E,MAAI,SAAS,UAAU,OAAW,QAAO,QAAQ,SAAS;AAE1D,MAAI,SAAS,cAAc,QAAW;AACpC,WAAO,YAAY,EAAE,GAAG,OAAO,WAAW,GAAG,SAAS,UAAU;AAAA,EAClE;AACA,MAAI,SAAS,aAAa,QAAW;AACnC,WAAO,WAAW,EAAE,GAAG,OAAO,UAAU,GAAG,SAAS,SAAS;AAAA,EAC/D;AACA,MAAI,SAAS,aAAa,QAAW;AACnC,WAAO,WAAW,EAAE,GAAG,OAAO,UAAU,GAAG,SAAS,SAAS;AAAA,EAC/D;AAEA,SAAO;AACT;;;ADpDA,IAAMC,QAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWX,KAAK;AAEP,eAAsB,OAAO,MAA+B;AAC1D,MAAI,KAAK,SAAS,QAAQ,KAAK,KAAK,SAAS,IAAI,GAAG;AAClD,YAAQ,IAAIA,KAAI;AAChB;AAAA,EACF;AAEA,QAAM,OAAO,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,IAAI,CAAC;AACjD,MAAI,CAAC,MAAM;AACT,YAAQ,MAAM,gDAAgD;AAC9D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,MAAMC,SAAQ,MAAM,OAAO;AACjC,QAAM,OAAOA,SAAQ,MAAM,QAAQ;AACnC,QAAM,WAAWA,SAAQ,MAAM,QAAQ;AACvC,QAAM,aAAa,KAAK,SAAS,QAAQ;AAGzC,MAAI,YAAoC,CAAC;AAEzC,MAAI,UAAU;AACZ,UAAM,cAAc,MAAMC,UAAS,UAAU,OAAO;AACpD,gBAAY,KAAK,MAAM,WAAW;AAAA,EACpC,OAAO;AAEL,UAAM,cAAc,KAAK,QAAQ,SAAS,YAAY;AACtD,QAAI,WAAW,WAAW,GAAG;AAC3B,YAAM,EAAE,SAAS,KAAK,IAAI,MAAM,OAAO,aAAa;AACpD,YAAM,iBAAiB,MAAMA,UAAS,aAAa,OAAO;AAE1D,YAAMC,UAAS,KAAK;AAAA,EAAQ,cAAc;AAAA,CAAO;AACjD,YAAM,OAAOA,QAAO;AACpB,UAAI,KAAK,QAAQ,CAAC,GAAG,WAAW;AAC9B,oBAAY,KAAK,MAAM,CAAC,EAAE;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,QAAM,EAAE,OAAO,OAAO,IAAI,MAAM,eAAe,IAAI;AAGnD,QAAM,WAAY,OAAO,YAAY,OAAO,SAAS,SAAS,IAC1D,MAAM,gBAAgB,QAAQ,IAAI,IAClC;AAGJ,QAAM,aAAa,eAAe,UAAU;AAAA,IAC1C,aAAa;AAAA,IACb;AAAA,EACF,CAAC;AAGD,QAAM,iBAAiB,WAAW,UAAU,sBACxC,YAAY,WAAW,SAAS,qBAAqB,SAAS,IAC9D;AACJ,QAAM,iBAAiB,WAAW,UAAU,kBACxC,YAAY,WAAW,SAAS,iBAAiB,SAAS,IAC1D;AAEJ,MAAI,YAAY;AACd,YAAQ,IAAI,KAAK,UAAU;AAAA,MACzB,IAAI,WAAW;AAAA,MACf,UAAU,WAAW;AAAA,MACrB,OAAO,WAAW;AAAA,MAClB,qBAAqB;AAAA,MACrB,iBAAiB;AAAA,MACjB,OAAO,WAAW;AAAA,IACpB,GAAG,MAAM,CAAC,CAAC;AACX;AAAA,EACF;AAGA,QAAM,QAAQ;AAAA,IACZ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,CAAC,KAAK,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,EACtC,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AAE3B,UAAQ,IAAI,gBAAM,WAAW,EAAE,KAAK,KAAK,KAAK,SAAI,OAAO,KAAK,IAAI,GAAG,KAAK,WAAW,GAAG,SAAS,MAAM,MAAM,CAAC,CAAC,EAAE;AAEjH,MAAI,gBAAgB;AAClB,YAAQ,IAAI,WAAW,eAAe,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,eAAe,SAAS,IAAI,IAAI,QAAQ,EAAE,EAAE;AAAA,EACrG;AACA,MAAI,gBAAgB;AAClB,YAAQ,IAAI,WAAW,eAAe,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,eAAe,SAAS,IAAI,IAAI,QAAQ,EAAE,EAAE;AAAA,EACrG;AACA,MAAI,WAAW,OAAO,QAAQ;AAC5B,UAAM,YAAY,WAAW,MAAM,IAAI,CAAC,MAAM,OAAO,MAAM,WAAW,IAAI,EAAE,IAAI;AAChF,YAAQ,IAAI,WAAW,UAAU,KAAK,IAAI,CAAC,EAAE;AAAA,EAC/C;AACA,UAAQ,IAAI,WAAW,WAAW,SAAS,SAAS,EAAE;AACtD,UAAQ,IAAI,SAAI,OAAO,EAAE,CAAC;AAC5B;AAEA,SAASF,SAAQ,MAAgB,MAAkC;AACjE,QAAM,MAAM,KAAK,QAAQ,IAAI;AAC7B,MAAI,OAAO,KAAK,MAAM,IAAI,KAAK,QAAQ;AACrC,WAAO,KAAK,MAAM,CAAC;AAAA,EACrB;AACA,SAAO;AACT;;;AErHA,IAAMG,QAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOX,KAAK;AAEP,eAAsB,QAAQ,MAA+B;AAC3D,MAAI,KAAK,SAAS,QAAQ,KAAK,KAAK,SAAS,IAAI,GAAG;AAClD,YAAQ,IAAIA,KAAI;AAChB;AAAA,EACF;AAEA,QAAM,OAAO,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,IAAI,CAAC;AACjD,MAAI,CAAC,MAAM;AACT,YAAQ,MAAM,iDAAiD;AAC/D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,EAAE,OAAO,OAAO,IAAI,MAAM,eAAe,IAAI;AAGnD,QAAM,QAAS,OAAO,YAAY,OAAO,SAAS,SAAS,IACvD,MAAM,gBAAgB,QAAQ,IAAI,IAClC;AAEJ,UAAQ,IAAI,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAC5C;;;AChCA,SAAS,aAAAC,YAAW,SAAAC,cAAa;AACjC,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AAC9B,SAAS,cAAAC,aAAY,oBAAoB;AAEzC,IAAMC,QAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOX,KAAK;AAEP,IAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBnB,UAAU;AAEZ,IAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQnB,UAAU;AAEZ,IAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWf,UAAU;AAEZ,IAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWrB,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyCtB,eAAsB,KAAK,MAA+B;AACxD,MAAI,KAAK,SAAS,QAAQ,KAAK,KAAK,SAAS,IAAI,GAAG;AAClD,YAAQ,IAAIA,KAAI;AAChB;AAAA,EACF;AAEA,QAAM,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,IAAI,CAAC,KAAK;AAErD,QAAM,QAAkD;AAAA,IACtD,EAAE,MAAMH,MAAK,KAAK,aAAa,GAAG,SAAS,SAAS;AAAA,IACpD,EAAE,MAAMA,MAAK,KAAK,UAAU,GAAG,SAAS,aAAa;AAAA,IACrD,EAAE,MAAMA,MAAK,KAAK,iBAAiB,GAAG,SAAS,aAAa;AAAA,IAC5D,EAAE,MAAMA,MAAK,KAAK,UAAU,SAAS,GAAG,SAAS,aAAa;AAAA,IAC9D,EAAE,MAAMA,MAAK,KAAK,kBAAkB,GAAG,SAAS,cAAc;AAAA,EAChE;AAEA,MAAI,UAAU;AACd,MAAI,UAAU;AAEd,aAAW,QAAQ,OAAO;AACxB,QAAIE,YAAW,KAAK,IAAI,GAAG;AACzB,cAAQ,IAAI,UAAU,KAAK,IAAI,mBAAmB;AAClD;AACA;AAAA,IACF;AACA,UAAMH,OAAME,SAAQ,KAAK,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AACnD,UAAMH,WAAU,KAAK,MAAM,KAAK,SAAS,OAAO;AAChD,YAAQ,IAAI,YAAO,KAAK,IAAI,EAAE;AAC9B;AAAA,EACF;AAEA,UAAQ,IAAI;AACZ,UAAQ,IAAI,WAAW,OAAO,qBAAqB,OAAO,YAAY;AAGtE,MAAII,YAAW,cAAc,GAAG;AAC9B,QAAI;AACF,YAAM,MAAM,KAAK,MAAM,aAAa,gBAAgB,OAAO,CAAC;AAC5D,UAAI,CAAC,IAAI,UAAU,eAAe,GAAG;AACnC,gBAAQ,IAAI;AACZ,gBAAQ,IAAI,wCAAwC;AACpD,gBAAQ,IAAI,4CAA4C,GAAG,kBAAkB;AAAA,MAC/E;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AACF;;;AChKA,SAAS,aAAAE,YAAW,SAAAC,cAAa;AACjC,SAAe,WAAAC,gBAAe;AAC9B,SAAS,cAAAC,mBAAkB;AAE3B,IAAMC,QAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeX,KAAK;AAOP,IAAM,UAAwC;AAAA,EAC5C,SAAS;AAAA,IACP,MAAM;AAAA,IACN,MAAM,CAAC,YACL;AAAA;AAAA;AAAA;AAAA,EAA8B,OAAO;AAAA,EACzC;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,MAAM,CAAC,YACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAiH,OAAO;AAAA,EAC5H;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,MAAM,CAAC,YAAY;AAAA,EACrB;AACF;AAEA,eAAsB,MAAM,MAA+B;AACzD,MAAI,KAAK,SAAS,QAAQ,KAAK,KAAK,SAAS,IAAI,GAAG;AAClD,YAAQ,IAAIA,KAAI;AAChB;AAAA,EACF;AAEA,QAAM,QAAQ,KAAK,SAAS,SAAS,KAAK,KAAK,SAAS,IAAI;AAE5D,MAAI,SAAS;AACb,QAAM,YAAY,KAAK,UAAU,CAAC,MAAM,MAAM,cAAc,MAAM,IAAI;AACtE,MAAI,cAAc,MAAM,KAAK,YAAY,CAAC,GAAG;AAC3C,aAAS,KAAK,YAAY,CAAC;AAAA,EAC7B;AAEA,QAAM,SAAS,QAAQ,MAAM;AAC7B,MAAI,CAAC,QAAQ;AACX,YAAQ,MAAM,mBAAmB,MAAM,EAAE;AACzC,YAAQ,MAAM,kBAAkB,OAAO,KAAK,OAAO,EAAE,KAAK,IAAI,CAAC,EAAE;AACjE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,WAAW,OAAO;AAExB,MAAID,YAAW,QAAQ,KAAK,CAAC,OAAO;AAClC,YAAQ,IAAI,UAAU,QAAQ,6CAA6C;AAC3E;AAAA,EACF;AAEA,QAAM,UAAU,OAAO,KAAK,aAAa;AAEzC,QAAMF,OAAMC,SAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAClD,QAAMF,WAAU,UAAU,SAAS,OAAO;AAC1C,UAAQ,IAAI,YAAO,QAAQ,EAAE;AAC7B,UAAQ,IAAI;AACZ,UAAQ,IAAI,mFAAmF;AACjG;AAMA,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmUpB,QAAQ;;;AChZV,IAAMK,QAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBX,KAAK;AAEP,eAAe,OAAO;AACpB,QAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AACjC,QAAM,UAAU,KAAK,CAAC;AAEtB,MAAI,CAAC,WAAW,YAAY,YAAY,YAAY,MAAM;AACxD,YAAQ,IAAIA,KAAI;AAChB,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,YAAY,eAAe,YAAY,MAAM;AAE/C,YAAQ,IAAI,OAAO;AACnB,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,cAAc,KAAK,MAAM,CAAC;AAEhC,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,YAAM,KAAK,WAAW;AACtB;AAAA,IACF,KAAK;AACH,YAAM,SAAS,WAAW;AAC1B;AAAA,IACF,KAAK;AACH,YAAM,QAAQ,WAAW;AACzB;AAAA,IACF,KAAK;AACH,YAAM,OAAO,WAAW;AACxB;AAAA,IACF,KAAK;AACH,YAAM,QAAQ,WAAW;AACzB;AAAA,IACF,KAAK;AACH,YAAM,MAAM,WAAW;AACvB;AAAA,IACF;AACE,cAAQ,MAAM,oBAAoB,OAAO,EAAE;AAC3C,cAAQ,IAAIA,KAAI;AAChB,cAAQ,KAAK,CAAC;AAAA,EAClB;AACF;AAEA,KAAK,EAAE,MAAM,CAAC,QAAQ;AACpB,UAAQ,MAAM,IAAI,OAAO;AACzB,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["join","matter","matter","readFile","resolve","dirname","dirname","resolve","readFile","join","readdir","join","extname","dirname","HELP","collectPromptFiles","join","dirname","readdir","extname","readFile","HELP","getFlag","readFile","parsed","HELP","writeFile","mkdir","join","dirname","existsSync","HELP","writeFile","mkdir","dirname","existsSync","HELP","HELP"]}
1
+ {"version":3,"sources":["../../src/cli/commands/validate.ts","../../src/parser/parser.ts","../../src/schema/schema.ts","../../src/parser/sections.ts","../../src/parser/loader.ts","../../src/renderer/interpolate.ts","../../src/composition/resolve-includes.ts","../../src/validation/levenshtein.ts","../../src/validation/validate.ts","../../src/cli/commands/compile.ts","../../src/cli/commands/render.ts","../../src/overrides/apply-overrides.ts","../../src/cli/commands/inspect.ts","../../src/cli/commands/init.ts","../../src/cli/commands/skill.ts","../../src/cli/index.ts"],"sourcesContent":["import { readdir } from 'node:fs/promises';\nimport { join, extname } from 'node:path';\nimport { loadPromptFile } from '../../parser/index.js';\nimport { validateAssetWithIncludes } from '../../validation/index.js';\n\nconst HELP = `\npromptopskit validate <dir>\n\nValidate all prompt .md files in a directory.\n\nOptions:\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 dir = args.find((a) => !a.startsWith('--'));\n if (!dir) {\n console.error('Error: Please provide a directory to validate.');\n process.exit(1);\n }\n\n const strict = args.includes('--strict');\n const files = await collectPromptFiles(dir);\n\n if (files.length === 0) {\n console.log(`No .md prompt files found in ${dir}`);\n return;\n }\n\n let errorCount = 0;\n let warnCount = 0;\n\n for (const file of files) {\n try {\n const { asset, raw } = await loadPromptFile(file, { defaultsRoot: dir });\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\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 matter from 'gray-matter';\nimport { PromptAssetSchema } from '../schema/index.js';\nimport type { PromptAsset } from '../schema/index.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 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});\n\n// --- Context ---\n\nexport const HistorySchema = z.object({\n max_items: z.number().int().positive().optional(),\n});\n\nexport const ContextSchema = z.object({\n inputs: z.array(z.string()).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 tools: z.array(ToolRefSchema).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', 'anthropic', 'google', 'gemini', 'openrouter', 'any']).optional(),\n model: z.string().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', '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\n tools: z.array(ToolRefSchema).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","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 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 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\n // Short-circuit: nothing to merge\n if (!hasDefaultMetadata && !hasDefaultSystem && !hasDefaultScalars) {\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 metadata,\n sections,\n };\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","/**\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 { 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',\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(asset.context?.inputs ?? []);\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.size > 0 && !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 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","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';\n\nconst HELP = `\npromptopskit compile <sourceDir> <outputDir> [options]\n\nCompile .md prompt files to JSON artifacts.\n\nOptions:\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 = args.filter((a) => !a.startsWith('--'));\n const sourceDir = positional[0];\n const outputDir = positional[1];\n\n if (!sourceDir || !outputDir) {\n console.error('Error: Please provide source and output directories.');\n console.error('Usage: promptopskit compile <sourceDir> <outputDir>');\n process.exit(1);\n }\n\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 // 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 } = await loadPromptFile(file, { defaultsRoot: sourceDir });\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}\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\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';\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 file = args.find((a) => !a.startsWith('--'));\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 { asset: parsed } = await loadPromptFile(file);\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 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 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\n return result;\n}\n","import { loadPromptFile } from '../../parser/index.js';\nimport { resolveIncludes } from '../../composition/index.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 { asset: parsed } = await loadPromptFile(file);\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 } from 'node:path';\nimport { existsSync, readFileSync } from 'node:fs';\n\nconst HELP = `\npromptopskit init [dir]\n\nScaffold a prompts directory with starter files.\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\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 - name: named-greeting\n variables:\n name: \"Alice\"\n app_context: \"Settings page\"\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 // 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.\\nCurrent app context: Welcome screen.\\n\\nAlways 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 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\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 ];\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} ./dist/prompts\"`);\n }\n } catch {\n // Ignore parse errors\n }\n }\n}\n","import { writeFile, mkdir } from 'node:fs/promises';\nimport { join, dirname } from 'node:path';\nimport { existsSync } from 'node:fs';\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\nOptions:\n --target, -t Deploy only a specific target (agents, claude, copilot, cursor)\n --force, -f Overwrite existing files\n --help, -h Show this help\n`.trim();\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: () => '@AGENTS.md\\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 if (existsSync(filePath) && !force) {\n console.log(` skip ${filePath} (already exists, use --force to overwrite)`);\n continue;\n }\n\n const content = config.wrap(SKILL_CONTENT);\n\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, content, '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// Skill content — comprehensive instructions for AI coding agents\n// ---------------------------------------------------------------------------\n\nconst SKILL_CONTENT = `# promptopskit — Prompt Engineering Skill\n\nThis project uses **promptopskit** to manage LLM prompts as code.\nPrompts live in markdown files with YAML front matter, are validated against\na schema, and render into provider-specific request bodies (OpenAI, Anthropic,\nGemini, OpenRouter). Follow these instructions when creating or editing prompts.\n\n---\n\n## Prompt file format\n\nEvery prompt is a \\`.md\\` file with two parts:\n\n1. **YAML front matter** — model settings, provider config, variables, overrides\n2. **Markdown body** — sections separated by H1 headings\n\n### Minimal example\n\n\\`\\`\\`markdown\n---\nid: greeting\nschema_version: 1\nprovider: openai\nmodel: gpt-5.4\ncontext:\n inputs:\n - name\n---\n\n# System instructions\n\nYou are a helpful assistant.\n\n# Prompt template\n\nHello {{ name }}, how can I help you?\n\\`\\`\\`\n\n---\n\n## Front matter reference\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| \\`id\\` | string | **yes** | Unique identifier for the prompt |\n| \\`schema_version\\` | number | yes | Always \\`1\\` |\n| \\`description\\` | string | no | Human-readable description |\n| \\`provider\\` | enum | no | \\`openai\\`, \\`anthropic\\`, \\`google\\`, \\`gemini\\`, \\`openrouter\\`, or \\`any\\` |\n| \\`model\\` | string | no | Model identifier (e.g. \\`gpt-5.4\\`, \\`claude-sonnet-4-20250514\\`) |\n| \\`fallback_models\\` | string[] | no | Ordered fallback model list |\n| \\`reasoning\\` | object | no | \\`{ effort: low|medium|high, budget_tokens: number }\\` |\n| \\`sampling\\` | object | no | \\`{ temperature, top_p, frequency_penalty, presence_penalty, stop, max_output_tokens }\\` |\n| \\`response\\` | object | no | \\`{ format: text|json|markdown, stream: boolean }\\` |\n| \\`tools\\` | array | no | Tool names (strings) or inline definitions with \\`{ name, description, input_schema }\\` |\n| \\`mcp\\` | object | no | \\`{ servers: [string | { name, config }] }\\` |\n| \\`context.inputs\\` | string[] | no | Declared variable names used in templates |\n| \\`context.history\\` | object | no | \\`{ max_items: number }\\` |\n| \\`includes\\` | string[] | no | Relative paths to other prompt files to include |\n| \\`environments\\` | object | no | Per-environment overrides (see Overrides) |\n| \\`tiers\\` | object | no | Per-tier overrides (see Overrides) |\n| \\`metadata\\` | object | no | \\`{ owner, tags, review_required, stable }\\` |\n\n---\n\n## Sections (markdown body)\n\nUse H1 headings to define sections. The parser recognizes these headings\n(case-insensitive):\n\n| Heading | Maps to | Purpose |\n|---------|---------|---------|\n| \\`# System instructions\\` | \\`system_instructions\\` | System/developer message |\n| \\`# Prompt template\\` | \\`prompt_template\\` | User message template |\n| \\`# Notes\\` | \\`notes\\` | Documentation only — not sent to the model |\n\nIf the body has **no H1 headings**, the entire body becomes the \\`prompt_template\\`.\n\n---\n\n## Variable interpolation\n\nUse \\`{{ variable_name }}\\` syntax in system instructions and prompt template\nsections. Variables are replaced at render time.\n\nRules:\n- Declare all variables in \\`context.inputs\\` — validation warns on undeclared usage\n- Escape literal braces with \\`\\\\\\\\{{\\` and \\`\\\\\\\\}}\\`\n- In strict mode, missing variables throw an error\n- In permissive mode, unresolved placeholders are left intact\n\n---\n\n## Includes (composition)\n\nCompose prompts from shared fragments:\n\n\\`\\`\\`yaml\nincludes:\n - ./shared/tone.md\n - ./shared/safety.md\n\\`\\`\\`\n\nIncluded files are parsed and their \\`system_instructions\\` are **prepended**\nbefore the including file's own system instructions. Includes resolve\nrecursively. Circular includes are detected and rejected.\n\n> **Note:** Included files do not inherit folder defaults. Only the top-level\n> prompt that is loaded via \\`loadPromptFile\\` receives defaults.\n\n---\n\n## Folder defaults (\\`defaults.md\\`)\n\nDefine shared defaults for a prompt tree by adding a \\`defaults.md\\` file in any\nfolder:\n\n\\`\\`\\`text\nprompts/\n├── defaults.md # global provider, model, metadata + system instructions\n└── support/\n ├── defaults.md # overrides for support/*\n └── reply.md # inherits from support/defaults.md\n\\`\\`\\`\n\nSupported default fields:\n- \\`provider\\` (front matter) — default provider for the folder\n- \\`model\\` (front matter) — default model for the folder\n- \\`metadata\\` (front matter) — merged with prompt-local metadata\n- \\`# System instructions\\` (body section) — used when the prompt has none\n\nThis lets you configure app-wide settings like \\`provider\\` and \\`model\\`\nin a single root \\`defaults.md\\`, so individual prompts only declare what\\u2019s unique to them.\n\nRules:\n- Nearest subfolder \\`defaults.md\\` overrides parent defaults\n- Prompt-local values always take precedence over defaults\n- \\`defaults.md\\` files are skipped during compilation and validation\n- \\`loadPromptFile\\` defaults the search boundary to the file's own directory;\n pass \\`defaultsRoot\\` to enable ancestor traversal\n\n---\n\n## Environment & tier overrides\n\nOverride model settings per environment or tier:\n\n\\`\\`\\`yaml\nenvironments:\n development:\n model: gpt-4.1-mini\n reasoning:\n effort: low\n sampling:\n temperature: 0.9\n production:\n model: gpt-5.4\n reasoning:\n effort: high\n sampling:\n temperature: 0.3\n\ntiers:\n free:\n model: gpt-4.1-mini\n sampling:\n max_output_tokens: 500\n premium:\n model: gpt-5.4\n\\`\\`\\`\n\nOverridable fields: \\`model\\`, \\`fallback_models\\`, \\`reasoning\\`, \\`sampling\\`,\n\\`response\\`, \\`tools\\`.\n\nOverride application order: **base → environment → tier → runtime**.\n\n---\n\n## Test sidecars\n\nCreate a \\`.test.yaml\\` file alongside a prompt to define test cases:\n\n\\`\\`\\`yaml\n# greeting.test.yaml\ncases:\n - name: basic\n variables:\n name: \"World\"\n - name: formal\n variables:\n name: \"Dr. Smith\"\n\\`\\`\\`\n\n---\n\n## Using the library (TypeScript / JavaScript)\n\n### Quick start\n\n\\`\\`\\`typescript\nimport { createPromptOpsKit } from 'promptopskit';\n\nconst kit = createPromptOpsKit({ sourceDir: './prompts' });\n\n// Load → resolve includes → apply overrides → render\nconst request = await kit.renderPrompt('greeting', {\n variables: { name: 'Alice' },\n environment: 'production',\n});\n\n// request.body is ready for the provider's API\nconst response = await fetch('https://api.openai.com/v1/chat/completions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: \\`Bearer $\\{apiKey}\\`,\n },\n body: JSON.stringify(request.body),\n});\n\\`\\`\\`\n\n### Step-by-step API\n\n\\`\\`\\`typescript\nimport {\n parsePrompt,\n resolveIncludes,\n applyOverrides,\n getAdapter,\n} from 'promptopskit';\nimport { readFileSync } from 'fs';\n\n// 1. Parse a prompt file\nconst source = readFileSync('./prompts/greeting.md', 'utf-8');\nconst asset = parsePrompt(source, 'greeting.md');\n\n// 2. Resolve includes\nconst resolved = await resolveIncludes(asset, './prompts');\n\n// 3. Apply overrides\nconst configured = applyOverrides(resolved, {\n environment: 'production',\n tier: 'premium',\n});\n\n// 4. Get provider adapter and render\nconst adapter = getAdapter(configured.provider ?? 'openai');\nconst request = adapter.render(configured, {\n variables: { name: 'Alice' },\n history: [\n { role: 'user', content: 'Previous message' },\n { role: 'assistant', content: 'Previous response' },\n ],\n});\n\\`\\`\\`\n\n### Available provider adapters\n\n| Provider | Import path | Provider request format |\n|----------|------------|----------------------|\n| OpenAI | \\`promptopskit\\` or \\`promptopskit/openai\\` | Chat Completions API |\n| Anthropic | \\`promptopskit/anthropic\\` | Messages API |\n| Gemini | \\`promptopskit/gemini\\` | GenerateContent API |\n| OpenRouter | \\`promptopskit/openrouter\\` | OpenAI-compatible + extras |\n\n### Validation\n\n\\`\\`\\`typescript\nimport { validateAsset, parsePrompt } from 'promptopskit';\n\nconst asset = parsePrompt(source);\nconst result = validateAsset(asset);\n\nif (!result.valid) {\n console.error(result.errors); // Error codes: POK001-POK021\n}\n\\`\\`\\`\n\n### Testing helpers\n\n\\`\\`\\`typescript\nimport { createMockAsset, parseTestPrompt } from 'promptopskit/testing';\n\n// Create a mock asset for unit tests\nconst mock = createMockAsset({ model: 'gpt-4.1-mini' });\n\n// Parse an inline prompt string for tests\nconst asset = parseTestPrompt(\\`\n---\nid: test\nschema_version: 1\nprovider: openai\nmodel: gpt-5.4\n---\n\n# Prompt template\n\nHello {{ name }}\n\\`);\n\\`\\`\\`\n\n---\n\n## CLI commands\n\n| Command | Description |\n|---------|-------------|\n| \\`promptopskit init [dir]\\` | Scaffold a prompts directory with starter files (including \\`defaults.md\\`) |\n| \\`promptopskit validate <dir>\\` | Validate all prompt files in a directory |\n| \\`promptopskit compile <src> <out>\\` | Compile .md prompts to JSON artifacts |\n| \\`promptopskit render <file> [--set key=value]\\` | Render a prompt preview |\n| \\`promptopskit inspect <file>\\` | Print the normalized prompt asset |\n\n---\n\n## Conventions to follow\n\n1. **One prompt per file** — each \\`.md\\` file is a single prompt asset\n2. **Always set \\`id\\` and \\`schema_version: 1\\`** in front matter (or inherit \\`schema_version\\` from \\`defaults.md\\`)\n3. **Declare all variables** in \\`context.inputs\\` that appear in templates\n4. **Use includes** for shared system instructions (tone, safety, formatting)\n5. **Keep prompt templates focused** — compose behavior via includes, not duplication\n6. **Use environment overrides** for dev/staging/prod model differences\n7. **Add test sidecars** (\\`.test.yaml\\`) for critical prompts\n8. **Run \\`promptopskit validate\\`** before committing changes\n9. **Use \\`defaults.md\\`** to share provider, model, metadata, and system instructions across a folder\n10. **Variable names** should be \\`snake_case\\`\n11. **Prompt file names** should be \\`kebab-case.md\\`\n`.trimEnd();\n","import { 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 <dir> Validate prompt files\n compile <src> <out> [options] 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 // Dynamic import to read version from package.json\n console.log('0.0.1');\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"],"mappings":"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","names":["join","matter","matter","readFile","resolve","dirname","dirname","resolve","readFile","join","readdir","join","extname","dirname","HELP","collectPromptFiles","join","dirname","readdir","extname","readFile","HELP","getFlag","readFile","parsed","HELP","writeFile","mkdir","join","dirname","existsSync","HELP","writeFile","mkdir","dirname","existsSync","HELP","HELP"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "promptopskit",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "Manage prompts, system instructions, tools, and model settings as code",
5
5
  "type": "module",
6
6
  "bin": {