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.
- package/dist/defaults.d.ts +4 -0
- package/dist/defaults.d.ts.map +1 -0
- package/dist/defaults.js +7 -0
- package/dist/defaults.js.map +1 -0
- package/dist/engine.d.ts +6 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +30 -0
- package/dist/engine.js.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -206
- package/dist/index.js.map +1 -1
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +9 -2
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +6 -0
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/openrouter.d.ts.map +1 -1
- package/dist/providers/openrouter.js +6 -0
- package/dist/providers/openrouter.js.map +1 -1
- package/dist/types.d.ts +11 -10
- package/dist/types.d.ts.map +1 -1
- package/dist/validation.d.ts +3 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +24 -0
- package/dist/validation.js.map +1 -0
- package/package.json +26 -16
- package/README.md +0 -252
- package/dist/config.d.ts +0 -9
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -81
- package/dist/config.js.map +0 -1
- package/dist/io.d.ts +0 -10
- package/dist/io.d.ts.map +0 -1
- package/dist/io.js +0 -124
- package/dist/io.js.map +0 -1
|
@@ -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"}
|
package/dist/defaults.js
ADDED
|
@@ -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"}
|
package/dist/engine.d.ts
ADDED
|
@@ -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
|
-
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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":"
|
|
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;
|
|
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:
|
|
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
|
-
|
|
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":"AAAA,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AAGtB,MAAM,eAAe,GAAG;IACtB,IAAI,EAAE,gBAAgB;IACtB,WAAW,EAAE,uEAAuE;IACpF,YAAY,EAAE;QACZ,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,aAAa,EAAE;gBACb,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,sEAAsE;aACzE;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,WAAW,EACT,uFAAuF;aAC1F;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,WAAW,EACT,8EAA8E;aACjF;SACF;QACD,QAAQ,EAAE,CAAC,eAAe,EAAE,aAAa,EAAE,QAAQ,CAAC;KACrD;CACF,CAAC;
|
|
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;
|
|
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"}
|
package/dist/providers/openai.js
CHANGED
|
@@ -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":"AAAA,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,WAAW,GACZ,MAAM,cAAc,CAAC;
|
|
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;
|
|
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;
|
|
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
|
|
13
|
+
export interface EngineOptions {
|
|
9
14
|
provider: Provider;
|
|
10
|
-
|
|
11
|
-
|
|
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
|
|
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
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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;
|
|
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 @@
|
|
|
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": "
|
|
4
|
-
"description": "
|
|
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
|
-
"
|
|
7
|
-
|
|
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
|
-
"
|
|
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
|
-
"
|
|
16
|
-
|
|
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
|
package/dist/config.d.ts.map
DELETED
|
@@ -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
|
package/dist/config.js.map
DELETED
|
@@ -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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"}
|