@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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Herman Ciechanowiec
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,13 @@
1
+ # @ploaness/cli
2
+
3
+ The executable half of ploaness: the verification gates and the commands that run them.
4
+
5
+ This package is published as part of `ploaness` and is not meant to be depended on directly. Install `ploaness`, which re-exports what a project needs.
6
+
7
+ ## Documentation
8
+
9
+ <https://github.com/ciechanowiec/ploaness#readme>
10
+
11
+ ## License
12
+
13
+ MIT. See the LICENSE file in this package.
package/dist/bin.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":""}
package/dist/bin.js ADDED
@@ -0,0 +1,161 @@
1
+ #!/usr/bin/env node
2
+ import { commitMessage } from './commands/commit-message.js';
3
+ import { format } from './commands/format.js';
4
+ import { init } from './commands/init.js';
5
+ import { sync } from './commands/sync.js';
6
+ import { verify, verifyOne } from './commands/verify.js';
7
+ // The `ploaness` command. Argument handling is deliberately small: ploaness offers commands, not
8
+ // options that change what is checked. Two flags exist and neither reaches a rule: --enforce=false
9
+ // changes whether findings are fatal, and --verbose changes what is shown. There is no flag that skips
10
+ // a gate.
11
+ import { createRepository as createRepo, memberAt, } from './context.js';
12
+ import { ALL_GATES, gateById } from './gates.js';
13
+ // argv begins with the node binary and the script path; the command follows them.
14
+ const ARGV_COMMAND_OFFSET = 2;
15
+ // Wide enough for the longest gate identifier, so the listing stays aligned.
16
+ const GATE_ID_COLUMN = 22;
17
+ const USAGE = `ploaness, the quality harness for Payload CMS projects
18
+
19
+ ploaness verify [--extended] [--enforce=false] run Default or Extended verification
20
+ ploaness format apply formatting and safe fixes
21
+ ploaness sync materialise the managed files
22
+ ploaness init scaffold the consumer wiring
23
+ ploaness gate <id> [--verbose] run one gate, for debugging
24
+ ploaness gates list the gates in run order
25
+ ploaness commit-message <file|--range R|--all> check one message, a range, or the history
26
+
27
+ Report-only mode (--enforce=false) prints findings and exits 0. It is not a pass.
28
+ Verbose mode (--verbose) prints what the gate's tool wrote, passing or failing.`;
29
+ const HELP_COMMANDS = new Set(['--help', '-h', 'help']);
30
+ const GATE_SCOPES = new Set(['repository', 'package', 'payload']);
31
+ // Wide enough for the longest scope name, so the titles beside them line up.
32
+ const GATE_SCOPE_COLUMN = 10;
33
+ // `--scope` and `--ids` exist so a script can ask which gates judge a repository's shape rather than
34
+ // keeping its own copy of the answer. ploaness's own verification runs such a list, in an order it
35
+ // chooses deliberately; what it could not do before was notice a NEW repository-scope gate that nobody
36
+ // had added to it - which is the failure that let `arch` sit unrun while a cycle grew behind it.
37
+ const SCOPE_OPTION = '--scope=';
38
+ const IDS_OPTION = '--ids';
39
+ const listGates = (rest) => {
40
+ const requested = rest
41
+ .find((argument) => argument.startsWith(SCOPE_OPTION))
42
+ ?.slice(SCOPE_OPTION.length);
43
+ const selected = ALL_GATES.filter((gate) => requested === undefined || gate.scope === requested);
44
+ for (const gate of selected) {
45
+ if (rest.includes(IDS_OPTION)) {
46
+ console.info(gate.id);
47
+ }
48
+ else {
49
+ const mode = gate.isExtended ? 'extended' : 'default ';
50
+ console.info(`${mode} ${gate.id.padEnd(GATE_ID_COLUMN)} ${gate.scope.padEnd(GATE_SCOPE_COLUMN)} ${gate.title}`);
51
+ }
52
+ }
53
+ return 0;
54
+ };
55
+ // A single gate names no member, so a member-scope gate is asked about the package the engineer is
56
+ // standing in. That is the only reading that stays useful in a workspace and is exactly today's
57
+ // behaviour in a single-package repository, where there is one member and it is the root.
58
+ const runOneGate = async (repo, id, isVerbose) => {
59
+ const gate = id === undefined ? undefined : gateById(id);
60
+ if (gate === undefined) {
61
+ console.error(`unknown gate "${id ?? ''}". Run \`ploaness gates\` to list them.`);
62
+ return 1;
63
+ }
64
+ const member = gate.scope === 'repository' ? undefined : memberAt(repo, process.cwd());
65
+ return await verifyOne(repo, { gate, member }, isVerbose);
66
+ };
67
+ const COMMANDS = {
68
+ verify: async (repo, rest) => await verify(repo, rest.includes('--extended')),
69
+ format: (repo) => format(repo),
70
+ sync: (repo) => sync(repo),
71
+ init: (repo) => init(repo),
72
+ gates: (_repository, rest) => listGates(rest),
73
+ gate: async (repo, rest) => await runOneGate(repo, rest[0], rest.includes(VERBOSE_OPTION)),
74
+ 'commit-message': (repo, rest) => commitMessage(repo, rest[0], rest[1]),
75
+ };
76
+ // Each command owns its grammar. A global allowlist rejected the documented `commit-message --all` and
77
+ // `--range` modes while accepting `--extended` on commands that do not use it; checking the whole shape
78
+ // also stops extra positional arguments and single-dash options from disappearing silently.
79
+ const VERIFY_OPTIONS = new Set(['--extended', '--enforce=false']);
80
+ const VERBOSE_OPTION = '--verbose';
81
+ const GATE_OPTIONS = new Set([VERBOSE_OPTION]);
82
+ const RANGE_ARGUMENT_COUNT = 2;
83
+ const hasDistinctMembersOf = (values, allowed) => values.every((value) => allowed.has(value)) &&
84
+ new Set(values).size === values.length;
85
+ const isCommitMessageArguments = (rest) => {
86
+ const [mode, value] = rest;
87
+ if (mode === '--all') {
88
+ return rest.length === 1;
89
+ }
90
+ if (mode === '--range') {
91
+ return rest.length === RANGE_ARGUMENT_COUNT && value !== undefined && !value.startsWith('-');
92
+ }
93
+ return rest.length === 1 && mode !== undefined && !mode.startsWith('-');
94
+ };
95
+ const acceptsArguments = {
96
+ verify: (rest) => hasDistinctMembersOf(rest, VERIFY_OPTIONS),
97
+ format: (rest) => rest.length === 0,
98
+ sync: (rest) => rest.length === 0,
99
+ init: (rest) => rest.length === 0,
100
+ // A scope must name one ploaness knows, so a typo lists nothing rather than silently listing
101
+ // everything - which for a script asking "have I missed a gate" would answer yes when it should not.
102
+ gates: (rest) => rest.every((argument) => argument === IDS_OPTION ||
103
+ (argument.startsWith(SCOPE_OPTION) && GATE_SCOPES.has(argument.slice(SCOPE_OPTION.length)))),
104
+ gate: (rest) => {
105
+ const [id, ...options] = rest;
106
+ return id !== undefined && !id.startsWith('-') && hasDistinctMembersOf(options, GATE_OPTIONS);
107
+ },
108
+ 'commit-message': isCommitMessageArguments,
109
+ };
110
+ const main = async () => {
111
+ const argv = process.argv.slice(ARGV_COMMAND_OFFSET);
112
+ const [command, ...rest] = argv;
113
+ if (command === undefined || HELP_COMMANDS.has(command)) {
114
+ console.info(USAGE);
115
+ return 0;
116
+ }
117
+ // `Object.hasOwn`, not a bare index. The table is an object literal, so `ploaness toString` resolved
118
+ // to `Object.prototype.toString` and ran it as though it were a command.
119
+ if (!Object.hasOwn(COMMANDS, command)) {
120
+ console.error(`unknown command "${command}"\n\n${USAGE}`);
121
+ return 1;
122
+ }
123
+ const accepts = acceptsArguments[command];
124
+ const isAccepted = accepts?.(rest) ?? false;
125
+ if (!isAccepted) {
126
+ console.error(`invalid arguments for "${command}"\n\n${USAGE}`);
127
+ return 1;
128
+ }
129
+ const runCommand = COMMANDS[command];
130
+ if (runCommand === undefined) {
131
+ console.error(`unknown command "${command}"\n\n${USAGE}`);
132
+ return 1;
133
+ }
134
+ const isEnforce = !rest.includes('--enforce=false');
135
+ return await runCommand(createRepo(process.cwd(), isEnforce), rest);
136
+ };
137
+ // A command outside a gate has nothing above it to catch a throw, so an unreadable package.json used to
138
+ // reach the user as a stack trace. The message is the finding; the trace is noise around it.
139
+ const reportFailure = (error) => {
140
+ console.error(error instanceof Error ? error.message : String(error));
141
+ return 1;
142
+ };
143
+ // Setting the exit code is how Node reports a verdict while still flushing stdout. `process.exit()`
144
+ // would truncate the report the gates just wrote.
145
+ //
146
+ // Neither half of this carries a suppression any more, and the pair is why the carve-out exists. The
147
+ // assignment tripped `functional/immutable-data` while `unicorn/no-process-exit` banned the other
148
+ // spelling, so a Node entry point had no legal way to report a non-zero verdict; the shipped config now
149
+ // states `process.exitCode` as an accessor that rule is not aimed at. `.catch()` tripped
150
+ // `unicorn/prefer-await`, and awaiting inside a `try` is what that rule asks for - it needs no `let`,
151
+ // so `functional/no-let` has nothing to say, and `functional/no-try-statements` is off everywhere.
152
+ const runToVerdict = async () => {
153
+ try {
154
+ return await main();
155
+ }
156
+ catch (error) {
157
+ return reportFailure(error);
158
+ }
159
+ };
160
+ process.exitCode = await runToVerdict();
161
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AACxD,iGAAiG;AACjG,mGAAmG;AACnG,uGAAuG;AACvG,UAAU;AACV,OAAO,EACL,gBAAgB,IAAI,UAAU,EAE9B,QAAQ,GAET,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,SAAS,EAAa,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE3D,kFAAkF;AAClF,MAAM,mBAAmB,GAAW,CAAC,CAAA;AACrC,6EAA6E;AAC7E,MAAM,cAAc,GAAW,EAAE,CAAA;AAEjC,MAAM,KAAK,GAAW;;;;;;;;;;;gFAW0D,CAAA;AAEhF,MAAM,aAAa,GAAwB,IAAI,GAAG,CAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;AAEpF,MAAM,WAAW,GAAwB,IAAI,GAAG,CAAS,CAAC,YAAY,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAA;AAE9F,6EAA6E;AAC7E,MAAM,iBAAiB,GAAW,EAAE,CAAA;AAEpC,qGAAqG;AACrG,mGAAmG;AACnG,uGAAuG;AACvG,iGAAiG;AACjG,MAAM,YAAY,GAAW,UAAU,CAAA;AACvC,MAAM,UAAU,GAAW,OAAO,CAAA;AAElC,MAAM,SAAS,GAAG,CAAC,IAAuB,EAAU,EAAE;IACpD,MAAM,SAAS,GAAuB,IAAI;SACvC,IAAI,CAAC,CAAC,QAAgB,EAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QACvE,EAAE,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;IAC9B,MAAM,QAAQ,GAAoB,SAAS,CAAC,MAAM,CAChD,CAAC,IAAU,EAAW,EAAE,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,CAC7E,CAAA;IACD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAW,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAA;YAC9D,OAAO,CAAC,IAAI,CACV,GAAG,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CACnG,CAAA;QACH,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC,CAAA;AAED,mGAAmG;AACnG,gGAAgG;AAChG,0FAA0F;AAC1F,MAAM,UAAU,GAAG,KAAK,EACtB,IAAU,EACV,EAAsB,EACtB,SAAkB,EACD,EAAE;IACnB,MAAM,IAAI,GAAqB,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC1E,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,IAAI,EAAE,yCAAyC,CAAC,CAAA;QACjF,OAAO,CAAC,CAAA;IACV,CAAC;IACD,MAAM,MAAM,GACV,IAAI,CAAC,KAAK,KAAK,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IACzE,OAAO,MAAM,SAAS,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,CAAA;AAC3D,CAAC,CAAA;AAMD,MAAM,QAAQ,GAA4C;IACxD,MAAM,EAAE,KAAK,EAAE,IAAU,EAAE,IAAuB,EAAmB,EAAE,CACrE,MAAM,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACjD,MAAM,EAAE,CAAC,IAAU,EAAU,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;IAC5C,IAAI,EAAE,CAAC,IAAU,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;IACxC,IAAI,EAAE,CAAC,IAAU,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;IACxC,KAAK,EAAE,CAAC,WAAiB,EAAE,IAAuB,EAAU,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC;IAC9E,IAAI,EAAE,KAAK,EAAE,IAAU,EAAE,IAAuB,EAAmB,EAAE,CACnE,MAAM,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAChE,gBAAgB,EAAE,CAAC,IAAU,EAAE,IAAuB,EAAU,EAAE,CAChE,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;CACxC,CAAA;AAED,uGAAuG;AACvG,wGAAwG;AACxG,4FAA4F;AAC5F,MAAM,cAAc,GAAwB,IAAI,GAAG,CAAS,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC,CAAA;AAC9F,MAAM,cAAc,GAAW,WAAW,CAAA;AAC1C,MAAM,YAAY,GAAwB,IAAI,GAAG,CAAS,CAAC,cAAc,CAAC,CAAC,CAAA;AAC3E,MAAM,oBAAoB,GAAW,CAAC,CAAA;AAEtC,MAAM,oBAAoB,GAAG,CAAC,MAAyB,EAAE,OAA4B,EAAW,EAAE,CAChG,MAAM,CAAC,KAAK,CAAC,CAAC,KAAa,EAAW,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC5D,IAAI,GAAG,CAAS,MAAM,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,CAAA;AAEhD,MAAM,wBAAwB,GAAG,CAAC,IAAuB,EAAW,EAAE;IACpE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,IAAI,CAAA;IAC1B,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAA;IAC1B,CAAC;IACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,MAAM,KAAK,oBAAoB,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;IAC9F,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;AACzE,CAAC,CAAA;AAED,MAAM,gBAAgB,GAAmE;IACvF,MAAM,EAAE,CAAC,IAAuB,EAAW,EAAE,CAAC,oBAAoB,CAAC,IAAI,EAAE,cAAc,CAAC;IACxF,MAAM,EAAE,CAAC,IAAuB,EAAW,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;IAC/D,IAAI,EAAE,CAAC,IAAuB,EAAW,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;IAC7D,IAAI,EAAE,CAAC,IAAuB,EAAW,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;IAC7D,6FAA6F;IAC7F,qGAAqG;IACrG,KAAK,EAAE,CAAC,IAAuB,EAAW,EAAE,CAC1C,IAAI,CAAC,KAAK,CACR,CAAC,QAAgB,EAAW,EAAE,CAC5B,QAAQ,KAAK,UAAU;QACvB,CAAC,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAC9F;IACH,IAAI,EAAE,CAAC,IAAuB,EAAW,EAAE;QACzC,MAAM,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,IAAI,CAAA;QAC7B,OAAO,EAAE,KAAK,SAAS,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,oBAAoB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;IAC/F,CAAC;IACD,gBAAgB,EAAE,wBAAwB;CAC3C,CAAA;AAED,MAAM,IAAI,GAAG,KAAK,IAAqB,EAAE;IACvC,MAAM,IAAI,GAAsB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAA;IACvE,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;IAC/B,IAAI,OAAO,KAAK,SAAS,IAAI,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACnB,OAAO,CAAC,CAAA;IACV,CAAC;IACD,qGAAqG;IACrG,yEAAyE;IACzE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,QAAQ,KAAK,EAAE,CAAC,CAAA;QACzD,OAAO,CAAC,CAAA;IACV,CAAC;IACD,MAAM,OAAO,GAAuD,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAC7F,MAAM,UAAU,GAAY,OAAO,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,CAAA;IACpD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,0BAA0B,OAAO,QAAQ,KAAK,EAAE,CAAC,CAAA;QAC/D,OAAO,CAAC,CAAA;IACV,CAAC;IACD,MAAM,UAAU,GAA8B,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC/D,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,QAAQ,KAAK,EAAE,CAAC,CAAA;QACzD,OAAO,CAAC,CAAA;IACV,CAAC;IACD,MAAM,SAAS,GAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAA;IAC5D,OAAO,MAAM,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,CAAA;AACrE,CAAC,CAAA;AAED,wGAAwG;AACxG,6FAA6F;AAC7F,MAAM,aAAa,GAAG,CAAC,KAAc,EAAU,EAAE;IAC/C,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IACrE,OAAO,CAAC,CAAA;AACV,CAAC,CAAA;AAED,oGAAoG;AACpG,kDAAkD;AAClD,EAAE;AACF,qGAAqG;AACrG,kGAAkG;AAClG,wGAAwG;AACxG,yFAAyF;AACzF,sGAAsG;AACtG,mGAAmG;AACnG,MAAM,YAAY,GAAG,KAAK,IAAqB,EAAE;IAC/C,IAAI,CAAC;QACH,OAAO,MAAM,IAAI,EAAE,CAAA;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,aAAa,CAAC,KAAK,CAAC,CAAA;IAC7B,CAAC;AACH,CAAC,CAAA;AAED,OAAO,CAAC,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAA"}
@@ -0,0 +1,30 @@
1
+ import { type Context, type Repository } from '../context.js';
2
+ import { type GateResult } from '../exec.js';
3
+ /** Verify the working tree matches the managed-file catalogue, at the root and in every member. */
4
+ export declare const assets: (repository: Repository) => GateResult;
5
+ /**
6
+ * The paths ploaness owns in this working tree, minus any the project has taken over.
7
+ *
8
+ * A gate that measures the project's own code asks for this, because a file the project cannot edit is
9
+ * not the project's to answer for. The managed accessibility sweep carries a scoped lint exemption its
10
+ * crawl needs, and counting that against a consumer's suppression budget would spend a fifth of a small
11
+ * project's allowance on a decision the project did not make and cannot undo.
12
+ * @param context the resolved project environment.
13
+ * @returns every managed path ploaness materialises, as repository-relative paths.
14
+ */
15
+ export declare const managedPaths: (context: Context) => ReadonlySet<string>;
16
+ /** One change `ploaness sync` made to the working tree. */
17
+ export interface SyncChange {
18
+ readonly path: string;
19
+ readonly action: 'wrote' | 'deleted' | 'spliced' | 'refused';
20
+ }
21
+ /**
22
+ * Materialise the managed files into the working tree. This is the only command that writes them: a
23
+ * PINNED file is rewritten so drift is repaired, a SEED file is written only when absent so the
24
+ * project's own edits survive, a FORBIDDEN path is removed, and a SECTION file has only its marked
25
+ * block replaced so the project's own text around it is carried through untouched.
26
+ */
27
+ export declare const syncAssets: (repository: Repository) => readonly SyncChange[];
28
+ /** Write a managed file only when the path is absent, used by `ploaness init`. */
29
+ export declare const hasSeededFile: (root: string, assetPath: string, body: string) => boolean;
30
+ //# sourceMappingURL=assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../src/checks/assets.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAE,KAAK,OAAO,EAAe,KAAK,UAAU,EAAoB,MAAM,eAAe,CAAA;AAC5F,OAAO,EAAU,KAAK,UAAU,EAAU,MAAM,YAAY,CAAA;AAiG5D,mGAAmG;AACnG,eAAO,MAAM,MAAM,GAAI,YAAY,UAAU,KAAG,UAyB/C,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,YAAY,GAAI,SAAS,OAAO,KAAG,WAAW,CAAC,MAAM,CAUjE,CAAA;AAED,2DAA2D;AAC3D,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAA;CAC7D;AA6CD;;;;;GAKG;AACH,eAAO,MAAM,UAAU,GAAI,YAAY,UAAU,KAAG,SAAS,UAAU,EAetE,CAAA;AAED,kFAAkF;AAClF,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,EAAE,WAAW,MAAM,EAAE,MAAM,MAAM,KAAG,OAQ7E,CAAA"}
@@ -0,0 +1,169 @@
1
+ // The managed-file gate and the `ploaness sync` implementation. Both read the same catalogue, so the
2
+ // gate can never disagree with the command that repairs it.
3
+ import { cpSync, existsSync, mkdirSync, readFileSync, rmSync, statSync, writeFileSync, } from 'node:fs';
4
+ import path from 'node:path';
5
+ import { applyManagedSection, findAssetViolations, hasRuntime, memberAssets, memberKindOf, parseManifest, ROOT_MEMBER_PATH, repositoryAssets, syncAction, } from '@ploaness/governance';
6
+ import { shippedDirectory } from '../context.js';
7
+ import { failed, passed } from '../exec.js';
8
+ const assetsRoot = () => shippedDirectory('@ploaness/assets');
9
+ const readManifestText = () => readFileSync(path.join(assetsRoot(), 'manifest.tsv'), 'utf8');
10
+ const catalogue = () => parseManifest(readManifestText());
11
+ // Shipped bodies carry a `.asset` suffix because npm rewrites or strips certain dotfiles when it packs a
12
+ // tarball: a shipped `.npmrc` is dropped outright and a shipped `.gitignore` is renamed. Suffixing every
13
+ // body keeps the catalogue honest about what a consumer will actually receive.
14
+ const bodyPath = (assetPath) => path.join(assetsRoot(), 'files', `${assetPath}.asset`);
15
+ const shippedBody = (assetPath) => {
16
+ const source = bodyPath(assetPath);
17
+ return existsSync(source) ? readFileSync(source, 'utf8') : undefined;
18
+ };
19
+ // A PINNED or SEED entry with no shipped body would otherwise be reported as drift in the consumer's
20
+ // tree, blaming the project for a ploaness packaging mistake. FORBIDDEN and REFERENCE entries have no
21
+ // body by definition: ploaness writes neither, it only judges what it finds.
22
+ const BODILESS = new Set(['FORBIDDEN', 'REFERENCE']);
23
+ const packagingDefects = (assets) => assets
24
+ .filter((asset) => !(BODILESS.has(asset.disposition) || existsSync(bodyPath(asset.path))))
25
+ .map((asset) => `${asset.path}: the catalogue lists it but ploaness ships no body for it`);
26
+ const unmanagedPaths = (context) => context.settings.unmanagedAssets.map((entry) => entry.path);
27
+ // What each half of the repository is judged against. A member holds the sweeps for the server it runs
28
+ // and the forbidden paths that shadow ploaness wherever they sit; everything a tool reads from the tree
29
+ // root is judged once, at the root.
30
+ const hostOf = (member) => ({
31
+ hasRuntime: hasRuntime(memberKindOf(member.packageJson)),
32
+ isPayload: member.isPayload,
33
+ });
34
+ const sitesOf = (repository, all) => {
35
+ const isSolo = repository.members.length <= 1;
36
+ const atRoot = repositoryAssets(all);
37
+ // A member sitting AT the repository root shares its directory, so a path that applies to both - any
38
+ // forbidden one - would be judged twice and reported twice for a single file. The repository site has
39
+ // already spoken for those.
40
+ const spokenFor = new Set(atRoot.map((asset) => asset.path));
41
+ const memberSite = (member) => {
42
+ const applicable = memberAssets(all, hostOf(member));
43
+ return {
44
+ root: member.root,
45
+ label: isSolo || member.path === ROOT_MEMBER_PATH ? '' : `${member.path}/`,
46
+ assets: member.root === repository.root
47
+ ? applicable.filter((asset) => !spokenFor.has(asset.path))
48
+ : applicable,
49
+ unmanaged: unmanagedPaths(member),
50
+ };
51
+ };
52
+ return [
53
+ {
54
+ root: repository.root,
55
+ label: '',
56
+ assets: atRoot,
57
+ unmanaged: unmanagedPaths(repository),
58
+ },
59
+ ...repository.members.map((member) => memberSite(member)),
60
+ ];
61
+ };
62
+ const stateOf = (root) => (assetPath) => {
63
+ const target = path.join(root, assetPath);
64
+ const isExists = existsSync(target);
65
+ // A FORBIDDEN entry may name a directory, so only read a regular file.
66
+ const actual = isExists && statSync(target).isFile() ? readFileSync(target, 'utf8') : undefined;
67
+ return { isPresent: isExists, actual, expected: shippedBody(assetPath) };
68
+ };
69
+ /** Verify the working tree matches the managed-file catalogue, at the root and in every member. */
70
+ export const assets = (repository) => {
71
+ const parsed = catalogue();
72
+ if (parsed.problems.length > 0) {
73
+ return failed('the ploaness asset manifest is malformed', parsed.problems);
74
+ }
75
+ const defects = packagingDefects(parsed.assets);
76
+ if (defects.length > 0) {
77
+ return failed('the ploaness asset catalogue is incomplete', [
78
+ ...defects,
79
+ 'this is a ploaness packaging defect; report it',
80
+ ]);
81
+ }
82
+ const sites = sitesOf(repository, parsed.assets);
83
+ const findings = sites.flatMap((site) => findAssetViolations(site.assets, site.unmanaged, stateOf(site.root)).map((violation) => `${site.label}${violation.path}: ${violation.reason}`));
84
+ const checked = sites.reduce((total, site) => total + site.assets.length, 0);
85
+ return findings.length > 0
86
+ ? failed(`${String(findings.length)} managed-file defect(s)`, findings)
87
+ : passed(`${String(checked)} managed path(s) match the catalogue`);
88
+ };
89
+ /**
90
+ * The paths ploaness owns in this working tree, minus any the project has taken over.
91
+ *
92
+ * A gate that measures the project's own code asks for this, because a file the project cannot edit is
93
+ * not the project's to answer for. The managed accessibility sweep carries a scoped lint exemption its
94
+ * crawl needs, and counting that against a consumer's suppression budget would spend a fifth of a small
95
+ * project's allowance on a decision the project did not make and cannot undo.
96
+ * @param context the resolved project environment.
97
+ * @returns every managed path ploaness materialises, as repository-relative paths.
98
+ */
99
+ export const managedPaths = (context) => {
100
+ const owned = new Set(unmanagedPaths(context));
101
+ return new Set(catalogue()
102
+ .assets.filter((asset) => asset.disposition !== 'FORBIDDEN' && !owned.has(asset.path))
103
+ .map((asset) => asset.path));
104
+ };
105
+ const spliceSection = (assetPath, target, source) => {
106
+ const current = existsSync(target) ? readFileSync(target, 'utf8') : '';
107
+ const spliced = applyManagedSection(current, readFileSync(source, 'utf8').trim());
108
+ // Ambiguous markers are the one case sync will not touch: every guess it could make either duplicates
109
+ // the block or swallows text the project owns, and both are worse than stopping.
110
+ if (spliced === undefined) {
111
+ return { path: assetPath, action: 'refused' };
112
+ }
113
+ if (spliced === current) {
114
+ return undefined;
115
+ }
116
+ mkdirSync(path.dirname(target), { recursive: true });
117
+ writeFileSync(target, spliced);
118
+ return { path: assetPath, action: 'spliced' };
119
+ };
120
+ /** Apply one catalogue entry to the working tree, reporting the change it made. */
121
+ const syncOne = (root, asset) => {
122
+ const target = path.join(root, asset.path);
123
+ const action = syncAction(asset, existsSync(target));
124
+ if (action === 'delete') {
125
+ rmSync(target, { recursive: true, force: true });
126
+ return { path: asset.path, action: 'deleted' };
127
+ }
128
+ const source = bodyPath(asset.path);
129
+ if (action === 'skip' || !existsSync(source)) {
130
+ return undefined;
131
+ }
132
+ if (action === 'splice') {
133
+ return spliceSection(asset.path, target, source);
134
+ }
135
+ mkdirSync(path.dirname(target), { recursive: true });
136
+ cpSync(source, target);
137
+ return { path: asset.path, action: 'wrote' };
138
+ };
139
+ /**
140
+ * Materialise the managed files into the working tree. This is the only command that writes them: a
141
+ * PINNED file is rewritten so drift is repaired, a SEED file is written only when absent so the
142
+ * project's own edits survive, a FORBIDDEN path is removed, and a SECTION file has only its marked
143
+ * block replaced so the project's own text around it is carried through untouched.
144
+ */
145
+ export const syncAssets = (repository) => {
146
+ const sites = sitesOf(repository, catalogue().assets);
147
+ return sites.flatMap((site) => {
148
+ const owned = new Set(site.unmanaged);
149
+ return site.assets
150
+ .filter((asset) => !owned.has(asset.path))
151
+ .map((asset) => syncOne(site.root, asset))
152
+ .filter((change) => change !== undefined)
153
+ .map((change) => ({
154
+ action: change.action,
155
+ path: `${site.label}${change.path}`,
156
+ }));
157
+ });
158
+ };
159
+ /** Write a managed file only when the path is absent, used by `ploaness init`. */
160
+ export const hasSeededFile = (root, assetPath, body) => {
161
+ const target = path.join(root, assetPath);
162
+ if (existsSync(target)) {
163
+ return false;
164
+ }
165
+ mkdirSync(path.dirname(target), { recursive: true });
166
+ writeFileSync(target, body);
167
+ return true;
168
+ };
169
+ //# sourceMappingURL=assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.js","sourceRoot":"","sources":["../../src/checks/assets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type Context } from '../context.js';
2
+ import { type GateResult } from '../exec.js';
3
+ /** Scan the commit history for committed secrets. */
4
+ export declare const secrets: (context: Context) => GateResult;
5
+ /** Lint every Dockerfile and validate every compose project. */
6
+ export declare const containers: (context: Context) => GateResult;
7
+ /** Lint the GitHub Actions workflows. */
8
+ export declare const actions: (context: Context) => GateResult;
9
+ //# sourceMappingURL=containers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"containers.d.ts","sourceRoot":"","sources":["../../src/checks/containers.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,KAAK,OAAO,EAAgB,MAAM,eAAe,CAAA;AAC1D,OAAO,EAIL,KAAK,UAAU,EAIhB,MAAM,YAAY,CAAA;AA4FnB,qDAAqD;AACrD,eAAO,MAAM,OAAO,GAAI,SAAS,OAAO,KAAG,UAiBvC,CAAA;AAqGJ,gEAAgE;AAChE,eAAO,MAAM,UAAU,GAAI,SAAS,OAAO,KAAG,UAkC7C,CAAA;AAED,yCAAyC;AACzC,eAAO,MAAM,OAAO,GAAI,SAAS,OAAO,KAAG,UAqB1C,CAAA"}