@ploaness/cli 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.
Files changed (127) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +13 -0
  3. package/dist/bin.d.ts +3 -0
  4. package/dist/bin.d.ts.map +1 -0
  5. package/dist/bin.js +161 -0
  6. package/dist/bin.js.map +1 -0
  7. package/dist/checks/assets.d.ts +30 -0
  8. package/dist/checks/assets.d.ts.map +1 -0
  9. package/dist/checks/assets.js +169 -0
  10. package/dist/checks/assets.js.map +1 -0
  11. package/dist/checks/containers.d.ts +9 -0
  12. package/dist/checks/containers.d.ts.map +1 -0
  13. package/dist/checks/containers.js +194 -0
  14. package/dist/checks/containers.js.map +1 -0
  15. package/dist/checks/conventions.d.ts +8 -0
  16. package/dist/checks/conventions.d.ts.map +1 -0
  17. package/dist/checks/conventions.js +77 -0
  18. package/dist/checks/conventions.js.map +1 -0
  19. package/dist/checks/dependencies.d.ts +11 -0
  20. package/dist/checks/dependencies.d.ts.map +1 -0
  21. package/dist/checks/dependencies.js +389 -0
  22. package/dist/checks/dependencies.js.map +1 -0
  23. package/dist/checks/editorconfig.d.ts +5 -0
  24. package/dist/checks/editorconfig.d.ts.map +1 -0
  25. package/dist/checks/editorconfig.js +38 -0
  26. package/dist/checks/editorconfig.js.map +1 -0
  27. package/dist/checks/generated.d.ts +10 -0
  28. package/dist/checks/generated.d.ts.map +1 -0
  29. package/dist/checks/generated.js +65 -0
  30. package/dist/checks/generated.js.map +1 -0
  31. package/dist/checks/history.d.ts +19 -0
  32. package/dist/checks/history.d.ts.map +1 -0
  33. package/dist/checks/history.js +71 -0
  34. package/dist/checks/history.js.map +1 -0
  35. package/dist/checks/images.d.ts +14 -0
  36. package/dist/checks/images.d.ts.map +1 -0
  37. package/dist/checks/images.js +100 -0
  38. package/dist/checks/images.js.map +1 -0
  39. package/dist/checks/install.d.ts +5 -0
  40. package/dist/checks/install.d.ts.map +1 -0
  41. package/dist/checks/install.js +21 -0
  42. package/dist/checks/install.js.map +1 -0
  43. package/dist/checks/integrity.d.ts +11 -0
  44. package/dist/checks/integrity.d.ts.map +1 -0
  45. package/dist/checks/integrity.js +66 -0
  46. package/dist/checks/integrity.js.map +1 -0
  47. package/dist/checks/payload.d.ts +7 -0
  48. package/dist/checks/payload.d.ts.map +1 -0
  49. package/dist/checks/payload.js +81 -0
  50. package/dist/checks/payload.js.map +1 -0
  51. package/dist/checks/preflight.d.ts +5 -0
  52. package/dist/checks/preflight.d.ts.map +1 -0
  53. package/dist/checks/preflight.js +48 -0
  54. package/dist/checks/preflight.js.map +1 -0
  55. package/dist/checks/references.d.ts +18 -0
  56. package/dist/checks/references.d.ts.map +1 -0
  57. package/dist/checks/references.js +100 -0
  58. package/dist/checks/references.js.map +1 -0
  59. package/dist/checks/suppressions.d.ts +5 -0
  60. package/dist/checks/suppressions.d.ts.map +1 -0
  61. package/dist/checks/suppressions.js +50 -0
  62. package/dist/checks/suppressions.js.map +1 -0
  63. package/dist/checks/tailwind.d.ts +5 -0
  64. package/dist/checks/tailwind.d.ts.map +1 -0
  65. package/dist/checks/tailwind.js +29 -0
  66. package/dist/checks/tailwind.js.map +1 -0
  67. package/dist/checks/tests.d.ts +8 -0
  68. package/dist/checks/tests.d.ts.map +1 -0
  69. package/dist/checks/tests.js +123 -0
  70. package/dist/checks/tests.js.map +1 -0
  71. package/dist/checks/toolchain.d.ts +25 -0
  72. package/dist/checks/toolchain.d.ts.map +1 -0
  73. package/dist/checks/toolchain.js +165 -0
  74. package/dist/checks/toolchain.js.map +1 -0
  75. package/dist/checks/tree.d.ts +6 -0
  76. package/dist/checks/tree.d.ts.map +1 -0
  77. package/dist/checks/tree.js +52 -0
  78. package/dist/checks/tree.js.map +1 -0
  79. package/dist/checks/wiring.d.ts +5 -0
  80. package/dist/checks/wiring.d.ts.map +1 -0
  81. package/dist/checks/wiring.js +163 -0
  82. package/dist/checks/wiring.js.map +1 -0
  83. package/dist/commands/commit-message.d.ts +11 -0
  84. package/dist/commands/commit-message.d.ts.map +1 -0
  85. package/dist/commands/commit-message.js +57 -0
  86. package/dist/commands/commit-message.js.map +1 -0
  87. package/dist/commands/format.d.ts +4 -0
  88. package/dist/commands/format.d.ts.map +1 -0
  89. package/dist/commands/format.js +35 -0
  90. package/dist/commands/format.js.map +1 -0
  91. package/dist/commands/hooks.d.ts +9 -0
  92. package/dist/commands/hooks.d.ts.map +1 -0
  93. package/dist/commands/hooks.js +57 -0
  94. package/dist/commands/hooks.js.map +1 -0
  95. package/dist/commands/init.d.ts +4 -0
  96. package/dist/commands/init.d.ts.map +1 -0
  97. package/dist/commands/init.js +92 -0
  98. package/dist/commands/init.js.map +1 -0
  99. package/dist/commands/sync.d.ts +4 -0
  100. package/dist/commands/sync.d.ts.map +1 -0
  101. package/dist/commands/sync.js +30 -0
  102. package/dist/commands/sync.js.map +1 -0
  103. package/dist/commands/verify.d.ts +18 -0
  104. package/dist/commands/verify.d.ts.map +1 -0
  105. package/dist/commands/verify.js +96 -0
  106. package/dist/commands/verify.js.map +1 -0
  107. package/dist/context.d.ts +157 -0
  108. package/dist/context.d.ts.map +1 -0
  109. package/dist/context.js +345 -0
  110. package/dist/context.js.map +1 -0
  111. package/dist/exec.d.ts +80 -0
  112. package/dist/exec.d.ts.map +1 -0
  113. package/dist/exec.js +117 -0
  114. package/dist/exec.js.map +1 -0
  115. package/dist/gates.d.ts +61 -0
  116. package/dist/gates.d.ts.map +1 -0
  117. package/dist/gates.js +298 -0
  118. package/dist/gates.js.map +1 -0
  119. package/dist/index.d.ts +10 -0
  120. package/dist/index.d.ts.map +1 -0
  121. package/dist/index.js +12 -0
  122. package/dist/index.js.map +1 -0
  123. package/dist/report.d.ts +40 -0
  124. package/dist/report.d.ts.map +1 -0
  125. package/dist/report.js +224 -0
  126. package/dist/report.js.map +1 -0
  127. package/package.json +60 -0
@@ -0,0 +1,40 @@
1
+ import type { GateResult } from './exec.js';
2
+ import type { Gate } from './gates.js';
3
+ /** One completed gate, what it found, and how long it took. */
4
+ export interface GateOutcome {
5
+ /** The member this gate was asked about, or undefined for a repository-scope gate. */
6
+ readonly member?: string | undefined;
7
+ readonly gate: Gate;
8
+ readonly result: GateResult;
9
+ /** Wall-clock milliseconds, so a long run shows where the time actually went. */
10
+ readonly durationMs: number;
11
+ }
12
+ /** Print the run header naming the mode and how many gates it covers. */
13
+ export declare const reportHeader: (isExtended: boolean, gateCount: number) => void;
14
+ /** Show that a gate has started, so a slow gate is visibly running rather than apparently hung. */
15
+ export declare const beginGate: (gate: Gate, width: number) => void;
16
+ /**
17
+ * Print what the gate's tool actually wrote, whole and unfiltered.
18
+ *
19
+ * Whole, because a truncated audit log is worse than none: a reader asking this question is checking a
20
+ * verdict, and evidence cut off in the middle cannot settle anything. It is opt-in and one gate at a
21
+ * time, which is what makes the volume affordable.
22
+ */
23
+ export declare const reportOutput: (outcome: GateOutcome) => void;
24
+ export declare const reportGate: (outcome: GateOutcome, width: number) => void;
25
+ /**
26
+ * Say why the run stopped, and how many gates it did not reach.
27
+ *
28
+ * Silence here would read as the run having finished, which is the one thing it did not do: the count
29
+ * is what tells a reader that the gates below the failing one were not merely quiet.
30
+ * @param gate the gate that failed.
31
+ * @param skipped how many gates were not reached.
32
+ * @param isPrecondition whether this gate stops a run in either mode, which is a different thing to
33
+ * say than that the run was enforcing.
34
+ */
35
+ export declare const reportHalt: (gate: Gate, skipped: number, isPrecondition: boolean) => void;
36
+ /** Print a closing aside, such as the reminder that one gate is not a verdict. */
37
+ export declare const reportNote: (text: string) => void;
38
+ /** Print the closing verdict and return the process exit code. */
39
+ export declare const reportVerdict: (outcomes: readonly GateOutcome[], isExtended: boolean, isEnforced: boolean, totalDurationMs?: number) => number;
40
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAKtC,+DAA+D;AAC/D,MAAM,WAAW,WAAW;IAC1B,sFAAsF;IACtF,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACpC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;IACnB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;IAC3B,iFAAiF;IACjF,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAC5B;AAmHD,yEAAyE;AACzE,eAAO,MAAM,YAAY,GAAI,YAAY,OAAO,EAAE,WAAW,MAAM,KAAG,IAKrE,CAAA;AAED,mGAAmG;AACnG,eAAO,MAAM,SAAS,GAAI,MAAM,IAAI,EAAE,OAAO,MAAM,KAAG,IAKrD,CAAA;AAuBD;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,GAAI,SAAS,WAAW,KAAG,IAKnD,CAAA;AASD,eAAO,MAAM,UAAU,GAAI,SAAS,WAAW,EAAE,OAAO,MAAM,KAAG,IAYhE,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,UAAU,GAAI,MAAM,IAAI,EAAE,SAAS,MAAM,EAAE,gBAAgB,OAAO,KAAG,IAQjF,CAAA;AAED,kFAAkF;AAClF,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,KAAG,IAGzC,CAAA;AAKD,kEAAkE;AAClE,eAAO,MAAM,aAAa,GACxB,UAAU,SAAS,WAAW,EAAE,EAChC,YAAY,OAAO,EACnB,YAAY,OAAO,EACnB,kBAAiB,MAGhB,KACA,MAgCF,CAAA"}
package/dist/report.js ADDED
@@ -0,0 +1,224 @@
1
+ // Run-log presentation. A verification prints one line per gate as it completes, then any failure
2
+ // findings or passing update report, so a long run is readable while it happens and actionable when it ends.
3
+ //
4
+ // Every line goes to stdout, failures included. The run log is this command's product, and a caller that
5
+ // redirects stdout alone must not receive a list of passing gates while each failure leaves on the other
6
+ // stream. The exit code, not the stream, carries the verdict.
7
+ //
8
+ // There are two formats, chosen by whether stdout is a terminal. A terminal gets colour, a symbol per
9
+ // verdict, and a placeholder line that is overwritten when the gate finishes, so a slow gate cannot be
10
+ // mistaken for a hung one. Everything else - a pipe, a file, CI, an agent reading the log - gets plain
11
+ // ASCII whose "[PASS] <id>" token stays greppable and carries no escape sequence to strip.
12
+ const PASS = 'PASS';
13
+ const FAIL = 'FAIL';
14
+ // The control sequence introducer, named rather than written as a bare number at its use.
15
+ const ESCAPE = 0x1b;
16
+ const CSI = `${String.fromCodePoint(ESCAPE)}[`;
17
+ const RESET = `${CSI}0m`;
18
+ const BOLD = `${CSI}1m`;
19
+ const DIM = `${CSI}2m`;
20
+ const GREEN = `${CSI}32m`;
21
+ const RED = `${CSI}31m`;
22
+ const CLEAR_LINE = `\r${CSI}2K`;
23
+ // Referenced by code point for the same reason the typography ban is: a source file that spells the
24
+ // character out invites a tool to normalise it into something the terminal renders differently.
25
+ const HEAVY_CHECK_MARK = 0x27_13;
26
+ const BALLOT_X_MARK = 0x27_17;
27
+ const CHECK_MARK = String.fromCodePoint(HEAVY_CHECK_MARK);
28
+ const BALLOT_X = String.fromCodePoint(BALLOT_X_MARK);
29
+ const SYMBOLS = {
30
+ [PASS]: CHECK_MARK,
31
+ [FAIL]: BALLOT_X,
32
+ };
33
+ const COLOURS = {
34
+ [PASS]: GREEN,
35
+ [FAIL]: RED,
36
+ };
37
+ // NO_COLOR and FORCE_COLOR are the conventions every other tool in the pipeline already honours, so a
38
+ // project that has set one does not have to set a ploaness-specific variable as well.
39
+ const hasRichOutput = () => {
40
+ if (process.env['NO_COLOR'] !== undefined) {
41
+ return false;
42
+ }
43
+ if (process.env['FORCE_COLOR'] !== undefined) {
44
+ return true;
45
+ }
46
+ return process.env['TERM'] !== 'dumb' && process.stdout.isTTY;
47
+ };
48
+ const IS_RICH = hasRichOutput();
49
+ // Overwriting a line in place needs a real terminal, which is a narrower condition than colour: a caller
50
+ // that sets FORCE_COLOR while piping wants the colours, and would otherwise collect a stray erase
51
+ // sequence at the head of every line.
52
+ const IS_INTERACTIVE = IS_RICH && process.stdout.isTTY;
53
+ const write = (text) => {
54
+ process.stdout.write(text);
55
+ };
56
+ const line = (text) => {
57
+ write(`${text}\n`);
58
+ };
59
+ const paint = (text, colour) => IS_RICH ? `${colour}${text}${RESET}` : text;
60
+ const verdictOf = (result) => (result.ok ? PASS : FAIL);
61
+ const MILLISECONDS_PER_SECOND = 1000;
62
+ const elapsed = (milliseconds) => `${(milliseconds / MILLISECONDS_PER_SECOND).toFixed(1)}s`;
63
+ const SECONDS_PER_MINUTE = 60;
64
+ // A gate line keeps the seconds form: the values there are small and the shared unit is what makes the
65
+ // column comparable at a glance. A whole run routinely passes a minute, where the same form stops being
66
+ // readable - `205.4s` is a number to divide rather than a duration to recognise.
67
+ const duration = (milliseconds) => {
68
+ const seconds = Math.round(milliseconds / MILLISECONDS_PER_SECOND);
69
+ if (seconds < SECONDS_PER_MINUTE) {
70
+ return elapsed(milliseconds);
71
+ }
72
+ const minutes = Math.floor(seconds / SECONDS_PER_MINUTE);
73
+ return `${String(minutes)}m ${String(seconds - minutes * SECONDS_PER_MINUTE)}s`;
74
+ };
75
+ /** How many of the slowest gates the closing summary names. */
76
+ const SLOWEST_LISTED = 3;
77
+ // The total says how long the run took; this says where it went, which is the part a reader can act on.
78
+ // Listed only when there are more gates than the list would name, because "the slowest 3 of 3" ranks a
79
+ // run rather than summarising it.
80
+ const slowest = (outcomes) => {
81
+ if (outcomes.length <= SLOWEST_LISTED) {
82
+ return undefined;
83
+ }
84
+ const ranked = [...outcomes].sort((left, right) => right.durationMs - left.durationMs);
85
+ const named = ranked
86
+ .slice(0, SLOWEST_LISTED)
87
+ .map((outcome) => `${outcome.gate.id} ${elapsed(outcome.durationMs)}`)
88
+ .join(', ');
89
+ return ` slowest: ${named}`;
90
+ };
91
+ // Below this width the right-hand column would collide with the summary, so the duration simply follows
92
+ // the text instead of being pushed to the margin.
93
+ const MINIMUM_COLUMNS = 80;
94
+ const COLUMN_GAP = 2;
95
+ /** Lay out a line with its duration at the right margin, falling back to a plain gap when narrow. */
96
+ const spread = (left, right, decoratedLeft) => {
97
+ const columns = process.stdout.columns;
98
+ const gap = columns - left.length - right.length;
99
+ if (!IS_RICH || columns < MINIMUM_COLUMNS || gap < COLUMN_GAP) {
100
+ return `${decoratedLeft}${' '.repeat(COLUMN_GAP)}${paint(right, DIM)}`;
101
+ }
102
+ return `${decoratedLeft}${' '.repeat(gap)}${paint(right, DIM)}`;
103
+ };
104
+ /** Print the run header naming the mode and how many gates it covers. */
105
+ export const reportHeader = (isExtended, gateCount) => {
106
+ const mode = isExtended ? 'extended verification' : 'default verification';
107
+ line('');
108
+ line(` ${paint('ploaness', BOLD)} ${paint(mode, DIM)} ${String(gateCount)} gates`);
109
+ line('');
110
+ };
111
+ /** Show that a gate has started, so a slow gate is visibly running rather than apparently hung. */
112
+ export const beginGate = (gate, width) => {
113
+ if (!IS_INTERACTIVE) {
114
+ return;
115
+ }
116
+ write(` ${paint('.', DIM)} ${gate.id.padEnd(width)} ${paint('running', DIM)}`);
117
+ };
118
+ // A gate prints its findings or update report where it ran, not at the end of the run. Extended
119
+ // verification is thirty-eight gates and several minutes; deferring the detail puts it minutes away from
120
+ // the line that announced it. The closing verdict still names every failed gate.
121
+ const reportGateFindings = (outcome) => {
122
+ const verdict = verdictOf(outcome.result);
123
+ if (outcome.result.findings.length === 0) {
124
+ return;
125
+ }
126
+ const heading = outcome.result.ok
127
+ ? `${outcome.gate.id} - update report`
128
+ : `${verdict} ${outcome.gate.id} - ${outcome.gate.title}`;
129
+ const colour = outcome.result.ok ? DIM : (COLOURS[verdict] ?? RESET);
130
+ line('');
131
+ line(` ${paint(heading, colour)}`);
132
+ line(` ${paint('-'.repeat(heading.length), DIM)}`);
133
+ for (const finding of outcome.result.findings) {
134
+ line(` ${finding}`);
135
+ }
136
+ line('');
137
+ };
138
+ /**
139
+ * Print what the gate's tool actually wrote, whole and unfiltered.
140
+ *
141
+ * Whole, because a truncated audit log is worse than none: a reader asking this question is checking a
142
+ * verdict, and evidence cut off in the middle cannot settle anything. It is opt-in and one gate at a
143
+ * time, which is what makes the volume affordable.
144
+ */
145
+ export const reportOutput = (outcome) => {
146
+ const output = outcome.result.output;
147
+ line('');
148
+ line(paint(` --- ${outcome.gate.id} output ---`, DIM));
149
+ line(output ?? ' (the tool produced no output)');
150
+ };
151
+ /** Print the one-line verdict for a gate that has just finished, and its findings when it did not pass. */
152
+ // The member a gate was asked about, shown only when the answer could have been about another one. A
153
+ // repository with a single member has nothing to disambiguate, so its log is the one that always
154
+ // shipped - and the `[PASS] <id>` token the integration suite greps for is never touched either way.
155
+ const memberSuffix = (outcome) => outcome.member === undefined || outcome.member === '.' ? '' : ` (${outcome.member})`;
156
+ export const reportGate = (outcome, width) => {
157
+ const verdict = verdictOf(outcome.result);
158
+ const identifier = outcome.gate.id.padEnd(width);
159
+ const marker = IS_RICH ? (SYMBOLS[verdict] ?? '?') : `[${verdict}]`;
160
+ const summary = `${outcome.result.summary}${memberSuffix(outcome)}`;
161
+ const plain = ` ${marker} ${identifier} ${summary}`;
162
+ const decorated = ` ${paint(marker, COLOURS[verdict] ?? RESET)} ${identifier} ${summary}`;
163
+ if (IS_INTERACTIVE) {
164
+ write(CLEAR_LINE);
165
+ }
166
+ line(spread(plain, elapsed(outcome.durationMs), decorated));
167
+ reportGateFindings(outcome);
168
+ };
169
+ /**
170
+ * Say why the run stopped, and how many gates it did not reach.
171
+ *
172
+ * Silence here would read as the run having finished, which is the one thing it did not do: the count
173
+ * is what tells a reader that the gates below the failing one were not merely quiet.
174
+ * @param gate the gate that failed.
175
+ * @param skipped how many gates were not reached.
176
+ * @param isPrecondition whether this gate stops a run in either mode, which is a different thing to
177
+ * say than that the run was enforcing.
178
+ */
179
+ export const reportHalt = (gate, skipped, isPrecondition) => {
180
+ const headline = `halted at ${gate.id}: ${String(skipped)} gate(s) not run`;
181
+ const aside = isPrecondition
182
+ ? `nothing below a failing ${gate.id} can be judged, so even a report-only run stops here`
183
+ : 'repair the finding above and rerun; nothing below a failing gate has been verified';
184
+ line('');
185
+ line(` ${paint(headline, COLOURS[FAIL] ?? RESET)}`);
186
+ line(` ${paint(aside, DIM)}`);
187
+ };
188
+ /** Print a closing aside, such as the reminder that one gate is not a verdict. */
189
+ export const reportNote = (text) => {
190
+ line('');
191
+ line(` ${paint(text, DIM)}`);
192
+ };
193
+ const tally = (outcomes, verdict) => outcomes.filter((outcome) => verdictOf(outcome.result) === verdict).length;
194
+ /** Print the closing verdict and return the process exit code. */
195
+ export const reportVerdict = (outcomes, isExtended, isEnforced, totalDurationMs = outcomes.reduce((sum, outcome) => sum + outcome.durationMs, 0)) => {
196
+ const failures = outcomes.filter((outcome) => !outcome.result.ok);
197
+ const counts = [
198
+ `${String(tally(outcomes, PASS))} passed`,
199
+ `${String(failures.length)} failed`,
200
+ `${String(outcomes.length)} gates`,
201
+ ].join(' ');
202
+ const mode = isExtended ? 'Extended verification' : 'Default verification';
203
+ const summary = `${counts} total: ${duration(totalDurationMs)}`;
204
+ line('');
205
+ line(` ${paint(summary, DIM)}`);
206
+ const ranking = slowest(outcomes);
207
+ if (ranking !== undefined) {
208
+ line(paint(ranking, DIM));
209
+ }
210
+ if (failures.length === 0) {
211
+ const passedText = `${mode} passed.`;
212
+ line(` ${paint(passedText, GREEN)}`);
213
+ return 0;
214
+ }
215
+ const names = failures.map((outcome) => outcome.gate.id).join(', ');
216
+ const failedText = `${mode} failed: ${names}.`;
217
+ line(` ${paint(failedText, RED)}`);
218
+ if (!isEnforced) {
219
+ line(` ${paint('Report-only mode is active, so the exit code is 0. This is not a pass.', DIM)}`);
220
+ return 0;
221
+ }
222
+ return 1;
223
+ };
224
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "@ploaness/cli",
3
+ "version": "1.0.0",
4
+ "description": "The executable half of ploaness: the verification gates and the commands that run them.",
5
+ "license": "MIT",
6
+ "author": "Herman Ciechanowiec <herman@ciechanowiec.eu>",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/ciechanowiec/ploaness.git",
10
+ "directory": "packages/cli"
11
+ },
12
+ "homepage": "https://github.com/ciechanowiec/ploaness#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/ciechanowiec/ploaness/issues"
15
+ },
16
+ "type": "module",
17
+ "main": "./dist/index.js",
18
+ "types": "./dist/index.d.ts",
19
+ "exports": {
20
+ ".": {
21
+ "types": "./dist/index.d.ts",
22
+ "import": "./dist/index.js"
23
+ },
24
+ "./bin": "./dist/bin.js",
25
+ "./package.json": "./package.json"
26
+ },
27
+ "bin": {
28
+ "ploaness": "./dist/bin.js"
29
+ },
30
+ "files": [
31
+ "dist"
32
+ ],
33
+ "dependencies": {
34
+ "@biomejs/biome": "2.5.11",
35
+ "@ploaness/assets": "1.0.0",
36
+ "@ploaness/config": "1.0.0",
37
+ "@ploaness/governance": "1.0.0",
38
+ "@vitest/coverage-v8": "4.1.11",
39
+ "dependency-cruiser": "18.2.0",
40
+ "eslint": "10.9.1",
41
+ "knip": "6.32.3",
42
+ "stylelint": "17.14.1",
43
+ "tsx": "4.23.12",
44
+ "type-coverage": "2.30.1",
45
+ "typescript": "6.0.3",
46
+ "vitest": "4.1.11"
47
+ },
48
+ "engines": {
49
+ "node": ">=26"
50
+ },
51
+ "publishConfig": {
52
+ "access": "public"
53
+ },
54
+ "devDependencies": {
55
+ "@types/node": "26.4.0"
56
+ },
57
+ "scripts": {
58
+ "build": "tsc --build"
59
+ }
60
+ }