@fettle/cli 4.0.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.d.ts CHANGED
@@ -4,19 +4,25 @@
4
4
  * Kept separate from `index.ts` (the bin shim) so the whole command is testable as
5
5
  * a function: nothing here reads `process` directly or calls `process.exit`.
6
6
  */
7
+ import { type PrettyOptions } from './pretty.js';
7
8
  import { type AssessOptions, type BadgePayload, type FloorGrade, type HealthReport } from '@fettle/core';
8
9
  export declare const EXIT_OK = 0;
9
10
  export declare const EXIT_BELOW_FLOOR = 1;
10
11
  export declare const EXIT_USAGE = 2;
11
12
  /** A repository or its configuration could not be read; nothing was graded. */
12
13
  export declare const EXIT_SCAN_FAILED = 3;
13
- declare const FORMATS: readonly ["json", "markdown", "badge"];
14
+ declare const FORMATS: readonly ["pretty", "json", "markdown", "badge"];
14
15
  export type Format = (typeof FORMATS)[number];
15
16
  export interface CliOptions {
16
17
  repos: string[];
17
- format: Format;
18
+ /** Absent when not given: the default depends on whether stdout is a terminal. */
19
+ format?: Format;
18
20
  failBelow?: FloorGrade;
19
21
  apiUrl?: string;
22
+ /** A bare hostname, as `gh` takes in `GH_HOST`. Lower precedence than `apiUrl`. */
23
+ host?: string;
24
+ /** Print diagnostics to stderr. */
25
+ debug: boolean;
20
26
  /** A local config file; absent means each repository supplies its own. */
21
27
  configPath?: string;
22
28
  help: boolean;
@@ -34,7 +40,7 @@ export declare const USAGE: string;
34
40
  export declare function parseCliOptions(argv: readonly string[], env?: Readonly<Record<string, string | undefined>>): CliOptions;
35
41
  /** Badge payloads keyed by repository, so multi-repo output stays valid JSON. */
36
42
  export declare function renderBadges(report: HealthReport): Record<string, BadgePayload>;
37
- export declare function render(report: HealthReport, format: Format): string;
43
+ export declare function render(report: HealthReport, format: Format, pretty: PrettyOptions): string;
38
44
  /**
39
45
  * Performs the scan.
40
46
  *
@@ -50,6 +56,10 @@ export interface RunOptions {
50
56
  stderr: (chunk: string) => void;
51
57
  scan?: Scanner;
52
58
  now?: Date;
59
+ /** Whether stdout is a terminal. Decides the default format and colour. */
60
+ isTty?: boolean;
61
+ /** Terminal width, for keeping evidence on one line. */
62
+ columns?: number;
53
63
  }
54
64
  /** Runs the command and returns its exit code. Never throws for expected failures. */
55
65
  export declare function run(options: RunOptions): Promise<number>;
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAWL,KAAK,aAAa,EAClB,KAAK,YAAY,EAEjB,KAAK,UAAU,EAEf,KAAK,YAAY,EAClB,MAAM,cAAc,CAAC;AAEtB,eAAO,MAAM,OAAO,IAAI,CAAC;AACzB,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,eAAO,MAAM,UAAU,IAAI,CAAC;AAC5B,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,QAAA,MAAM,OAAO,wCAAyC,CAAC;AACvD,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9C,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,UAAU,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,mFAAmF;AACnF,qBAAa,UAAW,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM;CAI5B;AAED,eAAO,MAAM,KAAK,QAyByD,CAAC;AAsB5E;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAM,GACrD,UAAU,CAqDZ;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAI/E;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CASnE;AAMD;;;;;;GAMG;AACH,MAAM,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;AAElG,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IACnD,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAyBD,sFAAsF;AACtF,wBAAsB,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAkE9D"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAA+B,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAWL,KAAK,aAAa,EAClB,KAAK,YAAY,EAEjB,KAAK,UAAU,EAEf,KAAK,YAAY,EAClB,MAAM,cAAc,CAAC;AAEtB,eAAO,MAAM,OAAO,IAAI,CAAC;AACzB,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,eAAO,MAAM,UAAU,IAAI,CAAC;AAC5B,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,QAAA,MAAM,OAAO,kDAAmD,CAAC;AACjE,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9C,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,kFAAkF;IAClF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,UAAU,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,KAAK,EAAE,OAAO,CAAC;IACf,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,mFAAmF;AACnF,qBAAa,UAAW,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM;CAI5B;AAED,eAAO,MAAM,KAAK,QA8ByD,CAAC;AAsB5E;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAM,GACrD,UAAU,CAyDZ;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAI/E;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM,CAW1F;AAMD;;;;;;GAMG;AACH,MAAM,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;AAElG,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IACnD,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,2EAA2E;IAC3E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAyBD,sFAAsF;AACtF,wBAAsB,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAmF9D"}
package/dist/cli.js CHANGED
@@ -6,13 +6,14 @@
6
6
  */
7
7
  import { readFile } from 'node:fs/promises';
8
8
  import { parseArgs } from 'node:util';
9
+ import { prettyOptions, renderPretty } from './pretty.js';
9
10
  import { assess, badgeFilename, buildBadgePayload, CONFIG_FILENAME, FLOOR_GRADES, meetsGradeFloor, parseConfig, renderMarkdown, TOOL_NAME, TOOL_VERSION, } from '@fettle/core';
10
11
  export const EXIT_OK = 0;
11
12
  export const EXIT_BELOW_FLOOR = 1;
12
13
  export const EXIT_USAGE = 2;
13
14
  /** A repository or its configuration could not be read; nothing was graded. */
14
15
  export const EXIT_SCAN_FAILED = 3;
15
- const FORMATS = ['json', 'markdown', 'badge'];
16
+ const FORMATS = ['pretty', 'json', 'markdown', 'badge'];
16
17
  /** A problem with how the command was invoked. Reported to stderr, exit code 2. */
17
18
  export class UsageError extends Error {
18
19
  constructor(message) {
@@ -28,11 +29,16 @@ Usage:
28
29
  Options:
29
30
  --repos <list> Comma- or newline-separated repositories. Defaults to
30
31
  $GITHUB_REPOSITORY when set.
31
- --format <format> Output format: ${FORMATS.join(' | ')} (default: json).
32
+ --format <format> Output format: ${FORMATS.join(' | ')}.
33
+ Defaults to pretty in a terminal, json when piped.
32
34
  --fail-below <grade> Exit ${EXIT_BELOW_FLOOR} if any repository grades below this
33
35
  floor: ${FLOOR_GRADES.join(' | ')}.
34
- --api-url <url> GitHub API base URL for GitHub Enterprise Server.
35
- Defaults to $GITHUB_API_URL, then https://api.github.com.
36
+ --api-url <url> Full GitHub API base URL, e.g.
37
+ https://ghe.example.com/api/v3. Defaults to $GITHUB_API_URL.
38
+ --gh-host <host> Hostname instead of a full URL, e.g. ghe.example.com.
39
+ Defaults to $GH_HOST, the variable the gh CLI uses.
40
+ --debug Print the resolved host, every API request and its timing
41
+ to stderr. Never prints the token. Also $FETTLE_DEBUG=1.
36
42
  --config <path> Local config file to apply to every repository, instead of
37
43
  reading ${CONFIG_FILENAME} from each one.
38
44
  --version Print the version and exit.
@@ -82,7 +88,9 @@ export function parseCliOptions(argv, env = {}) {
82
88
  format: { type: 'string' },
83
89
  'fail-below': { type: 'string' },
84
90
  'api-url': { type: 'string' },
91
+ 'gh-host': { type: 'string' },
85
92
  config: { type: 'string' },
93
+ debug: { type: 'boolean', default: false },
86
94
  version: { type: 'boolean', default: false },
87
95
  help: { type: 'boolean', short: 'h', default: false },
88
96
  },
@@ -104,11 +112,13 @@ export function parseCliOptions(argv, env = {}) {
104
112
  }
105
113
  return {
106
114
  repos,
107
- format: values.format === undefined ? 'json' : oneOf(values.format, FORMATS, 'format'),
115
+ format: values.format === undefined ? undefined : oneOf(values.format, FORMATS, 'format'),
108
116
  failBelow: values['fail-below'] === undefined
109
117
  ? undefined
110
118
  : oneOf(values['fail-below'], FLOOR_GRADES, 'fail-below'),
111
119
  apiUrl: values['api-url'] ?? env.GITHUB_API_URL,
120
+ host: values['gh-host'] ?? env.GH_HOST,
121
+ debug: values.debug === true || (env.FETTLE_DEBUG !== undefined && env.FETTLE_DEBUG !== '0'),
112
122
  configPath: values.config,
113
123
  help,
114
124
  version,
@@ -118,8 +128,10 @@ export function parseCliOptions(argv, env = {}) {
118
128
  export function renderBadges(report) {
119
129
  return Object.fromEntries(report.repos.map((repo) => [badgeFilename(repo.repo), buildBadgePayload(repo)]));
120
130
  }
121
- export function render(report, format) {
131
+ export function render(report, format, pretty) {
122
132
  switch (format) {
133
+ case 'pretty':
134
+ return renderPretty(report, pretty);
123
135
  case 'json':
124
136
  return JSON.stringify(report, null, 2);
125
137
  case 'markdown':
@@ -172,6 +184,16 @@ export async function run(options) {
172
184
  }
173
185
  const env = options.env ?? {};
174
186
  const warn = (text) => stderr(`${TOOL_NAME}: ${text}\n`);
187
+ // Pretty output is for a person reading it now; anything piped stays machine
188
+ // readable, so a script that never passed --format keeps working.
189
+ const isTty = options.isTty ?? false;
190
+ const format = cli.format ?? (isTty ? 'pretty' : 'json');
191
+ const pretty = prettyOptions(env, isTty, options.columns);
192
+ const debug = cli.debug
193
+ ? (message) => stderr(`${TOOL_NAME}: debug: ${message}\n`)
194
+ : undefined;
195
+ debug?.(`format ${format}${cli.format === undefined ? ' (default)' : ''}, colour ${pretty.colour}`);
196
+ debug?.(`repositories: ${cli.repos.join(', ')}`);
175
197
  let config;
176
198
  try {
177
199
  config = await readLocalConfig(cli.configPath, warn);
@@ -189,16 +211,18 @@ export async function run(options) {
189
211
  report = await (options.scan ?? assess)(cli.repos, {
190
212
  token: env.GITHUB_TOKEN,
191
213
  apiUrl: cli.apiUrl,
214
+ host: cli.host,
192
215
  config,
193
216
  now: options.now,
194
217
  onWarning: (repo, warning) => warn(`${repo}: ${warning}`),
218
+ onDebug: debug,
195
219
  });
196
220
  }
197
221
  catch (error) {
198
222
  warn(describe(error));
199
223
  return EXIT_SCAN_FAILED;
200
224
  }
201
- stdout(`${render(report, cli.format)}\n`);
225
+ stdout(`${render(report, format, pretty)}\n`);
202
226
  if (cli.failBelow === undefined)
203
227
  return EXIT_OK;
204
228
  const failures = belowFloor(report, cli.failBelow);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -5,5 +5,7 @@ process.exitCode = await run({
5
5
  env: process.env,
6
6
  stdout: (chunk) => process.stdout.write(chunk),
7
7
  stderr: (chunk) => process.stderr.write(chunk),
8
+ isTty: process.stdout.isTTY === true,
9
+ columns: process.stdout.columns,
8
10
  });
9
11
  //# 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":";AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,OAAO,CAAC,QAAQ,GAAG,MAAM,GAAG,CAAC;IAC3B,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3B,GAAG,EAAE,OAAO,CAAC,GAAG;IAChB,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;IAC9C,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;CAC/C,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,OAAO,CAAC,QAAQ,GAAG,MAAM,GAAG,CAAC;IAC3B,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3B,GAAG,EAAE,OAAO,CAAC,GAAG;IAChB,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;IAC9C,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;IAC9C,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI;IACpC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO;CAChC,CAAC,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * The human-facing terminal renderer.
3
+ *
4
+ * Deliberately CLI-only: markdown and the JSON report are contracts other things
5
+ * consume, while this exists to be read once by the person who just typed the
6
+ * command. It may change shape whenever that makes it clearer.
7
+ *
8
+ * Colour is written by hand rather than pulled in — a dozen escape codes do not
9
+ * justify a dependency in a tool that ships its own bundle.
10
+ */
11
+ import type { HealthReport } from '@fettle/core';
12
+ export interface PrettyOptions {
13
+ /** Off when piped, when NO_COLOR is set, or when the terminal says it is dumb. */
14
+ colour: boolean;
15
+ /** Used to keep evidence on one line. */
16
+ width: number;
17
+ }
18
+ /**
19
+ * Decides whether to colour.
20
+ *
21
+ * Honours the NO_COLOR and FORCE_COLOR conventions, and otherwise colours only a
22
+ * real terminal — piping into a file should not fill it with escape codes.
23
+ */
24
+ export declare function prettyOptions(env: Readonly<Record<string, string | undefined>>, isTty: boolean, columns?: number): PrettyOptions;
25
+ /** Renders a report for a person reading it in a terminal. */
26
+ export declare function renderPretty(report: HealthReport, options: PrettyOptions): string;
27
+ //# sourceMappingURL=pretty.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pretty.d.ts","sourceRoot":"","sources":["../src/pretty.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAS,YAAY,EAA0B,MAAM,cAAc,CAAC;AAiBhF,MAAM,WAAW,aAAa;IAC5B,kFAAkF;IAClF,MAAM,EAAE,OAAO,CAAC;IAChB,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,EACjD,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,MAAM,GACf,aAAa,CAQf;AA6DD,8DAA8D;AAC9D,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,CA2BjF"}
package/dist/pretty.js ADDED
@@ -0,0 +1,105 @@
1
+ /**
2
+ * The human-facing terminal renderer.
3
+ *
4
+ * Deliberately CLI-only: markdown and the JSON report are contracts other things
5
+ * consume, while this exists to be read once by the person who just typed the
6
+ * command. It may change shape whenever that makes it clearer.
7
+ *
8
+ * Colour is written by hand rather than pulled in — a dozen escape codes do not
9
+ * justify a dependency in a tool that ships its own bundle.
10
+ */
11
+ const CSI = '\u001b[';
12
+ const ANSI = {
13
+ reset: `${CSI}0m`,
14
+ bold: `${CSI}1m`,
15
+ dim: `${CSI}2m`,
16
+ red: `${CSI}31m`,
17
+ green: `${CSI}32m`,
18
+ yellow: `${CSI}33m`,
19
+ blue: `${CSI}34m`,
20
+ grey: `${CSI}90m`,
21
+ };
22
+ /**
23
+ * Decides whether to colour.
24
+ *
25
+ * Honours the NO_COLOR and FORCE_COLOR conventions, and otherwise colours only a
26
+ * real terminal — piping into a file should not fill it with escape codes.
27
+ */
28
+ export function prettyOptions(env, isTty, columns) {
29
+ const forced = env.FORCE_COLOR !== undefined && env.FORCE_COLOR !== '0';
30
+ const disabled = env.NO_COLOR !== undefined || env.TERM === 'dumb';
31
+ return {
32
+ colour: forced || (isTty && !disabled),
33
+ width: Math.max(60, Math.min(columns ?? 100, 120)),
34
+ };
35
+ }
36
+ function paint(options, colour, text) {
37
+ return options.colour ? `${ANSI[colour]}${text}${ANSI.reset}` : text;
38
+ }
39
+ const GRADE_COLOUR = {
40
+ A: 'green',
41
+ B: 'green',
42
+ C: 'yellow',
43
+ D: 'yellow',
44
+ F: 'red',
45
+ 'N/A': 'grey',
46
+ };
47
+ /** A glyph per status, chosen to stay legible without colour. */
48
+ const STATUS_MARK = {
49
+ pass: { mark: 'ok ', colour: 'green' },
50
+ fail: { mark: 'FAIL', colour: 'red' },
51
+ na: { mark: 'n/a ', colour: 'grey' },
52
+ disabled: { mark: 'off ', colour: 'grey' },
53
+ };
54
+ function truncate(text, width) {
55
+ return text.length <= width ? text : `${text.slice(0, Math.max(0, width - 1))}…`;
56
+ }
57
+ /** Truncates *and* pads, so a column is exactly its width whatever it holds. */
58
+ function column(text, width) {
59
+ return truncate(text, width).padEnd(width);
60
+ }
61
+ /** Columns consumed by everything on a rule line except the evidence. */
62
+ const RULE_ID_WIDTH = 19;
63
+ const RULE_GUTTER = 2 + 4 + 1 + RULE_ID_WIDTH + 1 + 3 + 1 + 3 + 2;
64
+ function renderRule(rule, options) {
65
+ const { mark, colour } = STATUS_MARK[rule.status];
66
+ const score = rule.score === null ? ' -' : String(rule.score).padStart(3);
67
+ const weight = `x${rule.weight}`.padEnd(3);
68
+ const evidence = truncate(rule.evidence, Math.max(20, options.width - RULE_GUTTER));
69
+ return (` ${paint(options, colour, mark)} ${column(rule.id, RULE_ID_WIDTH)} ${score} ` +
70
+ `${paint(options, 'grey', weight)} ${paint(options, 'grey', evidence)}`);
71
+ }
72
+ function renderRepo(repo, options) {
73
+ const gradeText = options.colour ? `${ANSI.bold}${repo.grade}${ANSI.reset}` : repo.grade;
74
+ const grade = paint(options, GRADE_COLOUR[repo.grade], gradeText);
75
+ const score = repo.score === null ? '' : ` ${repo.score.toFixed(1)}`;
76
+ const nameWidth = Math.max(20, options.width - 12);
77
+ return [
78
+ '',
79
+ `${paint(options, 'blue', column(repo.repo, nameWidth))} ${grade}${score}`,
80
+ ...repo.rules.map((rule) => renderRule(rule, options)),
81
+ ];
82
+ }
83
+ /** Renders a report for a person reading it in a terminal. */
84
+ export function renderPretty(report, options) {
85
+ const { repoCount, averageScore } = report.fleet;
86
+ const summary = repoCount === 1
87
+ ? '1 repository'
88
+ : `${repoCount} repositories` +
89
+ (averageScore === null ? '' : `, average ${averageScore.toFixed(1)}`);
90
+ const lines = [paint(options, 'dim', `fettle - ${summary}`)];
91
+ for (const repo of report.repos)
92
+ lines.push(...renderRepo(repo, options));
93
+ const blocked = report.repos.flatMap((repo) => repo.rules.filter((rule) => rule.status === 'na').map((rule) => ({ repo: repo.repo, rule })));
94
+ if (blocked.length > 0) {
95
+ lines.push('', paint(options, 'yellow', 'Checks that could not run'));
96
+ for (const { repo, rule } of blocked) {
97
+ const detail = `${repo} ${rule.id} - ${rule.evidence}`;
98
+ lines.push(paint(options, 'grey', ` ${truncate(detail, options.width - 2)}`));
99
+ }
100
+ }
101
+ if (repoCount === 0)
102
+ lines.push('', paint(options, 'grey', ' no repositories scanned'));
103
+ return lines.join('\n');
104
+ }
105
+ //# sourceMappingURL=pretty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pretty.js","sourceRoot":"","sources":["../src/pretty.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fettle/cli",
3
- "version": "4.0.0",
3
+ "version": "4.1.0",
4
4
  "description": "Command-line interface for grading repository maintenance health.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/rumankazi/fettle#readme",
@@ -37,7 +37,7 @@
37
37
  "node": ">=22"
38
38
  },
39
39
  "dependencies": {
40
- "@fettle/core": "4.0.0"
40
+ "@fettle/core": "4.1.0"
41
41
  },
42
42
  "scripts": {
43
43
  "build": "tsc -p tsconfig.build.json",