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.
- package/README.md +89 -0
- package/SKILL.md +49 -0
- package/dist/{chunk-PU3UPUND.js → chunk-DDXFDVA6.js} +4 -4
- package/dist/{chunk-PU3UPUND.js.map → chunk-DDXFDVA6.js.map} +1 -1
- package/dist/chunk-DGFBS7YW.js +101 -0
- package/dist/chunk-DGFBS7YW.js.map +1 -0
- package/dist/chunk-HWEVRBKZ.js +387 -0
- package/dist/chunk-HWEVRBKZ.js.map +1 -0
- package/dist/{chunk-5BI5FP5L.js → chunk-LNZS3TIJ.js} +21 -18
- package/dist/chunk-LNZS3TIJ.js.map +1 -0
- package/dist/{chunk-VYVEVJC3.js → chunk-LRRSI4ON.js} +25 -22
- package/dist/chunk-LRRSI4ON.js.map +1 -0
- package/dist/chunk-Y2YYEGOY.js +86 -0
- package/dist/chunk-Y2YYEGOY.js.map +1 -0
- package/dist/cli/index.js +66 -40
- package/dist/cli/index.js.map +1 -1
- package/dist/index.cjs +479 -61
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -4
- package/dist/index.d.ts +8 -4
- package/dist/index.js +41 -40
- package/dist/index.js.map +1 -1
- package/dist/providers/anthropic.cjs +64 -19
- package/dist/providers/anthropic.cjs.map +1 -1
- package/dist/providers/anthropic.d.cts +2 -2
- package/dist/providers/anthropic.d.ts +2 -2
- package/dist/providers/anthropic.js +2 -2
- package/dist/providers/gemini.cjs +60 -15
- package/dist/providers/gemini.cjs.map +1 -1
- package/dist/providers/gemini.d.cts +2 -2
- package/dist/providers/gemini.d.ts +2 -2
- package/dist/providers/gemini.js +2 -2
- package/dist/providers/openai.cjs +64 -19
- package/dist/providers/openai.cjs.map +1 -1
- package/dist/providers/openai.d.cts +2 -2
- package/dist/providers/openai.d.ts +2 -2
- package/dist/providers/openai.js +2 -2
- package/dist/providers/openrouter.cjs +66 -21
- package/dist/providers/openrouter.cjs.map +1 -1
- package/dist/providers/openrouter.d.cts +2 -2
- package/dist/providers/openrouter.d.ts +2 -2
- package/dist/providers/openrouter.js +3 -3
- package/dist/testing.d.cts +1 -1
- package/dist/testing.d.ts +1 -1
- package/dist/{types-BUzJB5p_.d.cts → types-BsYdPHTU.d.ts} +5 -2
- package/dist/{types-DM0-tThJ.d.ts → types-DC-jI6iV.d.cts} +5 -2
- package/dist/usagetap/index.cjs +425 -0
- package/dist/usagetap/index.cjs.map +1 -0
- package/dist/usagetap/index.d.cts +147 -0
- package/dist/usagetap/index.d.ts +147 -0
- package/dist/usagetap/index.js +31 -0
- package/dist/usagetap/index.js.map +1 -0
- package/package.json +11 -1
- package/dist/chunk-5BI5FP5L.js.map +0 -1
- package/dist/chunk-6KGBPHSY.js +0 -56
- package/dist/chunk-6KGBPHSY.js.map +0 -1
- package/dist/chunk-UYTUGV7Z.js +0 -83
- package/dist/chunk-UYTUGV7Z.js.map +0 -1
- package/dist/chunk-VYVEVJC3.js.map +0 -1
- package/dist/{schema-DJ7C8Q6y.d.cts → schema-Dq0jKest.d.cts} +13 -13
- 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 (
|
|
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
|
|
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
|
|
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
|
|
821
|
-
import { existsSync as
|
|
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
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
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
|
-
|
|
929
|
-
|
|
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:
|
|
959
|
-
{ path:
|
|
960
|
-
{ path:
|
|
961
|
-
{ path:
|
|
962
|
-
{ path:
|
|
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 (
|
|
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(
|
|
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 (
|
|
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
|
|
995
|
-
import { existsSync as
|
|
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 (
|
|
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(
|
|
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 (!
|
|
1106
|
-
await mkdir3(
|
|
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;
|