govuk-rewrite-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.
Files changed (57) hide show
  1. package/dist/chat-commands.d.ts +31 -0
  2. package/dist/chat-commands.d.ts.map +1 -0
  3. package/dist/chat-commands.js +240 -0
  4. package/dist/chat-commands.js.map +1 -0
  5. package/dist/chat-ink.d.ts +9 -0
  6. package/dist/chat-ink.d.ts.map +1 -0
  7. package/dist/chat-ink.js +17 -0
  8. package/dist/chat-ink.js.map +1 -0
  9. package/dist/chat-session.d.ts +64 -0
  10. package/dist/chat-session.d.ts.map +1 -0
  11. package/dist/chat-session.js +195 -0
  12. package/dist/chat-session.js.map +1 -0
  13. package/dist/chat-ui.d.ts +8 -0
  14. package/dist/chat-ui.d.ts.map +1 -0
  15. package/dist/chat-ui.js +342 -0
  16. package/dist/chat-ui.js.map +1 -0
  17. package/dist/chat.d.ts +14 -0
  18. package/dist/chat.d.ts.map +1 -0
  19. package/dist/chat.js +24 -0
  20. package/dist/chat.js.map +1 -0
  21. package/dist/config.d.ts +28 -0
  22. package/dist/config.d.ts.map +1 -0
  23. package/dist/config.js +107 -0
  24. package/dist/config.js.map +1 -0
  25. package/dist/constants.d.ts +4 -0
  26. package/dist/constants.d.ts.map +1 -0
  27. package/dist/constants.js +9 -0
  28. package/dist/constants.js.map +1 -0
  29. package/dist/errors.d.ts +5 -0
  30. package/dist/errors.d.ts.map +1 -0
  31. package/dist/errors.js +35 -0
  32. package/dist/errors.js.map +1 -0
  33. package/dist/index.d.ts +3 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +129 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/io.d.ts +5 -0
  38. package/dist/io.d.ts.map +1 -0
  39. package/dist/io.js +51 -0
  40. package/dist/io.js.map +1 -0
  41. package/dist/oneshot.d.ts +21 -0
  42. package/dist/oneshot.d.ts.map +1 -0
  43. package/dist/oneshot.js +86 -0
  44. package/dist/oneshot.js.map +1 -0
  45. package/dist/output.d.ts +21 -0
  46. package/dist/output.d.ts.map +1 -0
  47. package/dist/output.js +89 -0
  48. package/dist/output.js.map +1 -0
  49. package/dist/session-config.d.ts +8 -0
  50. package/dist/session-config.d.ts.map +1 -0
  51. package/dist/session-config.js +18 -0
  52. package/dist/session-config.js.map +1 -0
  53. package/dist/setup.d.ts +42 -0
  54. package/dist/setup.d.ts.map +1 -0
  55. package/dist/setup.js +214 -0
  56. package/dist/setup.js.map +1 -0
  57. package/package.json +54 -0
package/dist/setup.js ADDED
@@ -0,0 +1,214 @@
1
+ import { createInterface } from "node:readline/promises";
2
+ import { DEFAULT_MODELS, DEFAULT_TIMEOUT_MS, rewrite } from "govuk-rewrite";
3
+ import { getApiKeyEnvVarForProvider, getDefaultConfigFilePath, readConfigFile, writeConfigFile, } from "./config.js";
4
+ const VALID_PROVIDERS = ["openai", "anthropic", "openrouter"];
5
+ export class SetupUsageError extends Error {
6
+ exitCode = 2;
7
+ }
8
+ export function supportsInteractiveSetup(stdinIsTTY = Boolean(process.stdin.isTTY), stdoutIsTTY = Boolean(process.stdout.isTTY)) {
9
+ return stdinIsTTY && stdoutIsTTY;
10
+ }
11
+ export function buildSetupNonInteractiveMessage(customPath) {
12
+ const configPath = customPath ?? getDefaultConfigFilePath();
13
+ return [
14
+ "Error: setup requires interactive stdin and stdout.",
15
+ "",
16
+ "Run this command directly in a terminal:",
17
+ " govuk-rewrite setup",
18
+ "",
19
+ `Config file path: ${configPath}`,
20
+ ].join("\n");
21
+ }
22
+ function defaultWriteLine(line) {
23
+ process.stderr.write(`${line}\n`);
24
+ }
25
+ function parseYesNo(answer, defaultValue) {
26
+ const normalized = answer.trim().toLowerCase();
27
+ if (!normalized)
28
+ return defaultValue;
29
+ if (normalized === "y" || normalized === "yes")
30
+ return true;
31
+ if (normalized === "n" || normalized === "no")
32
+ return false;
33
+ return null;
34
+ }
35
+ async function askYesNo(ask, writeLine, question, defaultValue) {
36
+ while (true) {
37
+ const answer = await ask(question);
38
+ const parsed = parseYesNo(answer, defaultValue);
39
+ if (parsed !== null)
40
+ return parsed;
41
+ writeLine("Please answer y or n.");
42
+ }
43
+ }
44
+ async function askProvider(ask, writeLine, current) {
45
+ while (true) {
46
+ const answer = (await ask(`Provider [${current}] (openai|anthropic|openrouter): `))
47
+ .trim()
48
+ .toLowerCase();
49
+ if (!answer)
50
+ return current;
51
+ if (answer === "openai" || answer === "anthropic" || answer === "openrouter") {
52
+ return answer;
53
+ }
54
+ writeLine(`Invalid provider. Valid values: ${VALID_PROVIDERS.join(", ")}`);
55
+ }
56
+ }
57
+ async function askOptionalTimeout(ask, writeLine) {
58
+ while (true) {
59
+ const answer = (await ask(`Timeout in ms (leave blank for default ${DEFAULT_TIMEOUT_MS}): `)).trim();
60
+ if (!answer)
61
+ return undefined;
62
+ const parsed = parseInt(answer, 10);
63
+ if (!isNaN(parsed) && parsed > 0) {
64
+ return parsed;
65
+ }
66
+ writeLine("Timeout must be a positive integer.");
67
+ }
68
+ }
69
+ function buildConfigToPersist(input) {
70
+ const config = { provider: input.provider };
71
+ if (input.model?.trim()) {
72
+ config.model = input.model.trim();
73
+ }
74
+ if (typeof input.timeoutMs === "number") {
75
+ config.timeoutMs = input.timeoutMs;
76
+ }
77
+ if (input.baseUrl?.trim()) {
78
+ config.baseUrl = input.baseUrl.trim();
79
+ }
80
+ return config;
81
+ }
82
+ async function askWithTemporaryReadline(question) {
83
+ const rl = createInterface({
84
+ input: process.stdin,
85
+ output: process.stderr,
86
+ terminal: true,
87
+ });
88
+ try {
89
+ return await rl.question(question);
90
+ }
91
+ finally {
92
+ rl.close();
93
+ }
94
+ }
95
+ export async function runSetup(options = {}) {
96
+ const stdinIsTTY = options.stdinIsTTY ?? Boolean(process.stdin.isTTY);
97
+ const stdoutIsTTY = options.stdoutIsTTY ?? Boolean(process.stdout.isTTY);
98
+ if (!supportsInteractiveSetup(stdinIsTTY, stdoutIsTTY)) {
99
+ throw new SetupUsageError(buildSetupNonInteractiveMessage(options.configPath));
100
+ }
101
+ const writeLine = options.writeLine ?? defaultWriteLine;
102
+ const readConfig = options.readConfig ?? readConfigFile;
103
+ const writeConfig = options.writeConfig ?? writeConfigFile;
104
+ const rewriteImpl = options.rewriteImpl ?? rewrite;
105
+ const configPath = options.configPath ?? getDefaultConfigFilePath();
106
+ const existing = readConfig(configPath);
107
+ const defaultProvider = options.preferredProvider ?? existing.provider ?? "openai";
108
+ let rl;
109
+ const ask = options.prompt ??
110
+ (async (question) => {
111
+ if (!rl) {
112
+ rl = createInterface({
113
+ input: process.stdin,
114
+ output: process.stderr,
115
+ terminal: true,
116
+ });
117
+ }
118
+ return rl.question(question);
119
+ });
120
+ try {
121
+ writeLine("govuk-rewrite setup");
122
+ writeLine("This will save provider defaults to your local config file.");
123
+ const provider = await askProvider(ask, writeLine, defaultProvider);
124
+ const defaultModel = DEFAULT_MODELS[provider];
125
+ const modelInput = (await ask(`Model override (leave blank for provider default: ${defaultModel}): `)).trim();
126
+ const model = modelInput || undefined;
127
+ const timeoutMs = await askOptionalTimeout(ask, writeLine);
128
+ const baseUrlInput = (await ask("Base URL override (leave blank to clear): ")).trim();
129
+ const baseUrl = baseUrlInput || undefined;
130
+ const envVarName = getApiKeyEnvVarForProvider(provider);
131
+ const apiKeyInput = (await ask(`API key for ${envVarName} (optional, leave blank to skip): `)).trim();
132
+ const apiKey = apiKeyInput || undefined;
133
+ const shouldVerify = await askYesNo(ask, writeLine, "Run a verification request now? [y/N]: ", false);
134
+ if (shouldVerify) {
135
+ if (!apiKey) {
136
+ writeLine("Skipping verification because no API key was provided.");
137
+ }
138
+ else {
139
+ try {
140
+ await rewriteImpl({
141
+ text: "Please kindly complete the form before Friday.",
142
+ explain: false,
143
+ mode: "page-body",
144
+ }, {
145
+ provider,
146
+ apiKey,
147
+ model: model ?? DEFAULT_MODELS[provider],
148
+ timeoutMs: timeoutMs ?? DEFAULT_TIMEOUT_MS,
149
+ baseUrl,
150
+ });
151
+ writeLine("Verification successful.");
152
+ }
153
+ catch (err) {
154
+ const message = err instanceof Error ? err.message : String(err);
155
+ writeLine(`Verification failed: ${message}`);
156
+ }
157
+ }
158
+ }
159
+ const configToPersist = buildConfigToPersist({
160
+ provider,
161
+ model,
162
+ timeoutMs,
163
+ baseUrl,
164
+ });
165
+ writeConfig(configToPersist, configPath);
166
+ writeLine(`Saved config to ${configPath}`);
167
+ writeLine("");
168
+ writeLine("Set your API key in your shell profile:");
169
+ writeLine(` export ${envVarName}=your-key-here`);
170
+ writeLine("");
171
+ writeLine("Then run:");
172
+ writeLine(' govuk-rewrite "Please kindly complete the form"');
173
+ writeLine(" govuk-rewrite chat");
174
+ return {
175
+ ran: true,
176
+ apiKeySet: Boolean(apiKey),
177
+ provider,
178
+ envVarName,
179
+ apiKey,
180
+ configPath,
181
+ };
182
+ }
183
+ finally {
184
+ rl?.close();
185
+ }
186
+ }
187
+ export async function maybeRunInteractiveSetupOnMissingKey(options) {
188
+ const stdinIsTTY = options.stdinIsTTY ?? Boolean(process.stdin.isTTY);
189
+ const stdoutIsTTY = options.stdoutIsTTY ?? Boolean(process.stdout.isTTY);
190
+ if (!supportsInteractiveSetup(stdinIsTTY, stdoutIsTTY)) {
191
+ return { ran: false, apiKeySet: false };
192
+ }
193
+ const writeLine = options.writeLine ?? defaultWriteLine;
194
+ const ask = options.prompt ?? askWithTemporaryReadline;
195
+ const shouldRunSetup = await askYesNo(ask, writeLine, "No API key found. Run setup now? [Y/n]: ", true);
196
+ if (!shouldRunSetup) {
197
+ return { ran: false, apiKeySet: false };
198
+ }
199
+ const setupImpl = options.runSetupImpl ?? runSetup;
200
+ const setupResult = await setupImpl({
201
+ configPath: options.configPath,
202
+ preferredProvider: options.provider,
203
+ prompt: options.prompt,
204
+ writeLine,
205
+ stdinIsTTY,
206
+ stdoutIsTTY,
207
+ });
208
+ if (setupResult.apiKey) {
209
+ process.env[setupResult.envVarName] = setupResult.apiKey;
210
+ return { ran: true, apiKeySet: true };
211
+ }
212
+ return { ran: true, apiKeySet: false };
213
+ }
214
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "govuk-rewrite-cli",
3
+ "version": "0.1.0",
4
+ "description": "A tiny CLI that rewrites text into GOV.UK-style content",
5
+ "author": "Dan Sensecall",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/sensecall/govuk-rewrite",
10
+ "directory": "packages/cli"
11
+ },
12
+ "type": "module",
13
+ "bin": {
14
+ "govuk-rewrite": "./dist/index.js"
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "keywords": [
20
+ "govuk",
21
+ "content",
22
+ "rewrite",
23
+ "cli"
24
+ ],
25
+ "dependencies": {
26
+ "commander": "^12.1.0",
27
+ "govuk-rewrite": "^1.0.0",
28
+ "ink": "^5.2.1",
29
+ "ink-spinner": "^5.0.0",
30
+ "ink-text-input": "^6.0.0",
31
+ "ora": "^8.1.1",
32
+ "react": "^18.3.1"
33
+ },
34
+ "scripts": {
35
+ "build": "tsc -p tsconfig.json",
36
+ "clean": "node --eval \"['dist','tsconfig.tsbuildinfo'].forEach(p=>require('fs').rmSync(p,{recursive:true,force:true}))\"",
37
+ "prebuild": "npm run clean",
38
+ "prepublishOnly": "npm run build",
39
+ "dev": "tsx src/index.ts",
40
+ "relink": "npm unlink -g 2>/dev/null; npm run build && npm link",
41
+ "test": "vitest run",
42
+ "test:watch": "vitest"
43
+ },
44
+ "engines": {
45
+ "node": ">=18"
46
+ },
47
+ "devDependencies": {
48
+ "@types/node": "^22.10.0",
49
+ "@types/react": "^18.3.10",
50
+ "tsx": "^4.19.2",
51
+ "typescript": "^5.7.2",
52
+ "vitest": "^2.1.8"
53
+ }
54
+ }