promptopskit 0.2.6 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +89 -0
  2. package/SKILL.md +49 -0
  3. package/dist/{chunk-PU3UPUND.js → chunk-DDXFDVA6.js} +4 -4
  4. package/dist/{chunk-PU3UPUND.js.map → chunk-DDXFDVA6.js.map} +1 -1
  5. package/dist/chunk-DGFBS7YW.js +101 -0
  6. package/dist/chunk-DGFBS7YW.js.map +1 -0
  7. package/dist/chunk-HWEVRBKZ.js +387 -0
  8. package/dist/chunk-HWEVRBKZ.js.map +1 -0
  9. package/dist/{chunk-5BI5FP5L.js → chunk-LNZS3TIJ.js} +21 -18
  10. package/dist/chunk-LNZS3TIJ.js.map +1 -0
  11. package/dist/{chunk-VYVEVJC3.js → chunk-LRRSI4ON.js} +25 -22
  12. package/dist/chunk-LRRSI4ON.js.map +1 -0
  13. package/dist/chunk-Y2YYEGOY.js +86 -0
  14. package/dist/chunk-Y2YYEGOY.js.map +1 -0
  15. package/dist/cli/index.js +66 -40
  16. package/dist/cli/index.js.map +1 -1
  17. package/dist/index.cjs +479 -61
  18. package/dist/index.cjs.map +1 -1
  19. package/dist/index.d.cts +8 -4
  20. package/dist/index.d.ts +8 -4
  21. package/dist/index.js +41 -40
  22. package/dist/index.js.map +1 -1
  23. package/dist/providers/anthropic.cjs +64 -19
  24. package/dist/providers/anthropic.cjs.map +1 -1
  25. package/dist/providers/anthropic.d.cts +2 -2
  26. package/dist/providers/anthropic.d.ts +2 -2
  27. package/dist/providers/anthropic.js +2 -2
  28. package/dist/providers/gemini.cjs +60 -15
  29. package/dist/providers/gemini.cjs.map +1 -1
  30. package/dist/providers/gemini.d.cts +2 -2
  31. package/dist/providers/gemini.d.ts +2 -2
  32. package/dist/providers/gemini.js +2 -2
  33. package/dist/providers/openai.cjs +64 -19
  34. package/dist/providers/openai.cjs.map +1 -1
  35. package/dist/providers/openai.d.cts +2 -2
  36. package/dist/providers/openai.d.ts +2 -2
  37. package/dist/providers/openai.js +2 -2
  38. package/dist/providers/openrouter.cjs +66 -21
  39. package/dist/providers/openrouter.cjs.map +1 -1
  40. package/dist/providers/openrouter.d.cts +2 -2
  41. package/dist/providers/openrouter.d.ts +2 -2
  42. package/dist/providers/openrouter.js +3 -3
  43. package/dist/testing.d.cts +1 -1
  44. package/dist/testing.d.ts +1 -1
  45. package/dist/{types-BUzJB5p_.d.cts → types-BsYdPHTU.d.ts} +5 -2
  46. package/dist/{types-DM0-tThJ.d.ts → types-DC-jI6iV.d.cts} +5 -2
  47. package/dist/usagetap/index.cjs +425 -0
  48. package/dist/usagetap/index.cjs.map +1 -0
  49. package/dist/usagetap/index.d.cts +147 -0
  50. package/dist/usagetap/index.d.ts +147 -0
  51. package/dist/usagetap/index.js +31 -0
  52. package/dist/usagetap/index.js.map +1 -0
  53. package/package.json +11 -1
  54. package/dist/chunk-5BI5FP5L.js.map +0 -1
  55. package/dist/chunk-6KGBPHSY.js +0 -56
  56. package/dist/chunk-6KGBPHSY.js.map +0 -1
  57. package/dist/chunk-UYTUGV7Z.js +0 -83
  58. package/dist/chunk-UYTUGV7Z.js.map +0 -1
  59. package/dist/chunk-VYVEVJC3.js.map +0 -1
  60. package/dist/{schema-DJ7C8Q6y.d.cts → schema-Dq0jKest.d.cts} +13 -13
  61. package/dist/{schema-DJ7C8Q6y.d.ts → schema-Dq0jKest.d.ts} +13 -13
@@ -0,0 +1,86 @@
1
+ import {
2
+ renderSections,
3
+ resolveAssetForProvider
4
+ } from "./chunk-DGFBS7YW.js";
5
+
6
+ // src/providers/openai.ts
7
+ var openaiAdapter = {
8
+ name: "openai",
9
+ validate(asset, runtime) {
10
+ const resolvedAsset = resolveAssetForProvider(asset, runtime);
11
+ const errors = [];
12
+ const warnings = [];
13
+ if (!resolvedAsset.model) {
14
+ errors.push("OpenAI adapter requires a model to be specified.");
15
+ }
16
+ if (resolvedAsset.reasoning?.budget_tokens !== void 0) {
17
+ warnings.push("OpenAI uses reasoning_effort, not budget_tokens. budget_tokens will be ignored.");
18
+ }
19
+ return { valid: errors.length === 0, errors, warnings };
20
+ },
21
+ render(asset, runtime) {
22
+ const resolvedAsset = resolveAssetForProvider(asset, runtime);
23
+ const sections = renderSections(resolvedAsset, {
24
+ variables: runtime.variables,
25
+ strict: runtime.strict
26
+ });
27
+ const messages = [];
28
+ if (sections.system_instructions) {
29
+ messages.push({ role: "system", content: sections.system_instructions });
30
+ }
31
+ if (runtime.history) {
32
+ for (const msg of runtime.history) {
33
+ messages.push({ role: msg.role, content: msg.content });
34
+ }
35
+ }
36
+ if (sections.prompt_template) {
37
+ messages.push({ role: "user", content: sections.prompt_template });
38
+ }
39
+ const body = {
40
+ model: resolvedAsset.model,
41
+ messages
42
+ };
43
+ if (resolvedAsset.sampling?.temperature !== void 0) body.temperature = resolvedAsset.sampling.temperature;
44
+ if (resolvedAsset.sampling?.top_p !== void 0) body.top_p = resolvedAsset.sampling.top_p;
45
+ if (resolvedAsset.sampling?.frequency_penalty !== void 0) body.frequency_penalty = resolvedAsset.sampling.frequency_penalty;
46
+ if (resolvedAsset.sampling?.presence_penalty !== void 0) body.presence_penalty = resolvedAsset.sampling.presence_penalty;
47
+ if (resolvedAsset.sampling?.stop !== void 0) body.stop = resolvedAsset.sampling.stop;
48
+ if (resolvedAsset.sampling?.max_output_tokens !== void 0) body.max_tokens = resolvedAsset.sampling.max_output_tokens;
49
+ if (resolvedAsset.reasoning?.effort) {
50
+ body.reasoning_effort = resolvedAsset.reasoning.effort;
51
+ }
52
+ if (resolvedAsset.response?.format === "json") {
53
+ body.response_format = { type: "json_object" };
54
+ }
55
+ if (resolvedAsset.response?.stream !== void 0) {
56
+ body.stream = resolvedAsset.response.stream;
57
+ }
58
+ if (resolvedAsset.tools && resolvedAsset.tools.length > 0) {
59
+ body.tools = resolvedAsset.tools.map((tool) => {
60
+ if (typeof tool === "string") {
61
+ const def = runtime.toolRegistry?.[tool];
62
+ if (def) return def;
63
+ return { type: "function", function: { name: tool } };
64
+ }
65
+ return {
66
+ type: "function",
67
+ function: {
68
+ name: tool.name,
69
+ description: tool.description,
70
+ parameters: tool.input_schema
71
+ }
72
+ };
73
+ });
74
+ }
75
+ return {
76
+ body,
77
+ provider: "openai",
78
+ model: resolvedAsset.model ?? "unknown"
79
+ };
80
+ }
81
+ };
82
+
83
+ export {
84
+ openaiAdapter
85
+ };
86
+ //# sourceMappingURL=chunk-Y2YYEGOY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/openai.ts"],"sourcesContent":["import type { ResolvedPromptAsset } from '../schema/index.js';\nimport type {\n ProviderAdapter,\n ProviderRequest,\n ValidationResult,\n RuntimeRenderOptions,\n} from './types.js';\nimport { renderSections } from '../renderer/index.js';\nimport { resolveAssetForProvider } from './resolve-asset.js';\n\n/**\n * OpenAI provider adapter.\n * Produces request bodies compatible with the OpenAI Chat Completions API.\n */\nexport const openaiAdapter: ProviderAdapter = {\n name: 'openai',\n\n validate(asset: ResolvedPromptAsset, runtime?: RuntimeRenderOptions): ValidationResult {\n const resolvedAsset = resolveAssetForProvider(asset, runtime);\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!resolvedAsset.model) {\n errors.push('OpenAI adapter requires a model to be specified.');\n }\n\n if (resolvedAsset.reasoning?.budget_tokens !== undefined) {\n warnings.push('OpenAI uses reasoning_effort, not budget_tokens. budget_tokens will be ignored.');\n }\n\n return { valid: errors.length === 0, errors, warnings };\n },\n\n render(asset: ResolvedPromptAsset, runtime: RuntimeRenderOptions): ProviderRequest {\n const resolvedAsset = resolveAssetForProvider(asset, runtime);\n const sections = renderSections(resolvedAsset, {\n variables: runtime.variables,\n strict: runtime.strict,\n });\n\n const messages: Array<Record<string, unknown>> = [];\n\n // System message\n if (sections.system_instructions) {\n messages.push({ role: 'system', content: sections.system_instructions });\n }\n\n // History\n if (runtime.history) {\n for (const msg of runtime.history) {\n messages.push({ role: msg.role, content: msg.content });\n }\n }\n\n // User message (prompt template)\n if (sections.prompt_template) {\n messages.push({ role: 'user', content: sections.prompt_template });\n }\n\n const body: Record<string, unknown> = {\n model: resolvedAsset.model,\n messages,\n };\n\n // Sampling params\n if (resolvedAsset.sampling?.temperature !== undefined) body.temperature = resolvedAsset.sampling.temperature;\n if (resolvedAsset.sampling?.top_p !== undefined) body.top_p = resolvedAsset.sampling.top_p;\n if (resolvedAsset.sampling?.frequency_penalty !== undefined) body.frequency_penalty = resolvedAsset.sampling.frequency_penalty;\n if (resolvedAsset.sampling?.presence_penalty !== undefined) body.presence_penalty = resolvedAsset.sampling.presence_penalty;\n if (resolvedAsset.sampling?.stop !== undefined) body.stop = resolvedAsset.sampling.stop;\n if (resolvedAsset.sampling?.max_output_tokens !== undefined) body.max_tokens = resolvedAsset.sampling.max_output_tokens;\n\n // Reasoning\n if (resolvedAsset.reasoning?.effort) {\n body.reasoning_effort = resolvedAsset.reasoning.effort;\n }\n\n // Response format\n if (resolvedAsset.response?.format === 'json') {\n body.response_format = { type: 'json_object' };\n }\n\n // Streaming\n if (resolvedAsset.response?.stream !== undefined) {\n body.stream = resolvedAsset.response.stream;\n }\n\n // Tools\n if (resolvedAsset.tools && resolvedAsset.tools.length > 0) {\n body.tools = resolvedAsset.tools.map((tool) => {\n if (typeof tool === 'string') {\n // Look up from registry\n const def = runtime.toolRegistry?.[tool];\n if (def) return def;\n return { type: 'function', function: { name: tool } };\n }\n return {\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.input_schema,\n },\n };\n });\n }\n\n return {\n body,\n provider: 'openai',\n model: resolvedAsset.model ?? 'unknown',\n };\n },\n};\n"],"mappings":";;;;;;AAcO,IAAM,gBAAiC;AAAA,EAC5C,MAAM;AAAA,EAEN,SAAS,OAA4B,SAAkD;AACrF,UAAM,gBAAgB,wBAAwB,OAAO,OAAO;AAC5D,UAAM,SAAmB,CAAC;AAC1B,UAAM,WAAqB,CAAC;AAE5B,QAAI,CAAC,cAAc,OAAO;AACxB,aAAO,KAAK,kDAAkD;AAAA,IAChE;AAEA,QAAI,cAAc,WAAW,kBAAkB,QAAW;AACxD,eAAS,KAAK,iFAAiF;AAAA,IACjG;AAEA,WAAO,EAAE,OAAO,OAAO,WAAW,GAAG,QAAQ,SAAS;AAAA,EACxD;AAAA,EAEA,OAAO,OAA4B,SAAgD;AACjF,UAAM,gBAAgB,wBAAwB,OAAO,OAAO;AAC5D,UAAM,WAAW,eAAe,eAAe;AAAA,MAC7C,WAAW,QAAQ;AAAA,MACnB,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAED,UAAM,WAA2C,CAAC;AAGlD,QAAI,SAAS,qBAAqB;AAChC,eAAS,KAAK,EAAE,MAAM,UAAU,SAAS,SAAS,oBAAoB,CAAC;AAAA,IACzE;AAGA,QAAI,QAAQ,SAAS;AACnB,iBAAW,OAAO,QAAQ,SAAS;AACjC,iBAAS,KAAK,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,CAAC;AAAA,MACxD;AAAA,IACF;AAGA,QAAI,SAAS,iBAAiB;AAC5B,eAAS,KAAK,EAAE,MAAM,QAAQ,SAAS,SAAS,gBAAgB,CAAC;AAAA,IACnE;AAEA,UAAM,OAAgC;AAAA,MACpC,OAAO,cAAc;AAAA,MACrB;AAAA,IACF;AAGA,QAAI,cAAc,UAAU,gBAAgB,OAAW,MAAK,cAAc,cAAc,SAAS;AACjG,QAAI,cAAc,UAAU,UAAU,OAAW,MAAK,QAAQ,cAAc,SAAS;AACrF,QAAI,cAAc,UAAU,sBAAsB,OAAW,MAAK,oBAAoB,cAAc,SAAS;AAC7G,QAAI,cAAc,UAAU,qBAAqB,OAAW,MAAK,mBAAmB,cAAc,SAAS;AAC3G,QAAI,cAAc,UAAU,SAAS,OAAW,MAAK,OAAO,cAAc,SAAS;AACnF,QAAI,cAAc,UAAU,sBAAsB,OAAW,MAAK,aAAa,cAAc,SAAS;AAGtG,QAAI,cAAc,WAAW,QAAQ;AACnC,WAAK,mBAAmB,cAAc,UAAU;AAAA,IAClD;AAGA,QAAI,cAAc,UAAU,WAAW,QAAQ;AAC7C,WAAK,kBAAkB,EAAE,MAAM,cAAc;AAAA,IAC/C;AAGA,QAAI,cAAc,UAAU,WAAW,QAAW;AAChD,WAAK,SAAS,cAAc,SAAS;AAAA,IACvC;AAGA,QAAI,cAAc,SAAS,cAAc,MAAM,SAAS,GAAG;AACzD,WAAK,QAAQ,cAAc,MAAM,IAAI,CAAC,SAAS;AAC7C,YAAI,OAAO,SAAS,UAAU;AAE5B,gBAAM,MAAM,QAAQ,eAAe,IAAI;AACvC,cAAI,IAAK,QAAO;AAChB,iBAAO,EAAE,MAAM,YAAY,UAAU,EAAE,MAAM,KAAK,EAAE;AAAA,QACtD;AACA,eAAO;AAAA,UACL,MAAM;AAAA,UACN,UAAU;AAAA,YACR,MAAM,KAAK;AAAA,YACX,aAAa,KAAK;AAAA,YAClB,YAAY,KAAK;AAAA,UACnB;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL;AAAA,MACA,UAAU;AAAA,MACV,OAAO,cAAc,SAAS;AAAA,IAChC;AAAA,EACF;AACF;","names":[]}
package/dist/cli/index.js CHANGED
@@ -667,7 +667,7 @@ async function collectPromptFiles2(dir) {
667
667
 
668
668
  // src/cli/commands/render.ts
669
669
  import { readFile as readFile3 } from "fs/promises";
670
- import { existsSync } from "fs";
670
+ import { existsSync as existsSync2 } from "fs";
671
671
 
672
672
  // src/overrides/apply-overrides.ts
673
673
  function applyOverrides(asset, options = {}) {
@@ -700,6 +700,28 @@ function mergeOverride(base, override) {
700
700
  return result;
701
701
  }
702
702
 
703
+ // src/cli/commands/defaults-root.ts
704
+ import { existsSync } from "fs";
705
+ import { dirname as dirname4, join as join4, resolve as resolve3 } from "path";
706
+ function findDefaultsRoot(filePath) {
707
+ let current = resolve3(dirname4(filePath));
708
+ let root = current;
709
+ let foundDefaults = false;
710
+ while (true) {
711
+ if (existsSync(join4(current, "defaults.md"))) {
712
+ root = current;
713
+ foundDefaults = true;
714
+ } else if (foundDefaults) {
715
+ return root;
716
+ }
717
+ const parent = dirname4(current);
718
+ if (parent === current) {
719
+ return root;
720
+ }
721
+ current = parent;
722
+ }
723
+ }
724
+
703
725
  // src/cli/commands/render.ts
704
726
  var HELP3 = `
705
727
  promptopskit render <file> [options]
@@ -733,7 +755,7 @@ async function render(args) {
733
755
  variables = JSON.parse(varsContent);
734
756
  } else {
735
757
  const sidecarPath = file.replace(/\.md$/, ".test.yaml");
736
- if (existsSync(sidecarPath)) {
758
+ if (existsSync2(sidecarPath)) {
737
759
  const { default: yaml } = await import("gray-matter");
738
760
  const sidecarContent = await readFile3(sidecarPath, "utf-8");
739
761
  const parsed2 = yaml(`---
@@ -745,7 +767,8 @@ ${sidecarContent}---
745
767
  }
746
768
  }
747
769
  }
748
- const { asset: parsed } = await loadPromptFile(file);
770
+ const defaultsRoot = findDefaultsRoot(file);
771
+ const { asset: parsed } = await loadPromptFile(file, { defaultsRoot });
749
772
  const resolved = parsed.includes && parsed.includes.length > 0 ? await resolveIncludes(parsed, file) : parsed;
750
773
  const overridden = applyOverrides(resolved, {
751
774
  environment: env,
@@ -810,15 +833,16 @@ async function inspect(args) {
810
833
  console.error("Error: Please provide a prompt file to inspect.");
811
834
  process.exit(1);
812
835
  }
813
- const { asset: parsed } = await loadPromptFile(file);
836
+ const defaultsRoot = findDefaultsRoot(file);
837
+ const { asset: parsed } = await loadPromptFile(file, { defaultsRoot });
814
838
  const asset = parsed.includes && parsed.includes.length > 0 ? await resolveIncludes(parsed, file) : parsed;
815
839
  console.log(JSON.stringify(asset, null, 2));
816
840
  }
817
841
 
818
842
  // src/cli/commands/init.ts
819
843
  import { writeFile as writeFile2, mkdir as mkdir2 } from "fs/promises";
820
- import { join as join4, dirname as dirname4 } from "path";
821
- import { existsSync as existsSync2, readFileSync } from "fs";
844
+ import { join as join5, dirname as dirname5 } from "path";
845
+ import { existsSync as existsSync3, readFileSync } from "fs";
822
846
  var HELP5 = `
823
847
  promptopskit init [dir]
824
848
 
@@ -909,27 +933,29 @@ async function main() {
909
933
  },
910
934
  });
911
935
 
912
- // request.body is the fully transformed OpenAI Chat Completions payload.
913
- // For the hello.md prompt in the dev environment it looks like:
914
- //
915
- // {
916
- // "model": "gpt-5.4-mini",
917
- // "reasoning_effort": "low",
918
- // "temperature": 0.2,
919
- // "messages": [
920
- // {
921
- // "role": "system",
922
- // "content": "You are a friendly assistant. Be helpful and concise.
923
- Current app context: Welcome screen.
936
+ /*
937
+ request.body is the fully transformed OpenAI Chat Completions payload.
938
+ For the hello.md prompt in the dev environment it looks like:
939
+
940
+ {
941
+ "model": "gpt-5.4-mini",
942
+ "reasoning_effort": "low",
943
+ "temperature": 0.2,
944
+ "messages": [
945
+ {
946
+ "role": "system",
947
+ "content": "You are a friendly assistant. Be helpful and concise.
948
+ Current app context: Welcome screen.
924
949
 
925
- Always be polite, professional, and concise. Avoid jargon unless the user uses it first."
926
- // },
927
- // {
928
- // "role": "user",
929
- // "content": "Say hello to World and ask how you can help them today."
930
- // }
931
- // ]
932
- // }
950
+ Always be polite, professional, and concise. Avoid jargon unless the user uses it first."
951
+ },
952
+ {
953
+ "role": "user",
954
+ "content": "Say hello to World and ask how you can help them today."
955
+ }
956
+ ]
957
+ }
958
+ */
933
959
 
934
960
  console.log('Model:', request.body.model);
935
961
 
@@ -955,28 +981,28 @@ async function init(args) {
955
981
  }
956
982
  const dir = args.find((a) => !a.startsWith("--")) ?? "./prompts";
957
983
  const files = [
958
- { path: join4(dir, "defaults.md"), content: DEFAULTS },
959
- { path: join4(dir, "hello.md"), content: HELLO_PROMPT },
960
- { path: join4(dir, "hello.test.yaml"), content: TEST_SIDECAR },
961
- { path: join4(dir, "shared", "tone.md"), content: TONE_INCLUDE },
962
- { path: join4(dir, "example-usage.ts"), content: EXAMPLE_USAGE }
984
+ { path: join5(dir, "defaults.md"), content: DEFAULTS },
985
+ { path: join5(dir, "hello.md"), content: HELLO_PROMPT },
986
+ { path: join5(dir, "hello.test.yaml"), content: TEST_SIDECAR },
987
+ { path: join5(dir, "shared", "tone.md"), content: TONE_INCLUDE },
988
+ { path: join5(dir, "example-usage.ts"), content: EXAMPLE_USAGE }
963
989
  ];
964
990
  let created = 0;
965
991
  let skipped = 0;
966
992
  for (const file of files) {
967
- if (existsSync2(file.path)) {
993
+ if (existsSync3(file.path)) {
968
994
  console.log(` skip ${file.path} (already exists)`);
969
995
  skipped++;
970
996
  continue;
971
997
  }
972
- await mkdir2(dirname4(file.path), { recursive: true });
998
+ await mkdir2(dirname5(file.path), { recursive: true });
973
999
  await writeFile2(file.path, file.content, "utf-8");
974
1000
  console.log(` \u2713 ${file.path}`);
975
1001
  created++;
976
1002
  }
977
1003
  console.log();
978
1004
  console.log(`Created ${created} file(s), skipped ${skipped} existing.`);
979
- if (existsSync2("package.json")) {
1005
+ if (existsSync3("package.json")) {
980
1006
  try {
981
1007
  const pkg = JSON.parse(readFileSync("package.json", "utf-8"));
982
1008
  if (!pkg.scripts?.["build:prompts"]) {
@@ -991,8 +1017,8 @@ async function init(args) {
991
1017
 
992
1018
  // src/cli/commands/skill.ts
993
1019
  import { writeFile as writeFile3, readFile as readFile4, mkdir as mkdir3 } from "fs/promises";
994
- import { dirname as dirname5 } from "path";
995
- import { existsSync as existsSync3 } from "fs";
1020
+ import { dirname as dirname6 } from "path";
1021
+ import { existsSync as existsSync4 } from "fs";
996
1022
  var MARKER_START = "<!-- promptopskit:start -->";
997
1023
  var MARKER_END = "<!-- promptopskit:end -->";
998
1024
  var HELP6 = `
@@ -1078,7 +1104,7 @@ async function skill(args) {
1078
1104
  continue;
1079
1105
  }
1080
1106
  const markedContent = config.wrap(wrapMarkers(STUB_CONTENT));
1081
- if (existsSync3(filePath) && !force) {
1107
+ if (existsSync4(filePath) && !force) {
1082
1108
  const existing = await readFile4(filePath, "utf-8");
1083
1109
  const merged = mergeContent(existing, markedContent);
1084
1110
  if (merged === existing) {
@@ -1090,7 +1116,7 @@ async function skill(args) {
1090
1116
  written++;
1091
1117
  continue;
1092
1118
  }
1093
- await mkdir3(dirname5(filePath), { recursive: true });
1119
+ await mkdir3(dirname6(filePath), { recursive: true });
1094
1120
  await writeFile3(filePath, markedContent, "utf-8");
1095
1121
  console.log(` \u2713 ${filePath}`);
1096
1122
  written++;
@@ -1102,8 +1128,8 @@ async function skill(args) {
1102
1128
  }
1103
1129
  async function deployClaude(filePath, force) {
1104
1130
  const content = CLAUDE_LINE + "\n";
1105
- if (!existsSync3(filePath) || force) {
1106
- await mkdir3(dirname5(filePath), { recursive: true });
1131
+ if (!existsSync4(filePath) || force) {
1132
+ await mkdir3(dirname6(filePath), { recursive: true });
1107
1133
  await writeFile3(filePath, content, "utf-8");
1108
1134
  console.log(` \u2713 ${filePath}`);
1109
1135
  return 1;