@asnd/skill-creator 0.1.1 → 0.1.3
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 +64 -125
- package/dist/cli/dynamic.d.ts +26 -0
- package/dist/cli/dynamic.js +136 -0
- package/dist/cli/dynamic.js.map +1 -0
- package/dist/cli/main.d.ts +2 -4
- package/dist/cli/main.js +376 -1530
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/parse.d.ts +9 -0
- package/dist/cli/parse.js +38 -0
- package/dist/cli/parse.js.map +1 -0
- package/dist/commands/agents.d.ts +96 -0
- package/dist/commands/agents.js +116 -0
- package/dist/commands/agents.js.map +1 -0
- package/dist/commands/install.d.ts +12 -0
- package/dist/commands/install.js +229 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/core/cache.d.ts +3 -0
- package/dist/core/cache.js +52 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/core/coerce.d.ts +8 -0
- package/dist/core/coerce.js +128 -0
- package/dist/core/coerce.js.map +1 -0
- package/dist/core/filter.d.ts +7 -0
- package/dist/core/filter.js +16 -0
- package/dist/core/filter.js.map +1 -0
- package/dist/core/listing.d.ts +11 -0
- package/dist/core/listing.js +31 -0
- package/dist/core/listing.js.map +1 -0
- package/dist/core/names.d.ts +1 -0
- package/dist/core/names.js +7 -0
- package/dist/core/names.js.map +1 -0
- package/dist/core/output.d.ts +12 -0
- package/dist/core/output.js +34 -0
- package/dist/core/output.js.map +1 -0
- package/dist/core/secrets.d.ts +1 -0
- package/dist/core/secrets.js +21 -0
- package/dist/core/secrets.js.map +1 -0
- package/dist/core/types.d.ts +37 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/usage.d.ts +13 -0
- package/dist/core/usage.js +33 -0
- package/dist/core/usage.js.map +1 -0
- package/dist/graphql/execute.d.ts +8 -0
- package/dist/graphql/execute.js +133 -0
- package/dist/graphql/execute.js.map +1 -0
- package/dist/graphql/extract.d.ts +6 -0
- package/dist/graphql/extract.js +109 -0
- package/dist/graphql/extract.js.map +1 -0
- package/dist/graphql/load.d.ts +11 -0
- package/dist/graphql/load.js +95 -0
- package/dist/graphql/load.js.map +1 -0
- package/dist/mcp/extract.d.ts +8 -0
- package/dist/mcp/extract.js +40 -0
- package/dist/mcp/extract.js.map +1 -0
- package/dist/mcp/http.d.ts +8 -0
- package/dist/mcp/http.js +80 -0
- package/dist/mcp/http.js.map +1 -0
- package/dist/mcp/stdio.d.ts +9 -0
- package/dist/mcp/stdio.js +67 -0
- package/dist/mcp/stdio.js.map +1 -0
- package/dist/openapi/execute.d.ts +12 -0
- package/dist/openapi/execute.js +44 -0
- package/dist/openapi/execute.js.map +1 -0
- package/dist/openapi/extract.d.ts +2 -0
- package/dist/openapi/extract.js +123 -0
- package/dist/openapi/extract.js.map +1 -0
- package/dist/openapi/load.d.ts +11 -0
- package/dist/openapi/load.js +52 -0
- package/dist/openapi/load.js.map +1 -0
- package/dist/openapi/params.d.ts +12 -0
- package/dist/openapi/params.js +47 -0
- package/dist/openapi/params.js.map +1 -0
- package/dist/openapi/refs.d.ts +1 -0
- package/dist/openapi/refs.js +8 -0
- package/dist/openapi/refs.js.map +1 -0
- package/dist/skills/agents.d.ts +77 -0
- package/dist/skills/agents.js +85 -0
- package/dist/skills/agents.js.map +1 -0
- package/dist/skills/generate.d.ts +1 -0
- package/dist/skills/generate.js +494 -0
- package/dist/skills/generate.js.map +1 -0
- package/package.json +7 -11
- package/prompts/skill-creator.md +169 -0
- package/dist/cli/package-4N3JKWJZ.js +0 -90
- package/dist/cli/package-4N3JKWJZ.js.map +0 -1
- package/prompts/generate-skill.md +0 -22
- package/skills/skill-creator/SKILL.md +0 -260
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { mkdir, readdir, readFile, rm, stat, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { basename, dirname, extname, join, resolve } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { assertValidCommandName, commandFileNameForAgent, commandFormatForAgent, isCommandAgentId, listCommandAgentIds, resolveAgentCommandDir, } from './agents.js';
|
|
6
|
+
export async function runInstallCommand(argv) {
|
|
7
|
+
const args = await completeInteractiveOptions(parseInstallCommandArgs(argv));
|
|
8
|
+
if (args.help) {
|
|
9
|
+
printInstallCommandHelp();
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
const source = args.source ?? bundledCommandSourcePath();
|
|
13
|
+
if (args.agent === undefined || args.scope === undefined) {
|
|
14
|
+
throw new Error('--agent and --scope are required when prompts are unavailable');
|
|
15
|
+
}
|
|
16
|
+
const templates = await loadCommandTemplates(source, args.name);
|
|
17
|
+
const targetDir = resolveAgentCommandDir(args.agent, args.scope);
|
|
18
|
+
await mkdir(targetDir, { recursive: true });
|
|
19
|
+
for (const template of templates) {
|
|
20
|
+
assertValidCommandName(template.name);
|
|
21
|
+
const targetPath = join(targetDir, commandFileNameForAgent(args.agent, template.name));
|
|
22
|
+
await assertWritableTarget(targetPath, args.force);
|
|
23
|
+
await writeFile(targetPath, renderCommandTemplate(args.agent, template), 'utf8');
|
|
24
|
+
}
|
|
25
|
+
const label = templates.length === 1 ? 'command' : 'commands';
|
|
26
|
+
console.log(`Installed ${label}: ${templates.map((template) => template.name).join(', ')}`);
|
|
27
|
+
console.log(`Agent: ${listCommandAgentIds().includes(args.agent) ? args.agent : String(args.agent)}`);
|
|
28
|
+
console.log(`Scope: ${args.scope}`);
|
|
29
|
+
console.log(`Path: ${targetDir}`);
|
|
30
|
+
}
|
|
31
|
+
function parseInstallCommandArgs(argv) {
|
|
32
|
+
const args = {
|
|
33
|
+
force: false,
|
|
34
|
+
yes: false,
|
|
35
|
+
help: false,
|
|
36
|
+
};
|
|
37
|
+
const positional = [];
|
|
38
|
+
const tokens = argv[0] === 'install' ? argv.slice(1) : argv;
|
|
39
|
+
for (let index = 0; index < tokens.length; index += 1) {
|
|
40
|
+
const token = tokens[index];
|
|
41
|
+
if (token === undefined)
|
|
42
|
+
continue;
|
|
43
|
+
switch (token) {
|
|
44
|
+
case '--help':
|
|
45
|
+
case '-h':
|
|
46
|
+
args.help = true;
|
|
47
|
+
break;
|
|
48
|
+
case '--source':
|
|
49
|
+
args.source = resolve(requireValue(tokens, ++index, token));
|
|
50
|
+
break;
|
|
51
|
+
case '--name':
|
|
52
|
+
args.name = requireValue(tokens, ++index, token);
|
|
53
|
+
break;
|
|
54
|
+
case '--agent':
|
|
55
|
+
args.agent = parseAgent(requireValue(tokens, ++index, token));
|
|
56
|
+
break;
|
|
57
|
+
case '--scope':
|
|
58
|
+
args.scope = parseScope(requireValue(tokens, ++index, token));
|
|
59
|
+
break;
|
|
60
|
+
case '--force':
|
|
61
|
+
args.force = true;
|
|
62
|
+
break;
|
|
63
|
+
case '--yes':
|
|
64
|
+
case '-y':
|
|
65
|
+
args.yes = true;
|
|
66
|
+
break;
|
|
67
|
+
case 'agent':
|
|
68
|
+
args.agent = parseAgent(requireValue(tokens, ++index, token));
|
|
69
|
+
break;
|
|
70
|
+
case 'scope':
|
|
71
|
+
args.scope = parseScope(requireValue(tokens, ++index, token));
|
|
72
|
+
break;
|
|
73
|
+
default:
|
|
74
|
+
if (token.startsWith('-'))
|
|
75
|
+
throw new Error(`unknown command install option: ${token}`);
|
|
76
|
+
positional.push(token);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (args.source === undefined && positional.length > 0)
|
|
80
|
+
args.source = resolve(positional[0]);
|
|
81
|
+
if (positional.length > 1)
|
|
82
|
+
throw new Error('only one command source may be provided');
|
|
83
|
+
return args;
|
|
84
|
+
}
|
|
85
|
+
async function completeInteractiveOptions(args) {
|
|
86
|
+
if (args.help || (args.agent !== undefined && args.scope !== undefined))
|
|
87
|
+
return args;
|
|
88
|
+
if (args.yes || !process.stdin.isTTY || !process.stdout.isTTY)
|
|
89
|
+
return args;
|
|
90
|
+
const readline = await import('node:readline/promises');
|
|
91
|
+
const rl = readline.createInterface({
|
|
92
|
+
input: process.stdin,
|
|
93
|
+
output: process.stdout,
|
|
94
|
+
});
|
|
95
|
+
try {
|
|
96
|
+
const completed = { ...args };
|
|
97
|
+
if (completed.agent === undefined) {
|
|
98
|
+
const agentChoices = listCommandAgentIds();
|
|
99
|
+
console.log(`Agents: ${agentChoices.join(', ')}`);
|
|
100
|
+
completed.agent = parseAgent(await rl.question('Agent to install command for: '));
|
|
101
|
+
}
|
|
102
|
+
if (completed.scope === undefined) {
|
|
103
|
+
completed.scope = parseScope(await rl.question('Install scope (project/global): '));
|
|
104
|
+
}
|
|
105
|
+
return completed;
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
rl.close();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async function loadCommandTemplates(source, name) {
|
|
112
|
+
const sourceStat = await stat(source);
|
|
113
|
+
if (sourceStat.isDirectory()) {
|
|
114
|
+
if (name !== undefined)
|
|
115
|
+
throw new Error('--name can only be used when --source is a file');
|
|
116
|
+
const entries = await readdir(source, { withFileTypes: true });
|
|
117
|
+
const files = entries
|
|
118
|
+
.filter((entry) => entry.isFile() && isMarkdownCommandFile(entry.name))
|
|
119
|
+
.map((entry) => entry.name)
|
|
120
|
+
.sort((left, right) => left.localeCompare(right));
|
|
121
|
+
if (files.length === 0)
|
|
122
|
+
throw new Error(`no markdown command files found in ${source}`);
|
|
123
|
+
return Promise.all(files.map(async (fileName) => ({
|
|
124
|
+
name: commandNameFromFileName(fileName),
|
|
125
|
+
content: await readFile(join(source, fileName), 'utf8'),
|
|
126
|
+
sourcePath: join(source, fileName),
|
|
127
|
+
})));
|
|
128
|
+
}
|
|
129
|
+
if (!sourceStat.isFile())
|
|
130
|
+
throw new Error(`command source is not a file or directory: ${source}`);
|
|
131
|
+
if (!isMarkdownCommandFile(basename(source))) {
|
|
132
|
+
throw new Error(`command source must be a markdown file: ${source}`);
|
|
133
|
+
}
|
|
134
|
+
const commandName = name ?? commandNameFromFileName(basename(source));
|
|
135
|
+
return [
|
|
136
|
+
{
|
|
137
|
+
name: commandName,
|
|
138
|
+
content: await readFile(source, 'utf8'),
|
|
139
|
+
sourcePath: source,
|
|
140
|
+
},
|
|
141
|
+
];
|
|
142
|
+
}
|
|
143
|
+
function isMarkdownCommandFile(fileName) {
|
|
144
|
+
const lower = fileName.toLowerCase();
|
|
145
|
+
return lower.endsWith('.md') && lower !== 'readme.md';
|
|
146
|
+
}
|
|
147
|
+
function commandNameFromFileName(fileName) {
|
|
148
|
+
const lower = fileName.toLowerCase();
|
|
149
|
+
if (lower.endsWith('.prompt.md'))
|
|
150
|
+
return fileName.slice(0, -'.prompt.md'.length);
|
|
151
|
+
return fileName.slice(0, -extname(fileName).length);
|
|
152
|
+
}
|
|
153
|
+
async function assertWritableTarget(targetPath, force) {
|
|
154
|
+
if (!existsSync(targetPath))
|
|
155
|
+
return;
|
|
156
|
+
if (!force)
|
|
157
|
+
throw new Error(`command target already exists: ${targetPath}. Use --force to overwrite.`);
|
|
158
|
+
await rm(targetPath, { force: true });
|
|
159
|
+
}
|
|
160
|
+
function renderCommandTemplate(agent, template) {
|
|
161
|
+
if (commandFormatForAgent(agent) === 'gemini-toml')
|
|
162
|
+
return renderGeminiToml(template.content);
|
|
163
|
+
return template.content.endsWith('\n') ? template.content : `${template.content}\n`;
|
|
164
|
+
}
|
|
165
|
+
function renderGeminiToml(markdown) {
|
|
166
|
+
const parsed = parseMarkdownPrompt(markdown);
|
|
167
|
+
const prompt = renderGeminiPrompt(parsed.body);
|
|
168
|
+
const lines = [`prompt = ${JSON.stringify(prompt)}`];
|
|
169
|
+
if (parsed.description !== undefined)
|
|
170
|
+
lines.unshift(`description = ${JSON.stringify(parsed.description)}`);
|
|
171
|
+
return `${lines.join('\n')}\n`;
|
|
172
|
+
}
|
|
173
|
+
function renderGeminiPrompt(markdownPrompt) {
|
|
174
|
+
return markdownPrompt.replaceAll('$ARGUMENTS', '{{args}}').replaceAll('$@', '{{args}}');
|
|
175
|
+
}
|
|
176
|
+
function parseMarkdownPrompt(markdown) {
|
|
177
|
+
if (!markdown.startsWith('---\n'))
|
|
178
|
+
return { body: markdown.endsWith('\n') ? markdown : `${markdown}\n` };
|
|
179
|
+
const end = markdown.indexOf('\n---\n', 4);
|
|
180
|
+
if (end === -1)
|
|
181
|
+
return { body: markdown.endsWith('\n') ? markdown : `${markdown}\n` };
|
|
182
|
+
const frontmatter = markdown.slice(4, end);
|
|
183
|
+
const body = markdown.slice(end + '\n---\n'.length);
|
|
184
|
+
const descriptionLine = frontmatter
|
|
185
|
+
.split('\n')
|
|
186
|
+
.map((line) => line.trim())
|
|
187
|
+
.find((line) => line.startsWith('description:'));
|
|
188
|
+
const description = descriptionLine
|
|
189
|
+
?.slice('description:'.length)
|
|
190
|
+
.trim()
|
|
191
|
+
.replace(/^['"]|['"]$/g, '');
|
|
192
|
+
return {
|
|
193
|
+
body: body.endsWith('\n') ? body : `${body}\n`,
|
|
194
|
+
...(description === undefined || description.length === 0 ? {} : { description }),
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
function bundledCommandSourcePath() {
|
|
198
|
+
return join(dirname(fileURLToPath(import.meta.url)), '../..', 'prompts', 'skill-creator.md');
|
|
199
|
+
}
|
|
200
|
+
function parseAgent(value) {
|
|
201
|
+
if (isCommandAgentId(value))
|
|
202
|
+
return value;
|
|
203
|
+
throw new Error(`unknown command agent: ${value}. Valid agents: ${listCommandAgentIds().join(', ')}`);
|
|
204
|
+
}
|
|
205
|
+
function parseScope(value) {
|
|
206
|
+
if (value === 'project' || value === 'global')
|
|
207
|
+
return value;
|
|
208
|
+
throw new Error('--scope must be project or global');
|
|
209
|
+
}
|
|
210
|
+
function requireValue(argv, index, option) {
|
|
211
|
+
const value = argv[index];
|
|
212
|
+
if (value === undefined || value.startsWith('--'))
|
|
213
|
+
throw new Error(`missing value for ${option}`);
|
|
214
|
+
return value;
|
|
215
|
+
}
|
|
216
|
+
function printInstallCommandHelp() {
|
|
217
|
+
console.log(`npx @asnd/skill-creator command install --agent AGENT --scope project|global
|
|
218
|
+
|
|
219
|
+
Options:
|
|
220
|
+
--source FILE|DIR Markdown command file or directory of *.md command files (defaults to bundled /skill-creator command)
|
|
221
|
+
--name NAME Override command name when --source is a file
|
|
222
|
+
--agent AGENT Target agent, e.g. pi, claude-code, cursor, opencode
|
|
223
|
+
--scope SCOPE Install scope: project|global
|
|
224
|
+
--force Overwrite existing command files
|
|
225
|
+
--yes, -y Non-interactive mode; requires --agent and --scope
|
|
226
|
+
--help, -h Show this help
|
|
227
|
+
`);
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare function cacheKeyFor(config: Record<string, unknown>): string;
|
|
2
|
+
export declare function loadCached<T = unknown>(cacheDir: string, key: string, ttlSeconds: number): Promise<T | null>;
|
|
3
|
+
export declare function saveCache(cacheDir: string, key: string, data: unknown): Promise<void>;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import * as cacache from 'cacache';
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
const CACHE_IGNORED_FIELDS = new Set([
|
|
4
|
+
'cacheTtl',
|
|
5
|
+
'cache_ttl',
|
|
6
|
+
'description',
|
|
7
|
+
'include',
|
|
8
|
+
'exclude',
|
|
9
|
+
'methods',
|
|
10
|
+
]);
|
|
11
|
+
export function cacheKeyFor(config) {
|
|
12
|
+
const normalized = normalizeConfig(config);
|
|
13
|
+
return createHash('sha256').update(JSON.stringify(normalized)).digest('hex').slice(0, 16);
|
|
14
|
+
}
|
|
15
|
+
export async function loadCached(cacheDir, key, ttlSeconds) {
|
|
16
|
+
try {
|
|
17
|
+
const info = await cacache.get.info(cacheDir, key);
|
|
18
|
+
if (info === null)
|
|
19
|
+
return null;
|
|
20
|
+
const ageSeconds = (Date.now() - info.time) / 1000;
|
|
21
|
+
if (ageSeconds >= ttlSeconds)
|
|
22
|
+
return null;
|
|
23
|
+
const entry = await cacache.get(cacheDir, key);
|
|
24
|
+
return JSON.parse(entry.data.toString('utf8'));
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export async function saveCache(cacheDir, key, data) {
|
|
31
|
+
await cacache.put(cacheDir, key, JSON.stringify(data));
|
|
32
|
+
}
|
|
33
|
+
function normalizeConfig(input) {
|
|
34
|
+
const output = {};
|
|
35
|
+
for (const [key, value] of Object.entries(input)) {
|
|
36
|
+
if (CACHE_IGNORED_FIELDS.has(key))
|
|
37
|
+
continue;
|
|
38
|
+
if (key === 'authHeaders' || key === 'auth_headers') {
|
|
39
|
+
output[key] = normalizeAuthHeaders(value);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
output[key] = value;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return Object.fromEntries(Object.entries(output).sort(([a], [b]) => a.localeCompare(b)));
|
|
46
|
+
}
|
|
47
|
+
function normalizeAuthHeaders(value) {
|
|
48
|
+
if (!Array.isArray(value))
|
|
49
|
+
return value;
|
|
50
|
+
return [...value].sort((a, b) => JSON.stringify(a).localeCompare(JSON.stringify(b)));
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/core/cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC;IACnC,UAAU;IACV,WAAW;IACX,aAAa;IACb,SAAS;IACT,SAAS;IACT,SAAS;CACV,CAAC,CAAC;AAEH,MAAM,UAAU,WAAW,CAAC,MAA+B;IACzD,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAC3C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC5F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,QAAgB,EAChB,GAAW,EACX,UAAkB;IAElB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACnD,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAE/B,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QACnD,IAAI,UAAU,IAAI,UAAU;YAAE,OAAO,IAAI,CAAC;QAE1C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAM,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,GAAW,EAAE,IAAa;IAC1E,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,eAAe,CAAC,KAA8B;IACrD,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5C,IAAI,GAAG,KAAK,aAAa,IAAI,GAAG,KAAK,cAAc,EAAE,CAAC;YACpD,MAAM,CAAC,GAAG,CAAC,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3F,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvF,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { CliValueType, JsonSchema } from './types.js';
|
|
2
|
+
export declare function schemaTypeToCliType(schema: JsonSchema): {
|
|
3
|
+
type: CliValueType;
|
|
4
|
+
suffix: string;
|
|
5
|
+
};
|
|
6
|
+
export declare function coerceAndValidateValue(value: unknown, schema?: JsonSchema, label?: string): unknown;
|
|
7
|
+
export declare function validateValue(value: unknown, schema?: JsonSchema, label?: string): void;
|
|
8
|
+
export declare function coerceValue(value: unknown, schema?: JsonSchema): unknown;
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { Ajv } from 'ajv';
|
|
2
|
+
import addFormatsPlugin from 'ajv-formats';
|
|
3
|
+
const ajv = new Ajv({ allErrors: true, strict: false });
|
|
4
|
+
const addFormats = addFormatsPlugin;
|
|
5
|
+
addFormats(ajv);
|
|
6
|
+
const validatorCache = new WeakMap();
|
|
7
|
+
export function schemaTypeToCliType(schema) {
|
|
8
|
+
switch (schema.type) {
|
|
9
|
+
case 'integer':
|
|
10
|
+
return { type: 'integer', suffix: '' };
|
|
11
|
+
case 'number':
|
|
12
|
+
return { type: 'number', suffix: '' };
|
|
13
|
+
case 'boolean':
|
|
14
|
+
return { type: 'boolean', suffix: '' };
|
|
15
|
+
case 'array':
|
|
16
|
+
return { type: 'string', suffix: ' (JSON array)' };
|
|
17
|
+
case 'object':
|
|
18
|
+
return { type: 'string', suffix: ' (JSON object)' };
|
|
19
|
+
default:
|
|
20
|
+
return { type: 'string', suffix: '' };
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export function coerceAndValidateValue(value, schema = {}, label = 'value') {
|
|
24
|
+
const coerced = coerceValue(value, schema);
|
|
25
|
+
validateValue(coerced, schema, label);
|
|
26
|
+
return coerced;
|
|
27
|
+
}
|
|
28
|
+
export function validateValue(value, schema = {}, label = 'value') {
|
|
29
|
+
if (Object.keys(schema).length === 0)
|
|
30
|
+
return;
|
|
31
|
+
const validate = validatorFor(schema);
|
|
32
|
+
if (validate(value))
|
|
33
|
+
return;
|
|
34
|
+
throw new Error(`${label} failed validation: ${formatAjvErrors(validate.errors ?? [], label)}`);
|
|
35
|
+
}
|
|
36
|
+
function validatorFor(schema) {
|
|
37
|
+
const cached = validatorCache.get(schema);
|
|
38
|
+
if (cached !== undefined)
|
|
39
|
+
return cached;
|
|
40
|
+
const validate = ajv.compile(normalizeSchema(schema));
|
|
41
|
+
validatorCache.set(schema, validate);
|
|
42
|
+
return validate;
|
|
43
|
+
}
|
|
44
|
+
function normalizeSchema(schema) {
|
|
45
|
+
if (schema.nullable === true && typeof schema.type === 'string') {
|
|
46
|
+
return { ...schema, type: [schema.type, 'null'] };
|
|
47
|
+
}
|
|
48
|
+
return schema;
|
|
49
|
+
}
|
|
50
|
+
function formatAjvErrors(errors, label) {
|
|
51
|
+
return errors
|
|
52
|
+
.map((error) => {
|
|
53
|
+
const path = error.instancePath.length > 0 ? `${label}${error.instancePath}` : label;
|
|
54
|
+
return `${path} ${error.message ?? 'is invalid'}`;
|
|
55
|
+
})
|
|
56
|
+
.join('; ');
|
|
57
|
+
}
|
|
58
|
+
export function coerceValue(value, schema = {}) {
|
|
59
|
+
if (value === null || value === undefined)
|
|
60
|
+
return null;
|
|
61
|
+
switch (schema.type) {
|
|
62
|
+
case 'array':
|
|
63
|
+
return coerceArray(value, schema.items);
|
|
64
|
+
case 'object':
|
|
65
|
+
return coerceObject(value);
|
|
66
|
+
case 'boolean':
|
|
67
|
+
return Boolean(value);
|
|
68
|
+
case 'integer':
|
|
69
|
+
return typeof value === 'number' ? Math.trunc(value) : Number.parseInt(String(value), 10);
|
|
70
|
+
case 'number':
|
|
71
|
+
return typeof value === 'number' ? value : Number.parseFloat(String(value));
|
|
72
|
+
default:
|
|
73
|
+
return coerceSchemaless(value);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function coerceArray(value, itemSchema) {
|
|
77
|
+
if (Array.isArray(value))
|
|
78
|
+
return value;
|
|
79
|
+
if (typeof value !== 'string')
|
|
80
|
+
return value;
|
|
81
|
+
try {
|
|
82
|
+
const parsed = JSON.parse(value);
|
|
83
|
+
if (Array.isArray(parsed))
|
|
84
|
+
return parsed;
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// Fall back to comma/single value handling below.
|
|
88
|
+
}
|
|
89
|
+
const values = value.includes(',') ? value.split(',').map((part) => part.trim()) : [value];
|
|
90
|
+
return values.map((item) => coerceItem(item, itemSchema?.type));
|
|
91
|
+
}
|
|
92
|
+
function coerceItem(value, type) {
|
|
93
|
+
switch (type) {
|
|
94
|
+
case 'integer':
|
|
95
|
+
return Number.parseInt(value, 10);
|
|
96
|
+
case 'number':
|
|
97
|
+
return Number.parseFloat(value);
|
|
98
|
+
case 'boolean':
|
|
99
|
+
return ['true', '1', 'yes'].includes(value.toLowerCase());
|
|
100
|
+
default:
|
|
101
|
+
return value;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function coerceObject(value) {
|
|
105
|
+
if (typeof value !== 'string')
|
|
106
|
+
return value;
|
|
107
|
+
try {
|
|
108
|
+
return JSON.parse(value);
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return value;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function coerceSchemaless(value) {
|
|
115
|
+
if (typeof value !== 'string')
|
|
116
|
+
return value;
|
|
117
|
+
const trimmed = value.trim();
|
|
118
|
+
if (!trimmed || !['{', '['].includes(trimmed[0] ?? ''))
|
|
119
|
+
return value;
|
|
120
|
+
try {
|
|
121
|
+
const parsed = JSON.parse(trimmed);
|
|
122
|
+
return typeof parsed === 'object' && parsed !== null ? parsed : value;
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return value;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=coerce.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coerce.js","sourceRoot":"","sources":["../../src/core/coerce.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { minimatch } from 'minimatch';
|
|
2
|
+
export function filterCommands(commands, filters = {}) {
|
|
3
|
+
let result = commands;
|
|
4
|
+
if (filters.methods?.length) {
|
|
5
|
+
const allowed = new Set(filters.methods.map((method) => method.toUpperCase()));
|
|
6
|
+
result = result.filter((command) => command.method === undefined || allowed.has(command.method.toUpperCase()));
|
|
7
|
+
}
|
|
8
|
+
if (filters.include?.length) {
|
|
9
|
+
result = result.filter((command) => filters.include?.some((pattern) => minimatch(command.name, pattern)) ?? false);
|
|
10
|
+
}
|
|
11
|
+
if (filters.exclude?.length) {
|
|
12
|
+
result = result.filter((command) => !(filters.exclude?.some((pattern) => minimatch(command.name, pattern)) ?? false));
|
|
13
|
+
}
|
|
14
|
+
return result;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../../src/core/filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAUtC,MAAM,UAAU,cAAc,CAAC,QAAsB,EAAE,OAAO,GAAmB,EAAE;IACjF,IAAI,MAAM,GAAG,QAAQ,CAAC;IAEtB,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAC/E,MAAM,GAAG,MAAM,CAAC,MAAM,CACpB,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CACvF,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAC5B,MAAM,GAAG,MAAM,CAAC,MAAM,CACpB,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,KAAK,CAC3F,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAC5B,MAAM,GAAG,MAAM,CAAC,MAAM,CACpB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAC9F,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { CommandDef } from './types.js';
|
|
2
|
+
import type { UsageStore } from './usage.js';
|
|
3
|
+
export type SortMode = 'usage' | 'recent' | 'alpha' | 'default';
|
|
4
|
+
export declare function sortCommands(commands: CommandDef[], sortMode: SortMode, sourceHash: string, usageStore: UsageStore): Promise<CommandDef[]>;
|
|
5
|
+
export declare function resolveSortMode(explicitSort: SortMode | undefined, sourceHash: string, usageStore: UsageStore): Promise<SortMode>;
|
|
6
|
+
export declare function applyListOptions(commands: CommandDef[], options: {
|
|
7
|
+
sourceHash: string;
|
|
8
|
+
sortMode?: SortMode;
|
|
9
|
+
top?: number;
|
|
10
|
+
usageStore: UsageStore;
|
|
11
|
+
}): Promise<CommandDef[]>;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export async function sortCommands(commands, sortMode, sourceHash, usageStore) {
|
|
2
|
+
if (sortMode === 'default')
|
|
3
|
+
return commands;
|
|
4
|
+
if (sortMode === 'alpha')
|
|
5
|
+
return [...commands].sort((a, b) => a.name.localeCompare(b.name));
|
|
6
|
+
const usage = (await usageStore.load())[sourceHash] ?? {};
|
|
7
|
+
if (Object.keys(usage).length === 0)
|
|
8
|
+
return commands;
|
|
9
|
+
if (sortMode === 'usage') {
|
|
10
|
+
return [...commands].sort((a, b) => {
|
|
11
|
+
const diff = (usage[usageKey(b)]?.count ?? 0) - (usage[usageKey(a)]?.count ?? 0);
|
|
12
|
+
return diff || 0;
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
return [...commands].sort((a, b) => (usage[usageKey(b)]?.lastUsed ?? '').localeCompare(usage[usageKey(a)]?.lastUsed ?? ''));
|
|
16
|
+
}
|
|
17
|
+
export async function resolveSortMode(explicitSort, sourceHash, usageStore) {
|
|
18
|
+
if (explicitSort !== undefined)
|
|
19
|
+
return explicitSort;
|
|
20
|
+
const usage = (await usageStore.load())[sourceHash] ?? {};
|
|
21
|
+
return Object.keys(usage).length > 0 ? 'usage' : 'default';
|
|
22
|
+
}
|
|
23
|
+
export async function applyListOptions(commands, options) {
|
|
24
|
+
const effectiveSort = await resolveSortMode(options.sortMode, options.sourceHash, options.usageStore);
|
|
25
|
+
const sorted = await sortCommands(commands, effectiveSort, options.sourceHash, options.usageStore);
|
|
26
|
+
return options.top === undefined ? sorted : sorted.slice(0, options.top);
|
|
27
|
+
}
|
|
28
|
+
function usageKey(command) {
|
|
29
|
+
return command.toolName ?? command.graphqlFieldName ?? command.name;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=listing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listing.js","sourceRoot":"","sources":["../../src/core/listing.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAsB,EACtB,QAAkB,EAClB,UAAkB,EAClB,UAAsB;IAEtB,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC5C,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAE5F,MAAM,KAAK,GAAG,CAAC,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IAC1D,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IAErD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACjC,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC;YACjF,OAAO,IAAI,IAAI,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACjC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI,EAAE,CAAC,CACvF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,YAAkC,EAClC,UAAkB,EAClB,UAAsB;IAEtB,IAAI,YAAY,KAAK,SAAS;QAAE,OAAO,YAAY,CAAC;IACpD,MAAM,KAAK,GAAG,CAAC,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IAC1D,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAsB,EACtB,OAKC;IAED,MAAM,aAAa,GAAG,MAAM,eAAe,CACzC,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,UAAU,EAClB,OAAO,CAAC,UAAU,CACnB,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,QAAQ,EACR,aAAa,EACb,OAAO,CAAC,UAAU,EAClB,OAAO,CAAC,UAAU,CACnB,CAAC;IACF,OAAO,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,QAAQ,CAAC,OAAmB;IACnC,OAAO,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function toKebab(name: string): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"names.js","sourceRoot":"","sources":["../../src/core/names.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,IAAI;SACR,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;SAClB,WAAW,EAAE,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type OutputOptions = {
|
|
2
|
+
pretty?: boolean;
|
|
3
|
+
raw?: boolean;
|
|
4
|
+
head?: number;
|
|
5
|
+
toon?: boolean;
|
|
6
|
+
};
|
|
7
|
+
export type FormattedOutput = {
|
|
8
|
+
stdout: string;
|
|
9
|
+
stderr: string;
|
|
10
|
+
};
|
|
11
|
+
export declare function applyHead<T>(data: T, n: number): T;
|
|
12
|
+
export declare function formatOutput(data: unknown, options?: OutputOptions): FormattedOutput;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export function applyHead(data, n) {
|
|
2
|
+
if (Array.isArray(data))
|
|
3
|
+
return data.slice(0, n);
|
|
4
|
+
return data;
|
|
5
|
+
}
|
|
6
|
+
export function formatOutput(data, options = {}) {
|
|
7
|
+
if (options.raw) {
|
|
8
|
+
return {
|
|
9
|
+
stdout: `${typeof data === 'string' ? data : JSON.stringify(data)}\n`,
|
|
10
|
+
stderr: '',
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
let value = parseJsonStringIfPossible(data);
|
|
14
|
+
if (options.head !== undefined)
|
|
15
|
+
value = applyHead(value, options.head);
|
|
16
|
+
if (typeof value === 'string') {
|
|
17
|
+
return { stdout: `${value}\n`, stderr: '' };
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
stdout: `${JSON.stringify(value, null, options.pretty ? 2 : 0)}\n`,
|
|
21
|
+
stderr: '',
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function parseJsonStringIfPossible(data) {
|
|
25
|
+
if (typeof data !== 'string')
|
|
26
|
+
return data;
|
|
27
|
+
try {
|
|
28
|
+
return JSON.parse(data);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return data;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/core/output.ts"],"names":[],"mappings":"AAYA,MAAM,UAAU,SAAS,CAAI,IAAO,EAAE,CAAS;IAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAM,CAAC;IACtD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAa,EAAE,OAAO,GAAkB,EAAE;IACrE,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,OAAO;YACL,MAAM,EAAE,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI;YACrE,MAAM,EAAE,EAAE;SACX,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;QAAE,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,EAAE,MAAM,EAAE,GAAG,KAAK,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAC9C,CAAC;IAED,OAAO;QACL,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;QAClE,MAAM,EAAE,EAAE;KACX,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB,CAAC,IAAa;IAC9C,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function resolveSecret(value: string): Promise<string>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
export async function resolveSecret(value) {
|
|
3
|
+
if (value.startsWith('env:')) {
|
|
4
|
+
const name = value.slice(4);
|
|
5
|
+
const resolved = process.env[name];
|
|
6
|
+
if (resolved === undefined)
|
|
7
|
+
throw new Error(`environment variable ${JSON.stringify(name)} is not set`);
|
|
8
|
+
return resolved;
|
|
9
|
+
}
|
|
10
|
+
if (value.startsWith('file:')) {
|
|
11
|
+
const path = value.slice(5);
|
|
12
|
+
try {
|
|
13
|
+
return (await readFile(path, 'utf8')).replace(/\n$/, '');
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
throw new Error(`secret file not found: ${path}`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=secrets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/core/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAa;IAC/C,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,QAAQ,KAAK,SAAS;YACxB,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC7E,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC;YACH,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|