govuk-rewrite 0.1.0 → 1.0.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.
@@ -0,0 +1,4 @@
1
+ import type { Provider } from "./types.js";
2
+ export declare const DEFAULT_TIMEOUT_MS = 30000;
3
+ export declare const DEFAULT_MODELS: Record<Provider, string>;
4
+ //# sourceMappingURL=defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,eAAO,MAAM,kBAAkB,QAAQ,CAAC;AAExC,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAInD,CAAC"}
@@ -0,0 +1,7 @@
1
+ export const DEFAULT_TIMEOUT_MS = 30000;
2
+ export const DEFAULT_MODELS = {
3
+ openai: "gpt-4.1-mini",
4
+ anthropic: "claude-3-5-sonnet-latest",
5
+ openrouter: "openai/gpt-4.1-mini",
6
+ };
7
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC;AAExC,MAAM,CAAC,MAAM,cAAc,GAA6B;IACtD,MAAM,EAAE,cAAc;IACtB,SAAS,EAAE,0BAA0B;IACrC,UAAU,EAAE,qBAAqB;CAClC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { EngineOptions, RewriteRequest, RewriteResult } from "./types.js";
2
+ export declare function rewrite(request: RewriteRequest, options: EngineOptions): Promise<RewriteResult>;
3
+ export declare function createClient(options: EngineOptions): {
4
+ rewrite: (request: RewriteRequest) => Promise<RewriteResult>;
5
+ };
6
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,aAAa,EAGb,cAAc,EACd,aAAa,EACd,MAAM,YAAY,CAAC;AAcpB,wBAAsB,OAAO,CAC3B,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,aAAa,CAAC,CAaxB;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG;IACpD,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;CAC9D,CAIA"}
package/dist/engine.js ADDED
@@ -0,0 +1,30 @@
1
+ import * as openai from "./providers/openai.js";
2
+ import * as anthropic from "./providers/anthropic.js";
3
+ import * as openrouter from "./providers/openrouter.js";
4
+ import { normaliseEngineOptions } from "./validation.js";
5
+ function selectAdapter(provider) {
6
+ switch (provider) {
7
+ case "openai":
8
+ return openai.rewrite;
9
+ case "anthropic":
10
+ return anthropic.rewrite;
11
+ case "openrouter":
12
+ return openrouter.rewrite;
13
+ }
14
+ }
15
+ export async function rewrite(request, options) {
16
+ const normalized = normaliseEngineOptions(options);
17
+ const adapter = selectAdapter(normalized.provider);
18
+ return adapter({
19
+ apiKey: normalized.apiKey,
20
+ model: normalized.model,
21
+ timeoutMs: normalized.timeoutMs,
22
+ baseUrl: normalized.baseUrl,
23
+ }, request);
24
+ }
25
+ export function createClient(options) {
26
+ return {
27
+ rewrite: async (request) => rewrite(request, options),
28
+ };
29
+ }
30
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,uBAAuB,CAAC;AAChD,OAAO,KAAK,SAAS,MAAM,0BAA0B,CAAC;AACtD,OAAO,KAAK,UAAU,MAAM,2BAA2B,CAAC;AAQxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,SAAS,aAAa,CAAC,QAAkB;IACvC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB,KAAK,WAAW;YACd,OAAO,SAAS,CAAC,OAAO,CAAC;QAC3B,KAAK,YAAY;YACf,OAAO,UAAU,CAAC,OAAO,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,OAAuB,EACvB,OAAsB;IAEtB,MAAM,UAAU,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,aAAa,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAEnD,OAAO,OAAO,CACZ;QACE,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,SAAS,EAAE,UAAU,CAAC,SAAS;QAC/B,OAAO,EAAE,UAAU,CAAC,OAAO;KAC5B,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAsB;IAGjD,OAAO;QACL,OAAO,EAAE,KAAK,EAAE,OAAuB,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC;KACtE,CAAC;AACJ,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
- #!/usr/bin/env node
2
- export {};
1
+ export { createClient, rewrite } from "./engine.js";
2
+ export { DEFAULT_MODELS, DEFAULT_TIMEOUT_MS } from "./defaults.js";
3
+ export { normaliseEngineOptions } from "./validation.js";
4
+ export type { ContentMode, EngineOptions, NormalizedEngineOptions, Provider, ProviderAdapter, ProviderOptions, RewriteRequest, RewriteResult, } from "./types.js";
3
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,YAAY,EACV,WAAW,EACX,aAAa,EACb,uBAAuB,EACvB,QAAQ,EACR,eAAe,EACf,eAAe,EACf,cAAc,EACd,aAAa,GACd,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,207 +1,4 @@
1
- #!/usr/bin/env node
2
- import { program } from "commander";
3
- import ora from "ora";
4
- import { readFileSync } from "node:fs";
5
- import { fileURLToPath } from "node:url";
6
- import { dirname, join } from "node:path";
7
- import { resolveConfig } from "./config.js";
8
- import { readStdin, isStdinPiped, formatOutput, writeClipboard } from "./io.js";
9
- import * as openai from "./providers/openai.js";
10
- import * as anthropic from "./providers/anthropic.js";
11
- import * as openrouter from "./providers/openrouter.js";
12
- const VALID_MODES = [
13
- "page-body",
14
- "error-message",
15
- "hint-text",
16
- "notification",
17
- "button",
18
- ];
19
- const __dirname = dirname(fileURLToPath(import.meta.url));
20
- function getVersion() {
21
- try {
22
- const pkgPath = join(__dirname, "..", "package.json");
23
- const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
24
- return pkg.version;
25
- }
26
- catch {
27
- return "0.0.0";
28
- }
29
- }
30
- program.configureOutput({ outputError: () => { } });
31
- program.exitOverride((err) => {
32
- if (err.code === "commander.helpDisplayed" || err.code === "commander.version") {
33
- process.exit(0);
34
- }
35
- // Strip the leading "error: " that commander adds so we can normalise capitalisation
36
- const msg = err.message.replace(/^error:\s*/i, "");
37
- if (err.code === "commander.unknownOption") {
38
- process.stderr.write(`Error: ${msg}\n\nRun 'govuk-rewrite --help' for a list of valid options.\n`);
39
- }
40
- else {
41
- process.stderr.write(`Error: ${msg}\n\nRun 'govuk-rewrite --help' for usage information.\n`);
42
- }
43
- process.exit(2);
44
- });
45
- program
46
- .name("govuk-rewrite")
47
- .description("Rewrite text into GOV.UK-style content")
48
- .version(getVersion(), "-v, --version")
49
- .argument("[text...]", "Text to rewrite (or pipe via stdin)")
50
- .option("--explain", "Include a short explanation of changes")
51
- .option("--diff", "Show a line diff between original and rewritten text")
52
- .option("--check", "Audit text for GOV.UK style issues without rewriting")
53
- .option("--json", "Output JSON")
54
- .option("--context <text>", "Service or audience context to inform the rewrite")
55
- .option("--mode <type>", `Content type: ${VALID_MODES.join(" | ")} (default: page-body)`)
56
- .option("--provider <name>", "Provider: openai | anthropic | openrouter")
57
- .option("--model <name>", "Model name for the chosen provider")
58
- .option("--config <path>", "Path to a config.json file")
59
- .option("--timeout <ms>", "Request timeout in milliseconds", parseInt)
60
- .option("--no-spinner", "Disable spinner")
61
- .option("--no-copy", "Do not auto-copy result to clipboard")
62
- .addHelpText("after", `
63
- Examples:
64
- $ govuk-rewrite "Please be advised that the service will be unavailable"
65
- $ echo "Click here to find out more" | govuk-rewrite
66
- $ govuk-rewrite --explain "Please note that you must submit your form by Friday"
67
- $ govuk-rewrite --mode error-message "Sorry, something went wrong. Please try again."
68
- $ govuk-rewrite --check "Thank you for your kind submission"
69
- $ govuk-rewrite --diff --context "HMRC self-assessment" "Please ensure you complete the form"
70
- $ govuk-rewrite --provider anthropic "Your application has been received"
71
-
72
- Environment variables:
73
- OPENAI_API_KEY API key for OpenAI (default provider)
74
- ANTHROPIC_API_KEY API key for Anthropic
75
- OPENROUTER_API_KEY API key for OpenRouter
76
- GOVUK_REWRITE_PROVIDER Default provider (openai | anthropic | openrouter)
77
- GOVUK_REWRITE_MODEL Default model name
78
- GOVUK_REWRITE_TIMEOUT_MS Request timeout override in milliseconds`)
79
- .action(async (textArgs, opts) => {
80
- let inputText = "";
81
- if (isStdinPiped()) {
82
- inputText = await readStdin();
83
- }
84
- else if (textArgs.length > 0) {
85
- inputText = textArgs.join(" ");
86
- }
87
- if (!inputText) {
88
- process.stderr.write(program.helpInformation());
89
- process.exit(2);
90
- }
91
- if (opts.mode && !VALID_MODES.includes(opts.mode)) {
92
- process.stderr.write(`Error: invalid --mode "${opts.mode}". Valid values: ${VALID_MODES.join(", ")}\n`);
93
- process.exit(2);
94
- }
95
- const config = resolveConfig({
96
- provider: opts.provider,
97
- model: opts.model,
98
- timeout: opts.timeout,
99
- config: opts.config,
100
- });
101
- if (!config.apiKey) {
102
- const KEY_INFO = {
103
- openai: {
104
- envVar: "OPENAI_API_KEY",
105
- link: "https://platform.openai.com/api-keys",
106
- },
107
- anthropic: {
108
- envVar: "ANTHROPIC_API_KEY",
109
- link: "https://console.anthropic.com/settings/keys",
110
- },
111
- openrouter: {
112
- envVar: "OPENROUTER_API_KEY",
113
- link: "https://openrouter.ai/keys",
114
- },
115
- };
116
- const info = KEY_INFO[config.provider];
117
- const envVar = info?.envVar ?? "YOUR_API_KEY";
118
- const lines = [
119
- `Error: no API key found for provider "${config.provider}".`,
120
- "",
121
- `Set the ${envVar} environment variable:`,
122
- ` export ${envVar}=your-key-here`,
123
- "",
124
- ];
125
- if (info?.link) {
126
- lines.push(`Get a key at: ${info.link}`, "");
127
- }
128
- lines.push(`Using a different provider? Pass --provider openai | anthropic | openrouter`, "");
129
- process.stderr.write(lines.join("\n"));
130
- process.exit(1);
131
- }
132
- const providerOptions = {
133
- apiKey: config.apiKey,
134
- model: config.model,
135
- baseUrl: config.baseUrl,
136
- timeoutMs: config.timeoutMs,
137
- };
138
- const useSpinner = opts.spinner && process.stdout.isTTY === true;
139
- const spinner = useSpinner ? ora("Rewriting…").start() : null;
140
- try {
141
- let result;
142
- const request = {
143
- text: inputText,
144
- explain: opts.explain ?? false,
145
- check: opts.check ?? false,
146
- context: opts.context,
147
- mode: opts.mode ?? "page-body",
148
- };
149
- switch (config.provider) {
150
- case "openai":
151
- result = await openai.rewrite(providerOptions, request);
152
- break;
153
- case "anthropic":
154
- result = await anthropic.rewrite(providerOptions, request);
155
- break;
156
- case "openrouter":
157
- result = await openrouter.rewrite(providerOptions, request);
158
- break;
159
- default:
160
- throw new Error(`Unknown provider: ${config.provider}`);
161
- }
162
- spinner?.stop();
163
- let format;
164
- if (opts.json) {
165
- format = "json";
166
- }
167
- else if (opts.check) {
168
- format = "check";
169
- }
170
- else if (opts.diff) {
171
- format = "diff";
172
- }
173
- else if (opts.explain) {
174
- format = "explain";
175
- }
176
- else {
177
- format = "plain";
178
- }
179
- const output = formatOutput({
180
- result,
181
- format,
182
- provider: config.provider,
183
- model: config.model,
184
- originalText: inputText,
185
- });
186
- process.stdout.write(output + "\n");
187
- // Auto-copy rewritten text to clipboard when running interactively
188
- if (process.stdout.isTTY && opts.copy && !opts.check) {
189
- const copied = writeClipboard(result.rewrittenText);
190
- if (copied) {
191
- process.stderr.write("(copied to clipboard)\n");
192
- }
193
- }
194
- }
195
- catch (err) {
196
- spinner?.fail();
197
- const message = err instanceof Error ? err.message : String(err);
198
- process.stderr.write(`Error: ${message}\n`);
199
- process.exit(1);
200
- }
201
- });
202
- program.parseAsync(process.argv).catch((err) => {
203
- const message = err instanceof Error ? err.message : String(err);
204
- process.stderr.write(`Error: ${message}\n`);
205
- process.exit(1);
206
- });
1
+ export { createClient, rewrite } from "./engine.js";
2
+ export { DEFAULT_MODELS, DEFAULT_TIMEOUT_MS } from "./defaults.js";
3
+ export { normaliseEngineOptions } from "./validation.js";
207
4
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAmDlF,wBAAsB,OAAO,CAC3B,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CAyDxB"}
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAuDlF,wBAAsB,OAAO,CAC3B,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CAiExB"}
@@ -34,7 +34,7 @@ export async function rewrite(options, request) {
34
34
  : buildUserMessage(request.text, request.explain, request.context, request.mode);
35
35
  const body = {
36
36
  model: options.model,
37
- max_tokens: 4096,
37
+ max_tokens: 8192,
38
38
  system: systemPrompt,
39
39
  messages: [{ role: "user", content: userMessage }],
40
40
  tools: [TOOL_DEFINITION],
@@ -72,6 +72,13 @@ export async function rewrite(options, request) {
72
72
  if (!toolUse?.input) {
73
73
  throw new Error("Anthropic returned no tool use result");
74
74
  }
75
- return toolUse.input;
75
+ const result = toolUse.input;
76
+ if (data.usage) {
77
+ result.usage = {
78
+ inputTokens: data.usage.input_tokens,
79
+ outputTokens: data.usage.output_tokens,
80
+ };
81
+ }
82
+ return result;
76
83
  }
77
84
  //# sourceMappingURL=anthropic.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA4BlF,wBAAsB,OAAO,CAC3B,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CAkExB"}
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAgClF,wBAAsB,OAAO,CAC3B,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CAyExB"}
@@ -57,6 +57,12 @@ export async function rewrite(options, request) {
57
57
  catch {
58
58
  throw new Error("OpenAI returned malformed JSON");
59
59
  }
60
+ if (data.usage) {
61
+ parsed.usage = {
62
+ inputTokens: data.usage.prompt_tokens,
63
+ outputTokens: data.usage.completion_tokens,
64
+ };
65
+ }
60
66
  return parsed;
61
67
  }
62
68
  //# sourceMappingURL=openai.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"openrouter.d.ts","sourceRoot":"","sources":["../../src/providers/openrouter.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA4BlF,wBAAsB,OAAO,CAC3B,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CAoExB"}
1
+ {"version":3,"file":"openrouter.d.ts","sourceRoot":"","sources":["../../src/providers/openrouter.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAgClF,wBAAsB,OAAO,CAC3B,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CA2ExB"}
@@ -59,6 +59,12 @@ export async function rewrite(options, request) {
59
59
  catch {
60
60
  throw new Error("OpenRouter returned malformed JSON");
61
61
  }
62
+ if (data.usage) {
63
+ parsed.usage = {
64
+ inputTokens: data.usage.prompt_tokens,
65
+ outputTokens: data.usage.completion_tokens,
66
+ };
67
+ }
62
68
  return parsed;
63
69
  }
64
70
  //# sourceMappingURL=openrouter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../src/providers/openrouter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,WAAW,GACZ,MAAM,cAAc,CAAC;AA6BtB,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,OAAwB,EACxB,OAAuB;IAEvB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,2BAA2B,CAAC;IAC/D,MAAM,GAAG,GAAG,GAAG,OAAO,sBAAsB,CAAC;IAE7C,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK;QAChC,CAAC,CAAC,mBAAmB;QACrB,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpC,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK;QAC/B,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC;QAChE,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnF,MAAM,IAAI,GAAsB;QAC9B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,QAAQ,EAAE;YACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;YACzC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE;SACvC;QACD,eAAe,EAAE;YACf,IAAI,EAAE,aAAa;YACnB,WAAW,EAAE,WAAW;SACzB;KACF,CAAC;IAEF,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAEtE,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC1B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,OAAO,CAAC,MAAM,EAAE;gBACzC,cAAc,EAAE,kCAAkC;gBAClD,SAAS,EAAE,eAAe;aAC3B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1B,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,2BAA2B,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC;QACpE,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxF,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAuB,CAAC;IAE3D,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,yBAAyB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC;IAClD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,MAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAkB,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../src/providers/openrouter.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,22 +1,27 @@
1
1
  export type Provider = "openai" | "anthropic" | "openrouter";
2
2
  export type ContentMode = "page-body" | "error-message" | "hint-text" | "notification" | "button";
3
+ export interface TokenUsage {
4
+ inputTokens: number;
5
+ outputTokens: number;
6
+ }
3
7
  export interface RewriteResult {
4
8
  rewrittenText: string;
5
9
  explanation?: string[];
6
10
  issues?: string[];
11
+ usage?: TokenUsage;
7
12
  }
8
- export interface Config {
13
+ export interface EngineOptions {
9
14
  provider: Provider;
10
- model: string;
11
- timeoutMs: number;
15
+ apiKey: string;
16
+ model?: string;
17
+ timeoutMs?: number;
12
18
  baseUrl?: string;
13
- apiKey?: string;
14
19
  }
15
20
  export interface ProviderOptions {
16
21
  apiKey: string;
17
22
  model: string;
18
- baseUrl?: string;
19
23
  timeoutMs: number;
24
+ baseUrl?: string;
20
25
  }
21
26
  export interface RewriteRequest {
22
27
  text: string;
@@ -26,11 +31,7 @@ export interface RewriteRequest {
26
31
  mode?: ContentMode;
27
32
  }
28
33
  export type ProviderAdapter = (options: ProviderOptions, request: RewriteRequest) => Promise<RewriteResult>;
29
- export interface OutputOptions {
30
- result: RewriteResult;
31
- format: "plain" | "explain" | "json" | "diff" | "check";
34
+ export interface NormalizedEngineOptions extends ProviderOptions {
32
35
  provider: Provider;
33
- model: string;
34
- originalText?: string;
35
36
  }
36
37
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,YAAY,CAAC;AAE7D,MAAM,MAAM,WAAW,GACnB,WAAW,GACX,eAAe,GACf,WAAW,GACX,cAAc,GACd,QAAQ,CAAC;AAEb,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,MAAM;IACrB,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED,MAAM,MAAM,eAAe,GAAG,CAC5B,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,cAAc,KACpB,OAAO,CAAC,aAAa,CAAC,CAAC;AAE5B,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IACxD,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,YAAY,CAAC;AAE7D,MAAM,MAAM,WAAW,GACnB,WAAW,GACX,eAAe,GACf,WAAW,GACX,cAAc,GACd,QAAQ,CAAC;AAEb,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED,MAAM,MAAM,eAAe,GAAG,CAC5B,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,cAAc,KACpB,OAAO,CAAC,aAAa,CAAC,CAAC;AAE5B,MAAM,WAAW,uBAAwB,SAAQ,eAAe;IAC9D,QAAQ,EAAE,QAAQ,CAAC;CACpB"}
@@ -0,0 +1,3 @@
1
+ import type { EngineOptions, NormalizedEngineOptions } from "./types.js";
2
+ export declare function normaliseEngineOptions(options: EngineOptions): NormalizedEngineOptions;
3
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAEzE,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,aAAa,GAAG,uBAAuB,CAyBtF"}
@@ -0,0 +1,24 @@
1
+ import { DEFAULT_MODELS, DEFAULT_TIMEOUT_MS } from "./defaults.js";
2
+ export function normaliseEngineOptions(options) {
3
+ const apiKey = options.apiKey?.trim();
4
+ if (!apiKey) {
5
+ throw new Error(`Missing apiKey for provider \"${options.provider}\"`);
6
+ }
7
+ const model = options.model?.trim() || DEFAULT_MODELS[options.provider];
8
+ if (!model) {
9
+ throw new Error(`Missing model for provider \"${options.provider}\"`);
10
+ }
11
+ const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
12
+ if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
13
+ throw new Error("timeoutMs must be a positive number");
14
+ }
15
+ const baseUrl = options.baseUrl?.trim();
16
+ return {
17
+ provider: options.provider,
18
+ apiKey,
19
+ model,
20
+ timeoutMs: Math.trunc(timeoutMs),
21
+ baseUrl: baseUrl || undefined,
22
+ };
23
+ }
24
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGnE,MAAM,UAAU,sBAAsB,CAAC,OAAsB;IAC3D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;IACtC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,iCAAiC,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,gCAAgC,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAC;IAC1D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;IAExC,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,MAAM;QACN,KAAK;QACL,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;QAChC,OAAO,EAAE,OAAO,IAAI,SAAS;KAC9B,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,31 +1,41 @@
1
1
  {
2
2
  "name": "govuk-rewrite",
3
- "version": "0.1.0",
4
- "description": "A tiny CLI that rewrites text into GOV.UK-style content",
3
+ "version": "1.0.0",
4
+ "description": "Core engine for GOV.UK rewrite tooling",
5
+ "author": "Dan Sensecall",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/sensecall/govuk-rewrite",
10
+ "directory": "packages/core"
11
+ },
12
+ "sideEffects": false,
5
13
  "type": "module",
6
- "bin": {
7
- "govuk-rewrite": "./dist/index.js"
14
+ "main": "./dist/index.js",
15
+ "types": "./dist/index.d.ts",
16
+ "exports": {
17
+ ".": {
18
+ "types": "./dist/index.d.ts",
19
+ "default": "./dist/index.js"
20
+ }
8
21
  },
22
+ "files": [
23
+ "dist"
24
+ ],
9
25
  "scripts": {
10
- "build": "tsc",
11
- "dev": "tsx src/index.ts",
26
+ "build": "tsc -p tsconfig.json",
27
+ "clean": "node --eval \"['dist','tsconfig.tsbuildinfo'].forEach(p=>require('fs').rmSync(p,{recursive:true,force:true}))\"",
28
+ "prebuild": "npm run clean",
29
+ "prepublishOnly": "npm run build",
12
30
  "test": "vitest run",
13
31
  "test:watch": "vitest"
14
32
  },
15
- "files": ["dist"],
16
- "keywords": ["govuk", "content", "rewrite", "cli"],
17
- "license": "MIT",
18
- "dependencies": {
19
- "commander": "^12.1.0",
20
- "ora": "^8.1.1"
33
+ "engines": {
34
+ "node": ">=18"
21
35
  },
22
36
  "devDependencies": {
23
37
  "@types/node": "^22.10.0",
24
- "tsx": "^4.19.2",
25
38
  "typescript": "^5.7.2",
26
39
  "vitest": "^2.1.8"
27
- },
28
- "engines": {
29
- "node": ">=18"
30
40
  }
31
41
  }
package/README.md DELETED
@@ -1,252 +0,0 @@
1
- # govuk-rewrite
2
-
3
- A tiny CLI that rewrites text into GOV.UK-style content.
4
-
5
- - **Default output:** rewritten text only (stdout)
6
- - **Optional:** short "why this is better" explanation (`--explain`)
7
- - Works with **stdin**, pipes, files, or a single string argument
8
- - Minimal, composable, script-friendly
9
-
10
- ## Install
11
-
12
- ### Global (recommended)
13
-
14
- ```bash
15
- npm install -g govuk-rewrite
16
- ```
17
-
18
- ### Run without installing
19
-
20
- ```bash
21
- npx govuk-rewrite "Text to rewrite"
22
- ```
23
-
24
- ## Usage
25
-
26
- ### Basic
27
-
28
- ```bash
29
- govuk-rewrite "Text to rewrite"
30
- ```
31
-
32
- ### With explanation
33
-
34
- ```bash
35
- govuk-rewrite "Text to rewrite" --explain
36
- ```
37
-
38
- ### With a diff of changes
39
-
40
- ```bash
41
- govuk-rewrite "Text to rewrite" --diff
42
- ```
43
-
44
- ### Audit for style issues without rewriting
45
-
46
- ```bash
47
- govuk-rewrite --check "Thank you for your kind submission"
48
- ```
49
-
50
- ### Provide context about your service or audience
51
-
52
- ```bash
53
- govuk-rewrite --context "HMRC self-assessment portal" "Please fill in the form below"
54
- ```
55
-
56
- ### Specify a content type
57
-
58
- ```bash
59
- govuk-rewrite --mode error-message "Sorry, something went wrong. Please try again."
60
- ```
61
-
62
- Valid modes: `page-body` (default) | `error-message` | `hint-text` | `notification` | `button`
63
-
64
- ### From clipboard / pipe
65
-
66
- ```bash
67
- pbpaste | govuk-rewrite --explain
68
- ```
69
-
70
- ### From a file
71
-
72
- ```bash
73
- govuk-rewrite < draft.txt
74
- govuk-rewrite --explain < draft.txt
75
- cat draft.txt | govuk-rewrite > rewritten.txt
76
- ```
77
-
78
- ### JSON output (for automation)
79
-
80
- ```bash
81
- govuk-rewrite "Text" --json
82
- govuk-rewrite --json --explain < draft.txt
83
- ```
84
-
85
- ## Output formats
86
-
87
- ### Plain (default)
88
-
89
- Prints only the rewritten text to stdout.
90
-
91
- ### `--explain`
92
-
93
- Prints the rewritten text, then a separator, then short bullet points explaining the changes.
94
-
95
- Example:
96
-
97
- ```
98
- The service will be unavailable on Friday from 6pm to 8pm.
99
-
100
- --- why this is better ---
101
- - Uses active voice and clear actions.
102
- - Removes unnecessary politeness and jargon.
103
- - Clarifies who needs to do what by when.
104
- ```
105
-
106
- ### `--diff`
107
-
108
- Prints the rewritten text, then a line-by-line diff against the original input.
109
-
110
- ### `--check`
111
-
112
- Audits the text for GOV.UK style issues without rewriting it. Lists any problems found, or reports `No issues found.`
113
-
114
- ### `--json`
115
-
116
- Returns machine-readable output:
117
-
118
- ```json
119
- {
120
- "rewrittenText": "…",
121
- "explanation": ["…", "…"],
122
- "issues": ["…"],
123
- "provider": "openai",
124
- "model": "gpt-4.1-mini"
125
- }
126
- ```
127
-
128
- ## Clipboard
129
-
130
- When running interactively (TTY), the rewritten text is automatically copied to the clipboard after a successful rewrite. Pass `--no-copy` to disable this.
131
-
132
- ## Providers, models, and configuration
133
-
134
- This tool supports multiple LLM providers via a small provider adapter layer.
135
-
136
- ### Quick setup (environment variables)
137
-
138
- Pick one provider:
139
-
140
- **OpenAI** (default)
141
-
142
- ```bash
143
- export GOVUK_REWRITE_PROVIDER=openai
144
- export OPENAI_API_KEY="your_key"
145
- export GOVUK_REWRITE_MODEL="gpt-4.1-mini"
146
- ```
147
-
148
- **Anthropic**
149
-
150
- ```bash
151
- export GOVUK_REWRITE_PROVIDER=anthropic
152
- export ANTHROPIC_API_KEY="your_key"
153
- export GOVUK_REWRITE_MODEL="claude-3-5-sonnet-latest"
154
- ```
155
-
156
- **OpenRouter**
157
-
158
- ```bash
159
- export GOVUK_REWRITE_PROVIDER=openrouter
160
- export OPENROUTER_API_KEY="your_key"
161
- export GOVUK_REWRITE_MODEL="openai/gpt-4.1-mini"
162
- ```
163
-
164
- Keys are read from standard env vars (`OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `OPENROUTER_API_KEY`) plus `GOVUK_REWRITE_*` overrides.
165
-
166
- ### Config file
167
-
168
- You can also use a config file:
169
-
170
- - **macOS/Linux:** `~/.config/govuk-rewrite/config.json`
171
- - **Windows:** `%APPDATA%\govuk-rewrite\config.json`
172
-
173
- Example:
174
-
175
- ```json
176
- {
177
- "provider": "openai",
178
- "model": "gpt-4.1-mini",
179
- "timeoutMs": 30000,
180
- "baseUrl": null
181
- }
182
- ```
183
-
184
- ### Configuration precedence
185
-
186
- CLI flags → environment variables → config file → defaults (highest to lowest).
187
-
188
- ### Default models
189
-
190
- | Provider | Default model |
191
- |-------------|------------------------------|
192
- | openai | `gpt-4.1-mini` |
193
- | anthropic | `claude-3-5-sonnet-latest` |
194
- | openrouter | `openai/gpt-4.1-mini` |
195
-
196
- ## CLI flags
197
-
198
- ```
199
- govuk-rewrite [text...]
200
-
201
- Options:
202
- --explain Include a short explanation of changes
203
- --diff Show a line diff between original and rewritten text
204
- --check Audit text for GOV.UK style issues without rewriting
205
- --json Output JSON
206
- --context <text> Service or audience context to inform the rewrite
207
- --mode <type> Content type: page-body | error-message | hint-text | notification | button
208
- --provider <name> openai | anthropic | openrouter
209
- --model <name> Model name for the chosen provider
210
- --config <path> Path to a config.json file
211
- --timeout <ms> Request timeout in milliseconds (default: 30000)
212
- --no-spinner Disable spinner (shown only on TTY by default)
213
- --no-copy Do not auto-copy result to clipboard
214
- -v, --version Show version
215
- -h, --help Show help
216
- ```
217
-
218
- ## UX details
219
-
220
- - The spinner is shown only when stdout is a TTY — it will not pollute piped output.
221
- - Errors go to stderr; rewritten content goes to stdout.
222
- - If input is empty, exits with code 2 (usage error).
223
- - Rewritten text is copied to the clipboard automatically when running interactively (pass `--no-copy` to disable).
224
-
225
- ## Exit codes
226
-
227
- | Code | Meaning |
228
- |------|------------------------------------|
229
- | 0 | Success |
230
- | 1 | Runtime or provider error |
231
- | 2 | Usage error (no input, bad flags) |
232
-
233
- ## Development
234
-
235
- ```bash
236
- git clone <repo>
237
- cd govuk-rewrite
238
- npm install
239
- npm run build
240
- npm link
241
- govuk-rewrite "Test input"
242
- ```
243
-
244
- Run tests:
245
-
246
- ```bash
247
- npm test
248
- ```
249
-
250
- ## Licence
251
-
252
- MIT
package/dist/config.d.ts DELETED
@@ -1,9 +0,0 @@
1
- import type { Config } from "./types.js";
2
- export interface CliOverrides {
3
- provider?: string;
4
- model?: string;
5
- timeout?: number;
6
- config?: string;
7
- }
8
- export declare function resolveConfig(cliOverrides?: CliOverrides): Config;
9
- //# sourceMappingURL=config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAY,MAAM,YAAY,CAAC;AAoDnD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,YAAY,GAAE,YAAiB,GAAG,MAAM,CA0BrE"}
package/dist/config.js DELETED
@@ -1,81 +0,0 @@
1
- import { readFileSync } from "node:fs";
2
- import { homedir } from "node:os";
3
- import { join } from "node:path";
4
- const DEFAULTS = {
5
- provider: "openai",
6
- model: "gpt-4.1-mini",
7
- timeoutMs: 30000,
8
- };
9
- const DEFAULT_MODELS = {
10
- openai: "gpt-4.1-mini",
11
- anthropic: "claude-3-5-sonnet-latest",
12
- openrouter: "openai/gpt-4.1-mini",
13
- };
14
- function configFilePath() {
15
- if (process.platform === "win32") {
16
- return join(process.env["APPDATA"] ?? homedir(), "govuk-rewrite", "config.json");
17
- }
18
- return join(homedir(), ".config", "govuk-rewrite", "config.json");
19
- }
20
- function loadConfigFile(customPath) {
21
- const filePath = customPath ?? configFilePath();
22
- try {
23
- const raw = readFileSync(filePath, "utf8");
24
- return JSON.parse(raw);
25
- }
26
- catch {
27
- return {};
28
- }
29
- }
30
- function loadEnvVars() {
31
- const result = {};
32
- const provider = process.env["GOVUK_REWRITE_PROVIDER"];
33
- if (provider)
34
- result.provider = provider;
35
- const model = process.env["GOVUK_REWRITE_MODEL"];
36
- if (model)
37
- result.model = model;
38
- const timeoutMs = process.env["GOVUK_REWRITE_TIMEOUT_MS"];
39
- if (timeoutMs) {
40
- const parsed = parseInt(timeoutMs, 10);
41
- if (!isNaN(parsed))
42
- result.timeoutMs = parsed;
43
- }
44
- const baseUrl = process.env["GOVUK_REWRITE_BASE_URL"];
45
- if (baseUrl)
46
- result.baseUrl = baseUrl;
47
- return result;
48
- }
49
- export function resolveConfig(cliOverrides = {}) {
50
- const fileConfig = loadConfigFile(cliOverrides.config);
51
- const envConfig = loadEnvVars();
52
- const merged = {
53
- ...DEFAULTS,
54
- ...fileConfig,
55
- ...envConfig,
56
- };
57
- if (cliOverrides.provider)
58
- merged.provider = cliOverrides.provider;
59
- if (cliOverrides.model)
60
- merged.model = cliOverrides.model;
61
- if (cliOverrides.timeout)
62
- merged.timeoutMs = cliOverrides.timeout;
63
- // If model was not explicitly set at any level, use provider-appropriate default
64
- const modelExplicitlySet = fileConfig.model ??
65
- envConfig.model ??
66
- cliOverrides.model;
67
- if (!modelExplicitlySet) {
68
- merged.model = DEFAULT_MODELS[merged.provider] ?? DEFAULTS.model;
69
- }
70
- merged.apiKey = resolveApiKey(merged.provider);
71
- return merged;
72
- }
73
- function resolveApiKey(provider) {
74
- const keyMap = {
75
- openai: "OPENAI_API_KEY",
76
- anthropic: "ANTHROPIC_API_KEY",
77
- openrouter: "OPENROUTER_API_KEY",
78
- };
79
- return process.env[keyMap[provider]];
80
- }
81
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/io.d.ts DELETED
@@ -1,10 +0,0 @@
1
- import type { OutputOptions } from "./types.js";
2
- export declare function readStdin(): Promise<string>;
3
- export declare function isStdinPiped(): boolean;
4
- /**
5
- * Write text to the system clipboard. Returns true on success, false if
6
- * no clipboard command is available (e.g. Linux without xclip).
7
- */
8
- export declare function writeClipboard(text: string): boolean;
9
- export declare function formatOutput(options: OutputOptions): string;
10
- //# sourceMappingURL=io.d.ts.map
package/dist/io.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../src/io.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAUjD;AAED,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CA8BpD;AA8CD,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAuC3D"}
package/dist/io.js DELETED
@@ -1,124 +0,0 @@
1
- import { execSync } from "node:child_process";
2
- export async function readStdin() {
3
- return new Promise((resolve, reject) => {
4
- let data = "";
5
- process.stdin.setEncoding("utf8");
6
- process.stdin.on("data", (chunk) => {
7
- data += chunk;
8
- });
9
- process.stdin.on("end", () => resolve(data.trim()));
10
- process.stdin.on("error", reject);
11
- });
12
- }
13
- export function isStdinPiped() {
14
- return !process.stdin.isTTY;
15
- }
16
- /**
17
- * Write text to the system clipboard. Returns true on success, false if
18
- * no clipboard command is available (e.g. Linux without xclip).
19
- */
20
- export function writeClipboard(text) {
21
- try {
22
- if (process.platform === "darwin") {
23
- execSync("pbcopy", { input: text, stdio: ["pipe", "ignore", "ignore"] });
24
- return true;
25
- }
26
- if (process.platform === "win32") {
27
- execSync("powershell -command Set-Clipboard -Value $input", {
28
- input: text,
29
- stdio: ["pipe", "ignore", "ignore"],
30
- });
31
- return true;
32
- }
33
- // Linux — try xclip, fall back to xsel
34
- try {
35
- execSync("xclip -selection clipboard", {
36
- input: text,
37
- stdio: ["pipe", "ignore", "ignore"],
38
- });
39
- return true;
40
- }
41
- catch {
42
- execSync("xsel --clipboard --input", {
43
- input: text,
44
- stdio: ["pipe", "ignore", "ignore"],
45
- });
46
- return true;
47
- }
48
- }
49
- catch {
50
- return false;
51
- }
52
- }
53
- /**
54
- * Compute a simple LCS-based line diff between two strings.
55
- * Returns a string with lines prefixed by ' ' (same), '-' (removed), '+' (added).
56
- */
57
- function diffLines(original, rewritten) {
58
- const a = original.split("\n");
59
- const b = rewritten.split("\n");
60
- const m = a.length;
61
- const n = b.length;
62
- // Build LCS table
63
- const lcs = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));
64
- for (let i = 1; i <= m; i++) {
65
- for (let j = 1; j <= n; j++) {
66
- lcs[i][j] =
67
- a[i - 1] === b[j - 1]
68
- ? lcs[i - 1][j - 1] + 1
69
- : Math.max(lcs[i - 1][j], lcs[i][j - 1]);
70
- }
71
- }
72
- // Backtrack
73
- const lines = [];
74
- let i = m;
75
- let j = n;
76
- while (i > 0 || j > 0) {
77
- if (i > 0 && j > 0 && a[i - 1] === b[j - 1]) {
78
- lines.unshift(` ${a[i - 1]}`);
79
- i--;
80
- j--;
81
- }
82
- else if (j > 0 && (i === 0 || lcs[i][j - 1] >= lcs[i - 1][j])) {
83
- lines.unshift(`+ ${b[j - 1]}`);
84
- j--;
85
- }
86
- else {
87
- lines.unshift(`- ${a[i - 1]}`);
88
- i--;
89
- }
90
- }
91
- return lines.join("\n");
92
- }
93
- export function formatOutput(options) {
94
- const { result, format, provider, model, originalText } = options;
95
- if (format === "json") {
96
- return JSON.stringify({
97
- rewrittenText: result.rewrittenText,
98
- explanation: result.explanation ?? [],
99
- issues: result.issues ?? [],
100
- provider,
101
- model,
102
- }, null, 2);
103
- }
104
- if (format === "check") {
105
- const issues = result.issues ?? [];
106
- if (issues.length === 0) {
107
- return "No issues found.";
108
- }
109
- return `Issues found:\n${issues.map((i) => `- ${i}`).join("\n")}`;
110
- }
111
- if (format === "diff") {
112
- const original = originalText ?? "";
113
- const diff = diffLines(original, result.rewrittenText);
114
- return `${result.rewrittenText}\n\n--- diff ---\n${diff}`;
115
- }
116
- if (format === "explain") {
117
- const bullets = (result.explanation ?? [])
118
- .map((point) => `- ${point}`)
119
- .join("\n");
120
- return `${result.rewrittenText}\n\n--- why this is better ---\n${bullets}`;
121
- }
122
- return result.rewrittenText;
123
- }
124
- //# sourceMappingURL=io.js.map
package/dist/io.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"io.js","sourceRoot":"","sources":["../src/io.ts"],"names":[],"mappings":"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"}