@refrakt-md/cli 0.1.0

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/dist/bin.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":""}
package/dist/bin.js ADDED
@@ -0,0 +1,118 @@
1
+ #!/usr/bin/env node
2
+ const args = process.argv.slice(2);
3
+ const command = args[0];
4
+ if (!command || command === '--help' || command === '-h') {
5
+ printUsage();
6
+ process.exit(command ? 0 : 1);
7
+ }
8
+ if (command === 'write') {
9
+ runWrite(args.slice(1));
10
+ }
11
+ else if (command.startsWith('-')) {
12
+ console.error(`Error: Unknown flag "${command}"\n`);
13
+ printUsage();
14
+ process.exit(1);
15
+ }
16
+ else {
17
+ console.error(`Error: Unknown command "${command}"\n`);
18
+ printUsage();
19
+ process.exit(1);
20
+ }
21
+ function printUsage() {
22
+ console.log(`
23
+ Usage: refrakt <command> [options]
24
+
25
+ Commands:
26
+ write <prompt> Generate a Markdown content file using AI
27
+
28
+ Write Options:
29
+ --output, -o <path> Write output to file instead of stdout
30
+ --provider, -p <name> Provider: anthropic, ollama (default: auto-detect)
31
+ --model, -m <name> Model name (default: per-provider)
32
+ --help, -h Show this help message
33
+
34
+ Provider auto-detection:
35
+ 1. ANTHROPIC_API_KEY env var → Anthropic
36
+ 2. OLLAMA_HOST env var → Ollama
37
+ 3. Default → Ollama at localhost:11434
38
+
39
+ Examples:
40
+ refrakt write "Create a getting started guide"
41
+ refrakt write -o content/docs/api.md "Write an API reference page"
42
+ refrakt write -p ollama -m llama3.2 "Write a FAQ page"
43
+ ANTHROPIC_API_KEY=sk-... refrakt write "Create a landing page"
44
+ `);
45
+ }
46
+ function runWrite(writeArgs) {
47
+ let prompt;
48
+ let output;
49
+ let providerName;
50
+ let model;
51
+ for (let i = 0; i < writeArgs.length; i++) {
52
+ const arg = writeArgs[i];
53
+ if (arg === '--output' || arg === '-o') {
54
+ output = writeArgs[++i];
55
+ if (!output) {
56
+ console.error('Error: --output requires a file path');
57
+ process.exit(1);
58
+ }
59
+ }
60
+ else if (arg === '--provider' || arg === '-p') {
61
+ providerName = writeArgs[++i];
62
+ if (!providerName) {
63
+ console.error('Error: --provider requires a value');
64
+ process.exit(1);
65
+ }
66
+ }
67
+ else if (arg === '--model' || arg === '-m') {
68
+ model = writeArgs[++i];
69
+ if (!model) {
70
+ console.error('Error: --model requires a value');
71
+ process.exit(1);
72
+ }
73
+ }
74
+ else if (arg === '--help' || arg === '-h') {
75
+ printUsage();
76
+ process.exit(0);
77
+ }
78
+ else if (arg.startsWith('-')) {
79
+ console.error(`Error: Unknown flag "${arg}"\n`);
80
+ printUsage();
81
+ process.exit(1);
82
+ }
83
+ else if (!prompt) {
84
+ prompt = arg;
85
+ }
86
+ else {
87
+ console.error(`Error: Unexpected argument "${arg}"\n`);
88
+ printUsage();
89
+ process.exit(1);
90
+ }
91
+ }
92
+ if (!prompt) {
93
+ console.error('Error: Missing prompt\n');
94
+ printUsage();
95
+ process.exit(1);
96
+ }
97
+ // Dynamic imports to avoid loading @refrakt-md/runes at parse time
98
+ // (markdoc CJS/ESM interop requires Node.js 22.12+ or a bundler)
99
+ Promise.all([
100
+ import('./config.js'),
101
+ import('./commands/write.js'),
102
+ ]).then(([{ detectProvider }, { writeCommand }]) => {
103
+ let resolved;
104
+ try {
105
+ resolved = detectProvider(providerName);
106
+ }
107
+ catch (err) {
108
+ console.error(`\nError: ${err.message}`);
109
+ process.exit(1);
110
+ }
111
+ return writeCommand({ prompt: prompt, provider: resolved.provider, model, output });
112
+ }).catch((err) => {
113
+ console.error(`\nError: ${err.message}`);
114
+ process.exit(1);
115
+ });
116
+ }
117
+ export {};
118
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { AIProvider } from '@refrakt-md/ai';
2
+ export interface WriteOptions {
3
+ prompt: string;
4
+ provider: AIProvider;
5
+ model?: string;
6
+ output?: string;
7
+ }
8
+ export declare function writeCommand(options: WriteOptions): Promise<void>;
9
+ //# sourceMappingURL=write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/commands/write.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAW,MAAM,gBAAgB,CAAC;AAE1D,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,UAAU,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BvE"}
@@ -0,0 +1,28 @@
1
+ import { writeFileSync } from 'node:fs';
2
+ import { generateSystemPrompt } from '@refrakt-md/ai';
3
+ import { runes } from '@refrakt-md/runes';
4
+ export async function writeCommand(options) {
5
+ const { prompt, provider, model, output } = options;
6
+ const systemPrompt = generateSystemPrompt(runes);
7
+ const messages = [
8
+ { role: 'system', content: systemPrompt },
9
+ { role: 'user', content: prompt },
10
+ ];
11
+ let content = '';
12
+ for await (const chunk of provider.complete({ messages, model })) {
13
+ if (output) {
14
+ content += chunk;
15
+ }
16
+ else {
17
+ process.stdout.write(chunk);
18
+ }
19
+ }
20
+ if (output) {
21
+ writeFileSync(output, content);
22
+ process.stderr.write(`Written to ${output}\n`);
23
+ }
24
+ else {
25
+ process.stdout.write('\n');
26
+ }
27
+ }
28
+ //# sourceMappingURL=write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/commands/write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAU1C,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAqB;IACvD,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAEpD,MAAM,YAAY,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAEjD,MAAM,QAAQ,GAAc;QAC3B,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;QACzC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;KACjC,CAAC;IAEF,IAAI,OAAO,GAAG,EAAE,CAAC;IAEjB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAClE,IAAI,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,KAAK,CAAC;QAClB,CAAC;aAAM,CAAC;YACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;IACF,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACZ,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,MAAM,IAAI,CAAC,CAAC;IAChD,CAAC;SAAM,CAAC;QACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;AACF,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { AIProvider } from '@refrakt-md/ai';
2
+ export type ProviderName = 'anthropic' | 'ollama';
3
+ export interface ResolvedProvider {
4
+ provider: AIProvider;
5
+ name: ProviderName;
6
+ }
7
+ export declare function detectProvider(explicit?: string): ResolvedProvider;
8
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGjD,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAC;AAElD,MAAM,WAAW,gBAAgB;IAChC,QAAQ,EAAE,UAAU,CAAC;IACrB,IAAI,EAAE,YAAY,CAAC;CACnB;AAED,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAkBlE"}
package/dist/config.js ADDED
@@ -0,0 +1,42 @@
1
+ import { createAnthropicProvider, createOllamaProvider } from '@refrakt-md/ai';
2
+ export function detectProvider(explicit) {
3
+ if (explicit) {
4
+ return createProviderByName(explicit);
5
+ }
6
+ const anthropicKey = process.env.ANTHROPIC_API_KEY;
7
+ if (anthropicKey) {
8
+ return {
9
+ name: 'anthropic',
10
+ provider: createAnthropicProvider({ apiKey: anthropicKey }),
11
+ };
12
+ }
13
+ const ollamaHost = process.env.OLLAMA_HOST;
14
+ return {
15
+ name: 'ollama',
16
+ provider: createOllamaProvider(ollamaHost ? { host: ollamaHost } : undefined),
17
+ };
18
+ }
19
+ function createProviderByName(name) {
20
+ switch (name) {
21
+ case 'anthropic': {
22
+ const apiKey = process.env.ANTHROPIC_API_KEY;
23
+ if (!apiKey) {
24
+ throw new Error('ANTHROPIC_API_KEY environment variable is required for the Anthropic provider');
25
+ }
26
+ return {
27
+ name: 'anthropic',
28
+ provider: createAnthropicProvider({ apiKey }),
29
+ };
30
+ }
31
+ case 'ollama': {
32
+ const host = process.env.OLLAMA_HOST;
33
+ return {
34
+ name: 'ollama',
35
+ provider: createOllamaProvider(host ? { host } : undefined),
36
+ };
37
+ }
38
+ default:
39
+ throw new Error(`Unknown provider "${name}". Available: anthropic, ollama`);
40
+ }
41
+ }
42
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAS/E,MAAM,UAAU,cAAc,CAAC,QAAiB;IAC/C,IAAI,QAAQ,EAAE,CAAC;QACd,OAAO,oBAAoB,CAAC,QAAwB,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IACnD,IAAI,YAAY,EAAE,CAAC;QAClB,OAAO;YACN,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE,uBAAuB,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;SAC3D,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IAC3C,OAAO;QACN,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,oBAAoB,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;KAC7E,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAkB;IAC/C,QAAQ,IAAI,EAAE,CAAC;QACd,KAAK,WAAW,CAAC,CAAC,CAAC;YAClB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;YAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CACd,+EAA+E,CAC/E,CAAC;YACH,CAAC;YACD,OAAO;gBACN,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC;aAC7C,CAAC;QACH,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACf,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;YACrC,OAAO;gBACN,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;aAC3D,CAAC;QACH,CAAC;QACD;YACC,MAAM,IAAI,KAAK,CACd,qBAAqB,IAAI,iCAAiC,CAC1D,CAAC;IACJ,CAAC;AACF,CAAC"}
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@refrakt-md/cli",
3
+ "description": "CLI tools for refrakt.md",
4
+ "version": "0.1.0",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/refrakt-md/refrakt.git",
10
+ "directory": "packages/cli"
11
+ },
12
+ "bugs": "https://github.com/refrakt-md/refrakt/issues",
13
+ "homepage": "https://github.com/refrakt-md/refrakt",
14
+ "publishConfig": {
15
+ "access": "public"
16
+ },
17
+ "bin": {
18
+ "refrakt": "./dist/bin.js"
19
+ },
20
+ "files": [
21
+ "dist"
22
+ ],
23
+ "scripts": {
24
+ "build": "tsc"
25
+ },
26
+ "dependencies": {
27
+ "@refrakt-md/ai": "0.1.0",
28
+ "@refrakt-md/runes": "0.1.0"
29
+ }
30
+ }