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/index.js ADDED
@@ -0,0 +1,129 @@
1
+ #!/usr/bin/env node
2
+ import { program } from "commander";
3
+ import { readFileSync } from "node:fs";
4
+ import { dirname, join } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ import { runOneShot } from "./oneshot.js";
7
+ import { runChat } from "./chat.js";
8
+ import { VALID_MODES } from "./constants.js";
9
+ import { ChatRuntimeError, ChatUsageError } from "./chat-session.js";
10
+ import { buildSetupNonInteractiveMessage, runSetup, SetupUsageError, supportsInteractiveSetup } from "./setup.js";
11
+ const __dirname = dirname(fileURLToPath(import.meta.url));
12
+ function getVersion() {
13
+ try {
14
+ const pkgPath = join(__dirname, "..", "package.json");
15
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
16
+ return pkg.version;
17
+ }
18
+ catch {
19
+ return "0.0.0";
20
+ }
21
+ }
22
+ program.configureOutput({ outputError: () => { } });
23
+ program.exitOverride((err) => {
24
+ if (err.code === "commander.helpDisplayed" || err.code === "commander.version") {
25
+ process.exit(0);
26
+ }
27
+ const msg = err.message.replace(/^error:\s*/i, "");
28
+ if (err.code === "commander.unknownOption") {
29
+ process.stderr.write(`Error: ${msg}\n\nRun 'govuk-rewrite --help' for a list of valid options.\n`);
30
+ }
31
+ else {
32
+ process.stderr.write(`Error: ${msg}\n\nRun 'govuk-rewrite --help' for usage information.\n`);
33
+ }
34
+ process.exit(2);
35
+ });
36
+ program
37
+ .name("govuk-rewrite")
38
+ .description("Rewrite text into GOV.UK-style content")
39
+ .version(getVersion(), "-v, --version")
40
+ .argument("[text...]", "Text to rewrite (or pipe via stdin)")
41
+ .option("--explain", "Include a short explanation of changes")
42
+ .option("--diff", "Show a line diff between original and rewritten text")
43
+ .option("--check", "Audit text for GOV.UK style issues without rewriting")
44
+ .option("--json", "Output JSON")
45
+ .option("--context <text>", "Service or audience context to inform the rewrite")
46
+ .option("--mode <type>", `Content type: ${VALID_MODES.join(" | ")} (default: page-body)`)
47
+ .option("--provider <name>", "Provider: openai | anthropic | openrouter")
48
+ .option("--model <name>", "Model name for the chosen provider")
49
+ .option("--config <path>", "Path to a config.json file")
50
+ .option("--timeout <ms>", "Request timeout in milliseconds", parseInt)
51
+ .option("--no-spinner", "Disable spinner")
52
+ .option("--no-copy", "Do not auto-copy result to clipboard")
53
+ .option("--tokens", "Show input/output token counts")
54
+ .addHelpText("after", `
55
+ Examples:
56
+ $ govuk-rewrite "Please be advised that the service will be unavailable"
57
+ $ echo "Click here to find out more" | govuk-rewrite
58
+ $ govuk-rewrite --explain "Please note that you must submit your form by Friday"
59
+ $ govuk-rewrite --mode error-message "Sorry, something went wrong. Please try again."
60
+ $ govuk-rewrite --check "Thank you for your kind submission"
61
+ $ govuk-rewrite --diff --context "HMRC self-assessment" "Please ensure you complete the form"
62
+ $ govuk-rewrite --provider anthropic "Your application has been received"
63
+ $ govuk-rewrite chat --provider openai
64
+ $ govuk-rewrite setup
65
+
66
+ Environment variables:
67
+ OPENAI_API_KEY API key for OpenAI (default provider)
68
+ ANTHROPIC_API_KEY API key for Anthropic
69
+ OPENROUTER_API_KEY API key for OpenRouter
70
+ GOVUK_REWRITE_PROVIDER Default provider (openai | anthropic | openrouter)
71
+ GOVUK_REWRITE_MODEL Default model name
72
+ GOVUK_REWRITE_TIMEOUT_MS Request timeout override in milliseconds`)
73
+ .action(async (textArgs, opts) => {
74
+ await runOneShot(textArgs, opts, () => program.helpInformation());
75
+ });
76
+ program
77
+ .command("chat")
78
+ .description("Start interactive rewrite mode")
79
+ .option("--explain", "Include a short explanation of changes")
80
+ .option("--diff", "Show a line diff between original and rewritten text")
81
+ .option("--check", "Audit text for GOV.UK style issues without rewriting")
82
+ .option("--json", "Output JSON")
83
+ .option("--context <text>", "Service or audience context to inform the rewrite")
84
+ .option("--mode <type>", `Content type: ${VALID_MODES.join(" | ")} (default: page-body)`)
85
+ .option("--provider <name>", "Provider: openai | anthropic | openrouter")
86
+ .option("--model <name>", "Model name for the chosen provider")
87
+ .option("--config <path>", "Path to a config.json file")
88
+ .option("--timeout <ms>", "Request timeout in milliseconds", parseInt)
89
+ .option("--no-spinner", "Disable spinner")
90
+ .option("--copy", "Auto-copy result to clipboard")
91
+ .option("--tokens", "Show input/output token counts")
92
+ .action(async (opts) => {
93
+ try {
94
+ await runChat(opts);
95
+ }
96
+ catch (err) {
97
+ if (err instanceof ChatUsageError || err instanceof ChatRuntimeError) {
98
+ process.stderr.write(`${err.message}\n`);
99
+ process.exit(err.exitCode);
100
+ }
101
+ throw err;
102
+ }
103
+ });
104
+ program
105
+ .command("setup")
106
+ .description("Run first-time setup wizard")
107
+ .option("--config <path>", "Path to config.json to write")
108
+ .action(async (opts) => {
109
+ if (!supportsInteractiveSetup(Boolean(process.stdin.isTTY), Boolean(process.stdout.isTTY))) {
110
+ process.stderr.write(buildSetupNonInteractiveMessage(opts.config) + "\n");
111
+ process.exit(2);
112
+ }
113
+ try {
114
+ await runSetup({ configPath: opts.config });
115
+ }
116
+ catch (err) {
117
+ if (err instanceof SetupUsageError) {
118
+ process.stderr.write(`${err.message}\n`);
119
+ process.exit(err.exitCode);
120
+ }
121
+ throw err;
122
+ }
123
+ });
124
+ program.parseAsync(process.argv).catch((err) => {
125
+ const message = err instanceof Error ? err.message : String(err);
126
+ process.stderr.write(`Error: ${message}\n`);
127
+ process.exit(1);
128
+ });
129
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/io.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ export declare function readStdin(): Promise<string>;
2
+ export declare function isStdinPiped(): boolean;
3
+ export declare function shouldUseSpinner(spinnerEnabled: boolean): boolean;
4
+ export declare function writeClipboard(text: string): boolean;
5
+ //# sourceMappingURL=io.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../src/io.ts"],"names":[],"mappings":"AAEA,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAUjD;AAED,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED,wBAAgB,gBAAgB,CAAC,cAAc,EAAE,OAAO,GAAG,OAAO,CAEjE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CA6BpD"}
package/dist/io.js ADDED
@@ -0,0 +1,51 @@
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
+ export function shouldUseSpinner(spinnerEnabled) {
17
+ return spinnerEnabled && process.stdout.isTTY === true;
18
+ }
19
+ export function writeClipboard(text) {
20
+ try {
21
+ if (process.platform === "darwin") {
22
+ execSync("pbcopy", { input: text, stdio: ["pipe", "ignore", "ignore"] });
23
+ return true;
24
+ }
25
+ if (process.platform === "win32") {
26
+ execSync("powershell -command Set-Clipboard -Value $input", {
27
+ input: text,
28
+ stdio: ["pipe", "ignore", "ignore"],
29
+ });
30
+ return true;
31
+ }
32
+ try {
33
+ execSync("xclip -selection clipboard", {
34
+ input: text,
35
+ stdio: ["pipe", "ignore", "ignore"],
36
+ });
37
+ return true;
38
+ }
39
+ catch {
40
+ execSync("xsel --clipboard --input", {
41
+ input: text,
42
+ stdio: ["pipe", "ignore", "ignore"],
43
+ });
44
+ return true;
45
+ }
46
+ }
47
+ catch {
48
+ return false;
49
+ }
50
+ }
51
+ //# sourceMappingURL=io.js.map
package/dist/io.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io.js","sourceRoot":"","sources":["../src/io.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,IAAI,IAAI,KAAK,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,cAAuB;IACtD,OAAO,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAClC,QAAQ,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;YACzE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,QAAQ,CAAC,iDAAiD,EAAE;gBAC1D,KAAK,EAAE,IAAI;gBACX,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC;aACpC,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC;YACH,QAAQ,CAAC,4BAA4B,EAAE;gBACrC,KAAK,EAAE,IAAI;gBACX,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC;aACpC,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,CAAC,0BAA0B,EAAE;gBACnC,KAAK,EAAE,IAAI;gBACX,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC;aACpC,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { resolveConfig } from "./config.js";
2
+ import type { CliOverrides, ResolvedConfig } from "./config.js";
3
+ import * as setup from "./setup.js";
4
+ export interface OneShotOptions {
5
+ explain?: boolean;
6
+ diff?: boolean;
7
+ check?: boolean;
8
+ json?: boolean;
9
+ context?: string;
10
+ mode?: string;
11
+ provider?: string;
12
+ model?: string;
13
+ config?: string;
14
+ timeout?: number;
15
+ spinner: boolean;
16
+ copy: boolean;
17
+ }
18
+ export declare function resolveInputText(textArgs: string[], stdinText: string, stdinPiped: boolean): string;
19
+ export declare function resolveConfigForOneShot(overrides: CliOverrides, setupRunner?: typeof setup.maybeRunInteractiveSetupOnMissingKey, configResolver?: typeof resolveConfig): Promise<ResolvedConfig>;
20
+ export declare function runOneShot(textArgs: string[], opts: OneShotOptions, helpInformation: () => string): Promise<void>;
21
+ //# sourceMappingURL=oneshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oneshot.d.ts","sourceRoot":"","sources":["../src/oneshot.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAKhE,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AAGpC,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAAE,EAClB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,OAAO,GAClB,MAAM,CAIR;AAED,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,YAAY,EACvB,WAAW,GAAE,OAAO,KAAK,CAAC,oCAAiF,EAC3G,cAAc,GAAE,OAAO,aAA6B,GACnD,OAAO,CAAC,cAAc,CAAC,CAEzB;AAED,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAAE,EAClB,IAAI,EAAE,cAAc,EACpB,eAAe,EAAE,MAAM,MAAM,GAC5B,OAAO,CAAC,IAAI,CAAC,CAkFf"}
@@ -0,0 +1,86 @@
1
+ import ora from "ora";
2
+ import { rewrite } from "govuk-rewrite";
3
+ import { resolveConfig } from "./config.js";
4
+ import { writeMissingApiKeyError } from "./errors.js";
5
+ import { isStdinPiped, readStdin, shouldUseSpinner, writeClipboard } from "./io.js";
6
+ import { formatOutput, selectOutputMode } from "./output.js";
7
+ import { VALID_MODES, VALID_PROVIDERS } from "./constants.js";
8
+ import * as setup from "./setup.js";
9
+ import { resolveConfigWithAutoSetup } from "./session-config.js";
10
+ export function resolveInputText(textArgs, stdinText, stdinPiped) {
11
+ if (stdinPiped)
12
+ return stdinText;
13
+ if (textArgs.length > 0)
14
+ return textArgs.join(" ");
15
+ return "";
16
+ }
17
+ export async function resolveConfigForOneShot(overrides, setupRunner = setup.maybeRunInteractiveSetupOnMissingKey, configResolver = resolveConfig) {
18
+ return resolveConfigWithAutoSetup(overrides, setupRunner, configResolver);
19
+ }
20
+ export async function runOneShot(textArgs, opts, helpInformation) {
21
+ const stdinPiped = isStdinPiped();
22
+ const stdinText = stdinPiped ? await readStdin() : "";
23
+ const inputText = resolveInputText(textArgs, stdinText, stdinPiped);
24
+ if (!inputText) {
25
+ process.stderr.write(helpInformation());
26
+ process.exit(2);
27
+ }
28
+ if (opts.mode && !VALID_MODES.includes(opts.mode)) {
29
+ process.stderr.write(`Error: invalid --mode \"${opts.mode}\". Valid values: ${VALID_MODES.join(", ")}\n`);
30
+ process.exit(2);
31
+ }
32
+ if (opts.provider && !VALID_PROVIDERS.includes(opts.provider)) {
33
+ process.stderr.write(`Error: invalid --provider \"${opts.provider}\". Valid values: ${VALID_PROVIDERS.join(", ")}\n`);
34
+ process.exit(2);
35
+ }
36
+ const config = await resolveConfigForOneShot({
37
+ provider: opts.provider,
38
+ model: opts.model,
39
+ timeout: opts.timeout,
40
+ config: opts.config,
41
+ });
42
+ if (!config.apiKey) {
43
+ writeMissingApiKeyError(config.provider);
44
+ process.exit(1);
45
+ }
46
+ const spinner = shouldUseSpinner(opts.spinner) ? ora("Rewriting…").start() : null;
47
+ try {
48
+ const result = await rewrite({
49
+ text: inputText,
50
+ explain: opts.explain ?? false,
51
+ check: opts.check ?? false,
52
+ context: opts.context,
53
+ mode: opts.mode ?? "page-body",
54
+ }, {
55
+ provider: config.provider,
56
+ apiKey: config.apiKey,
57
+ model: config.model,
58
+ baseUrl: config.baseUrl,
59
+ timeoutMs: config.timeoutMs,
60
+ });
61
+ spinner?.stop();
62
+ const mode = selectOutputMode(opts);
63
+ const output = formatOutput({
64
+ result,
65
+ mode,
66
+ provider: config.provider,
67
+ model: config.model,
68
+ originalText: inputText,
69
+ checkMode: opts.check ?? false,
70
+ });
71
+ process.stdout.write(output + "\n");
72
+ if (process.stdout.isTTY && opts.copy && !opts.check) {
73
+ const copied = writeClipboard(result.rewrittenText);
74
+ if (copied) {
75
+ process.stderr.write("(copied to clipboard)\n");
76
+ }
77
+ }
78
+ }
79
+ catch (err) {
80
+ spinner?.fail();
81
+ const message = err instanceof Error ? err.message : String(err);
82
+ process.stderr.write(`Error: ${message}\n`);
83
+ process.exit(1);
84
+ }
85
+ }
86
+ //# sourceMappingURL=oneshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oneshot.js","sourceRoot":"","sources":["../src/oneshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { Provider, RewriteResult } from "govuk-rewrite";
2
+ export type OutputMode = "plain" | "explain" | "json" | "diff" | "check";
3
+ export interface OutputFlags {
4
+ explain?: boolean;
5
+ diff?: boolean;
6
+ check?: boolean;
7
+ json?: boolean;
8
+ }
9
+ export interface FormatOutputOptions {
10
+ result: RewriteResult;
11
+ mode: OutputMode;
12
+ provider: Provider;
13
+ model: string;
14
+ originalText?: string;
15
+ checkMode?: boolean;
16
+ }
17
+ export declare function selectOutputMode(flags: OutputFlags): OutputMode;
18
+ export declare function normalizeComparableText(text: string): string;
19
+ export declare function detectNoImprovement(originalText: string | undefined, rewrittenText: string, checkMode?: boolean): boolean;
20
+ export declare function formatOutput(options: FormatOutputOptions): string;
21
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE7D,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEzE,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,UAAU,CAM/D;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,aAAa,EAAE,MAAM,EACrB,SAAS,UAAQ,GAChB,OAAO,CAGT;AAwCD,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CA+CjE"}
package/dist/output.js ADDED
@@ -0,0 +1,89 @@
1
+ export function selectOutputMode(flags) {
2
+ if (flags.json)
3
+ return "json";
4
+ if (flags.check)
5
+ return "check";
6
+ if (flags.diff)
7
+ return "diff";
8
+ if (flags.explain)
9
+ return "explain";
10
+ return "plain";
11
+ }
12
+ export function normalizeComparableText(text) {
13
+ return text.replace(/\r\n/g, "\n").trim();
14
+ }
15
+ export function detectNoImprovement(originalText, rewrittenText, checkMode = false) {
16
+ if (!originalText || checkMode)
17
+ return false;
18
+ return normalizeComparableText(originalText) === normalizeComparableText(rewrittenText);
19
+ }
20
+ function diffLines(original, rewritten) {
21
+ const a = original.split("\n");
22
+ const b = rewritten.split("\n");
23
+ const m = a.length;
24
+ const n = b.length;
25
+ const lcs = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));
26
+ for (let i = 1; i <= m; i++) {
27
+ for (let j = 1; j <= n; j++) {
28
+ lcs[i][j] =
29
+ a[i - 1] === b[j - 1]
30
+ ? lcs[i - 1][j - 1] + 1
31
+ : Math.max(lcs[i - 1][j], lcs[i][j - 1]);
32
+ }
33
+ }
34
+ const lines = [];
35
+ let i = m;
36
+ let j = n;
37
+ while (i > 0 || j > 0) {
38
+ if (i > 0 && j > 0 && a[i - 1] === b[j - 1]) {
39
+ lines.unshift(` ${a[i - 1]}`);
40
+ i--;
41
+ j--;
42
+ }
43
+ else if (j > 0 && (i === 0 || lcs[i][j - 1] >= lcs[i - 1][j])) {
44
+ lines.unshift(`+ ${b[j - 1]}`);
45
+ j--;
46
+ }
47
+ else {
48
+ lines.unshift(`- ${a[i - 1]}`);
49
+ i--;
50
+ }
51
+ }
52
+ return lines.join("\n");
53
+ }
54
+ export function formatOutput(options) {
55
+ const { result, mode, provider, model, originalText, checkMode } = options;
56
+ const noImprovement = detectNoImprovement(originalText, result.rewrittenText, checkMode ?? mode === "check");
57
+ if (mode === "json") {
58
+ return JSON.stringify({
59
+ rewrittenText: result.rewrittenText,
60
+ explanation: result.explanation ?? [],
61
+ issues: result.issues ?? [],
62
+ noImprovement,
63
+ provider,
64
+ model,
65
+ }, null, 2);
66
+ }
67
+ if (mode === "check") {
68
+ const issues = result.issues ?? [];
69
+ if (issues.length === 0) {
70
+ return "No issues found.";
71
+ }
72
+ return `Issues found:\n${issues.map((issue) => `- ${issue}`).join("\n")}`;
73
+ }
74
+ if (mode === "diff") {
75
+ const original = originalText ?? "";
76
+ const diff = diffLines(original, result.rewrittenText);
77
+ return `${result.rewrittenText}\n\n--- diff ---\n${diff}`;
78
+ }
79
+ if (mode === "explain") {
80
+ const points = [...(result.explanation ?? [])];
81
+ if (noImprovement) {
82
+ points.unshift("No improvement suggested. The text already aligns with GOV.UK style.");
83
+ }
84
+ const bullets = points.map((point) => `- ${point}`).join("\n");
85
+ return `${result.rewrittenText}\n\n--- why this is better ---\n${bullets}`;
86
+ }
87
+ return result.rewrittenText;
88
+ }
89
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { resolveConfig } from "./config.js";
2
+ import type { CliOverrides, ResolvedConfig } from "./config.js";
3
+ import * as setup from "./setup.js";
4
+ export declare function resolveConfigWithAutoSetup(overrides: CliOverrides, setupRunner?: typeof setup.maybeRunInteractiveSetupOnMissingKey, configResolver?: typeof resolveConfig, options?: {
5
+ prompt?: (question: string) => Promise<string>;
6
+ writeLine?: (line: string) => void;
7
+ }): Promise<ResolvedConfig>;
8
+ //# sourceMappingURL=session-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-config.d.ts","sourceRoot":"","sources":["../src/session-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AAEpC,wBAAsB,0BAA0B,CAC9C,SAAS,EAAE,YAAY,EACvB,WAAW,GAAE,OAAO,KAAK,CAAC,oCAAiF,EAC3G,cAAc,GAAE,OAAO,aAA6B,EACpD,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC,GACA,OAAO,CAAC,cAAc,CAAC,CAgBzB"}
@@ -0,0 +1,18 @@
1
+ import { resolveConfig } from "./config.js";
2
+ import * as setup from "./setup.js";
3
+ export async function resolveConfigWithAutoSetup(overrides, setupRunner = setup.maybeRunInteractiveSetupOnMissingKey, configResolver = resolveConfig, options) {
4
+ let config = configResolver(overrides);
5
+ if (!config.apiKey) {
6
+ const autoSetup = await setupRunner({
7
+ provider: config.provider,
8
+ configPath: overrides.config,
9
+ prompt: options?.prompt,
10
+ writeLine: options?.writeLine,
11
+ });
12
+ if (autoSetup.ran) {
13
+ config = configResolver(overrides);
14
+ }
15
+ }
16
+ return config;
17
+ }
18
+ //# sourceMappingURL=session-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-config.js","sourceRoot":"","sources":["../src/session-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AAEpC,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,SAAuB,EACvB,cAAiE,KAAK,CAAC,oCAAoC,EAC3G,iBAAuC,aAAa,EACpD,OAGC;IAED,IAAI,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAEvC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC;YAClC,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,UAAU,EAAE,SAAS,CAAC,MAAM;YAC5B,MAAM,EAAE,OAAO,EAAE,MAAM;YACvB,SAAS,EAAE,OAAO,EAAE,SAAS;SAC9B,CAAC,CAAC;QACH,IAAI,SAAS,CAAC,GAAG,EAAE,CAAC;YAClB,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { rewrite } from "govuk-rewrite";
2
+ import type { Provider } from "govuk-rewrite";
3
+ import type { ConfigFileData } from "./config.js";
4
+ export interface SetupOptions {
5
+ configPath?: string;
6
+ preferredProvider?: Provider;
7
+ stdinIsTTY?: boolean;
8
+ stdoutIsTTY?: boolean;
9
+ prompt?: (question: string) => Promise<string>;
10
+ writeLine?: (line: string) => void;
11
+ readConfig?: (customPath?: string) => ConfigFileData;
12
+ writeConfig?: (config: ConfigFileData, customPath?: string) => void;
13
+ rewriteImpl?: typeof rewrite;
14
+ }
15
+ export interface SetupResult {
16
+ ran: boolean;
17
+ apiKeySet: boolean;
18
+ provider: Provider;
19
+ envVarName: string;
20
+ apiKey?: string;
21
+ configPath: string;
22
+ }
23
+ export interface AutoSetupOptions {
24
+ provider: Provider;
25
+ configPath?: string;
26
+ stdinIsTTY?: boolean;
27
+ stdoutIsTTY?: boolean;
28
+ prompt?: (question: string) => Promise<string>;
29
+ writeLine?: (line: string) => void;
30
+ runSetupImpl?: (options?: SetupOptions) => Promise<SetupResult>;
31
+ }
32
+ export declare class SetupUsageError extends Error {
33
+ readonly exitCode = 2;
34
+ }
35
+ export declare function supportsInteractiveSetup(stdinIsTTY?: boolean, stdoutIsTTY?: boolean): boolean;
36
+ export declare function buildSetupNonInteractiveMessage(customPath?: string): string;
37
+ export declare function runSetup(options?: SetupOptions): Promise<SetupResult>;
38
+ export declare function maybeRunInteractiveSetupOnMissingKey(options: AutoSetupOptions): Promise<{
39
+ ran: boolean;
40
+ apiKeySet: boolean;
41
+ }>;
42
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AACA,OAAO,EAAsC,OAAO,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAO9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIlD,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,QAAQ,CAAC;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,KAAK,cAAc,CAAC;IACrD,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACpE,WAAW,CAAC,EAAE,OAAO,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,OAAO,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,YAAY,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,YAAY,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;CACjE;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,QAAQ,KAAK;CACvB;AAED,wBAAgB,wBAAwB,CACtC,UAAU,UAA+B,EACzC,WAAW,UAAgC,GAC1C,OAAO,CAET;AAED,wBAAgB,+BAA+B,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAU3E;AAwGD,wBAAsB,QAAQ,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CA2H/E;AAED,wBAAsB,oCAAoC,CACxD,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CAsC/C"}