@ploaness/governance 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 (199) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +13 -0
  3. package/dist/access-boundary.d.ts +41 -0
  4. package/dist/access-boundary.d.ts.map +1 -0
  5. package/dist/access-boundary.js +26 -0
  6. package/dist/access-boundary.js.map +1 -0
  7. package/dist/agent-references.d.ts +12 -0
  8. package/dist/agent-references.d.ts.map +1 -0
  9. package/dist/agent-references.js +53 -0
  10. package/dist/agent-references.js.map +1 -0
  11. package/dist/architecture-layers.d.ts +11 -0
  12. package/dist/architecture-layers.d.ts.map +1 -0
  13. package/dist/architecture-layers.js +47 -0
  14. package/dist/architecture-layers.js.map +1 -0
  15. package/dist/asset-policy.d.ts +138 -0
  16. package/dist/asset-policy.d.ts.map +1 -0
  17. package/dist/asset-policy.js +312 -0
  18. package/dist/asset-policy.js.map +1 -0
  19. package/dist/banned-typography.d.ts +13 -0
  20. package/dist/banned-typography.d.ts.map +1 -0
  21. package/dist/banned-typography.js +78 -0
  22. package/dist/banned-typography.js.map +1 -0
  23. package/dist/bundle-budget.d.ts +16 -0
  24. package/dist/bundle-budget.d.ts.map +1 -0
  25. package/dist/bundle-budget.js +37 -0
  26. package/dist/bundle-budget.js.map +1 -0
  27. package/dist/commit-message.d.ts +37 -0
  28. package/dist/commit-message.d.ts.map +1 -0
  29. package/dist/commit-message.js +144 -0
  30. package/dist/commit-message.js.map +1 -0
  31. package/dist/config-references.d.ts +17 -0
  32. package/dist/config-references.d.ts.map +1 -0
  33. package/dist/config-references.js +54 -0
  34. package/dist/config-references.js.map +1 -0
  35. package/dist/container-failure.d.ts +40 -0
  36. package/dist/container-failure.d.ts.map +1 -0
  37. package/dist/container-failure.js +154 -0
  38. package/dist/container-failure.js.map +1 -0
  39. package/dist/container-files.d.ts +36 -0
  40. package/dist/container-files.d.ts.map +1 -0
  41. package/dist/container-files.js +74 -0
  42. package/dist/container-files.js.map +1 -0
  43. package/dist/container-freshness.d.ts +102 -0
  44. package/dist/container-freshness.d.ts.map +1 -0
  45. package/dist/container-freshness.js +129 -0
  46. package/dist/container-freshness.js.map +1 -0
  47. package/dist/dependency-freshness.d.ts +129 -0
  48. package/dist/dependency-freshness.d.ts.map +1 -0
  49. package/dist/dependency-freshness.js +161 -0
  50. package/dist/dependency-freshness.js.map +1 -0
  51. package/dist/doc-blocks.d.ts +13 -0
  52. package/dist/doc-blocks.d.ts.map +1 -0
  53. package/dist/doc-blocks.js +75 -0
  54. package/dist/doc-blocks.js.map +1 -0
  55. package/dist/document-references.d.ts +44 -0
  56. package/dist/document-references.d.ts.map +1 -0
  57. package/dist/document-references.js +94 -0
  58. package/dist/document-references.js.map +1 -0
  59. package/dist/editorconfig-policy.d.ts +24 -0
  60. package/dist/editorconfig-policy.d.ts.map +1 -0
  61. package/dist/editorconfig-policy.js +106 -0
  62. package/dist/editorconfig-policy.js.map +1 -0
  63. package/dist/environment-files.d.ts +42 -0
  64. package/dist/environment-files.d.ts.map +1 -0
  65. package/dist/environment-files.js +76 -0
  66. package/dist/environment-files.js.map +1 -0
  67. package/dist/file-roles.d.ts +39 -0
  68. package/dist/file-roles.d.ts.map +1 -0
  69. package/dist/file-roles.js +82 -0
  70. package/dist/file-roles.js.map +1 -0
  71. package/dist/generated-denial.d.ts +42 -0
  72. package/dist/generated-denial.d.ts.map +1 -0
  73. package/dist/generated-denial.js +87 -0
  74. package/dist/generated-denial.js.map +1 -0
  75. package/dist/history-policy.d.ts +32 -0
  76. package/dist/history-policy.d.ts.map +1 -0
  77. package/dist/history-policy.js +50 -0
  78. package/dist/history-policy.js.map +1 -0
  79. package/dist/image-assets.d.ts +14 -0
  80. package/dist/image-assets.d.ts.map +1 -0
  81. package/dist/image-assets.js +205 -0
  82. package/dist/image-assets.js.map +1 -0
  83. package/dist/index.d.ts +49 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +53 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/install-policy.d.ts +35 -0
  88. package/dist/install-policy.d.ts.map +1 -0
  89. package/dist/install-policy.js +61 -0
  90. package/dist/install-policy.js.map +1 -0
  91. package/dist/json-shapes.d.ts +86 -0
  92. package/dist/json-shapes.d.ts.map +1 -0
  93. package/dist/json-shapes.js +124 -0
  94. package/dist/json-shapes.js.map +1 -0
  95. package/dist/license-allowlist.d.ts +15 -0
  96. package/dist/license-allowlist.d.ts.map +1 -0
  97. package/dist/license-allowlist.js +157 -0
  98. package/dist/license-allowlist.js.map +1 -0
  99. package/dist/network-policy.d.ts +69 -0
  100. package/dist/network-policy.d.ts.map +1 -0
  101. package/dist/network-policy.js +173 -0
  102. package/dist/network-policy.js.map +1 -0
  103. package/dist/paired-assets.d.ts +34 -0
  104. package/dist/paired-assets.d.ts.map +1 -0
  105. package/dist/paired-assets.js +63 -0
  106. package/dist/paired-assets.js.map +1 -0
  107. package/dist/payload-access.d.ts +9 -0
  108. package/dist/payload-access.d.ts.map +1 -0
  109. package/dist/payload-access.js +168 -0
  110. package/dist/payload-access.js.map +1 -0
  111. package/dist/payload-policy.d.ts +18 -0
  112. package/dist/payload-policy.d.ts.map +1 -0
  113. package/dist/payload-policy.js +124 -0
  114. package/dist/payload-policy.js.map +1 -0
  115. package/dist/payload-source.d.ts +29 -0
  116. package/dist/payload-source.d.ts.map +1 -0
  117. package/dist/payload-source.js +84 -0
  118. package/dist/payload-source.js.map +1 -0
  119. package/dist/release-age.d.ts +23 -0
  120. package/dist/release-age.d.ts.map +1 -0
  121. package/dist/release-age.js +38 -0
  122. package/dist/release-age.js.map +1 -0
  123. package/dist/request-limits.d.ts +39 -0
  124. package/dist/request-limits.d.ts.map +1 -0
  125. package/dist/request-limits.js +57 -0
  126. package/dist/request-limits.js.map +1 -0
  127. package/dist/run-plan.d.ts +32 -0
  128. package/dist/run-plan.d.ts.map +1 -0
  129. package/dist/run-plan.js +43 -0
  130. package/dist/run-plan.js.map +1 -0
  131. package/dist/run-policy.d.ts +32 -0
  132. package/dist/run-policy.d.ts.map +1 -0
  133. package/dist/run-policy.js +37 -0
  134. package/dist/run-policy.js.map +1 -0
  135. package/dist/secret-policy.d.ts +13 -0
  136. package/dist/secret-policy.d.ts.map +1 -0
  137. package/dist/secret-policy.js +69 -0
  138. package/dist/secret-policy.js.map +1 -0
  139. package/dist/settings-layering.d.ts +45 -0
  140. package/dist/settings-layering.d.ts.map +1 -0
  141. package/dist/settings-layering.js +134 -0
  142. package/dist/settings-layering.js.map +1 -0
  143. package/dist/settings.d.ts +238 -0
  144. package/dist/settings.d.ts.map +1 -0
  145. package/dist/settings.js +378 -0
  146. package/dist/settings.js.map +1 -0
  147. package/dist/skill-manifest.d.ts +18 -0
  148. package/dist/skill-manifest.d.ts.map +1 -0
  149. package/dist/skill-manifest.js +125 -0
  150. package/dist/skill-manifest.js.map +1 -0
  151. package/dist/source-text.d.ts +83 -0
  152. package/dist/source-text.d.ts.map +1 -0
  153. package/dist/source-text.js +310 -0
  154. package/dist/source-text.js.map +1 -0
  155. package/dist/suppression-ceiling.d.ts +48 -0
  156. package/dist/suppression-ceiling.d.ts.map +1 -0
  157. package/dist/suppression-ceiling.js +115 -0
  158. package/dist/suppression-ceiling.js.map +1 -0
  159. package/dist/tailwind-tokens.d.ts +16 -0
  160. package/dist/tailwind-tokens.d.ts.map +1 -0
  161. package/dist/tailwind-tokens.js +70 -0
  162. package/dist/tailwind-tokens.js.map +1 -0
  163. package/dist/text-escapes.d.ts +7 -0
  164. package/dist/text-escapes.d.ts.map +1 -0
  165. package/dist/text-escapes.js +14 -0
  166. package/dist/text-escapes.js.map +1 -0
  167. package/dist/toolchain-pins.d.ts +42 -0
  168. package/dist/toolchain-pins.d.ts.map +1 -0
  169. package/dist/toolchain-pins.js +99 -0
  170. package/dist/toolchain-pins.js.map +1 -0
  171. package/dist/url-safety.d.ts +12 -0
  172. package/dist/url-safety.d.ts.map +1 -0
  173. package/dist/url-safety.js +58 -0
  174. package/dist/url-safety.js.map +1 -0
  175. package/dist/version-policy.d.ts +99 -0
  176. package/dist/version-policy.d.ts.map +1 -0
  177. package/dist/version-policy.js +306 -0
  178. package/dist/version-policy.js.map +1 -0
  179. package/dist/vulnerability-policy.d.ts +66 -0
  180. package/dist/vulnerability-policy.d.ts.map +1 -0
  181. package/dist/vulnerability-policy.js +106 -0
  182. package/dist/vulnerability-policy.js.map +1 -0
  183. package/dist/wiring-policy.d.ts +226 -0
  184. package/dist/wiring-policy.d.ts.map +1 -0
  185. package/dist/wiring-policy.js +458 -0
  186. package/dist/wiring-policy.js.map +1 -0
  187. package/dist/wiring-violation.d.ts +6 -0
  188. package/dist/wiring-violation.d.ts.map +1 -0
  189. package/dist/wiring-violation.js +8 -0
  190. package/dist/wiring-violation.js.map +1 -0
  191. package/dist/workspace-policy.d.ts +177 -0
  192. package/dist/workspace-policy.d.ts.map +1 -0
  193. package/dist/workspace-policy.js +228 -0
  194. package/dist/workspace-policy.js.map +1 -0
  195. package/dist/yaml-blocks.d.ts +43 -0
  196. package/dist/yaml-blocks.d.ts.map +1 -0
  197. package/dist/yaml-blocks.js +87 -0
  198. package/dist/yaml-blocks.js.map +1 -0
  199. package/package.json +41 -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/governance
2
+
3
+ Pure, unit-tested governance rules for ploaness. No filesystem, process, or network access.
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.
@@ -0,0 +1,41 @@
1
+ import type { PublicAccess } from './settings.js';
2
+ /**
3
+ * One operation's verdict as Payload sends it: `true` for an unconstrained grant, `{ permission: true,
4
+ * where }` for a constrained one, and absent for a denial, which Payload deletes from the response.
5
+ */
6
+ export type ReportedPermission = boolean | {
7
+ readonly permission?: boolean;
8
+ readonly where?: unknown;
9
+ };
10
+ /** One entity's operations, keyed as Payload keys them. */
11
+ export type ReportedEntity = Readonly<Record<string, ReportedPermission>>;
12
+ /** The body of `/api/access`, read for the operations alone. */
13
+ export interface AccessReport {
14
+ readonly canAccessAdmin?: boolean;
15
+ readonly collections?: Readonly<Record<string, ReportedEntity>>;
16
+ readonly globals?: Readonly<Record<string, ReportedEntity>>;
17
+ }
18
+ /** One permission the running application actually grants. */
19
+ export interface Granted {
20
+ readonly entity: string;
21
+ readonly operation: string;
22
+ }
23
+ /**
24
+ * A write is never a default a project should be able to reach by accident: Payload grants none of these
25
+ * to an anonymous caller unless the project's own rule says so. `read` is judged too, but it is the one
26
+ * a public site legitimately grants, which is what `publicAccess` exists to record.
27
+ */
28
+ export declare const JUDGED_OPERATIONS: readonly string[];
29
+ /** Whether Payload reported this operation as permitted, in either of the two shapes it sends. */
30
+ export declare const isPermitted: (permission: ReportedPermission | undefined) => boolean;
31
+ /** Every permission an access report grants, across collections and globals alike. */
32
+ export declare const grantedPermissions: (report: AccessReport) => readonly Granted[];
33
+ /** How one grant is named, both in a report and in the `publicAccess` entry that would declare it. */
34
+ export declare const describeGrant: (granted: Granted) => string;
35
+ /**
36
+ * The grants the running application makes to a stranger that the project has not recorded. Empty is
37
+ * the only passing answer: a project that declares nothing is judged most strictly, and a declaration
38
+ * narrows nothing else.
39
+ */
40
+ export declare const undeclaredGrants: (report: AccessReport, declared: readonly PublicAccess[]) => readonly string[];
41
+ //# sourceMappingURL=access-boundary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-boundary.d.ts","sourceRoot":"","sources":["../src/access-boundary.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAEjD;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAC1B,OAAO,GACP;IAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AAE/D,2DAA2D;AAC3D,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAA;AAEzE,gEAAgE;AAChE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAA;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAA;IAC/D,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAA;CAC5D;AAED,8DAA8D;AAC9D,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAAS,MAAM,EAA2C,CAAA;AAE1F,kGAAkG;AAClG,eAAO,MAAM,WAAW,GAAI,YAAY,kBAAkB,GAAG,SAAS,KAAG,OACO,CAAA;AAUhF,sFAAsF;AACtF,eAAO,MAAM,kBAAkB,GAAI,QAAQ,YAAY,KAAG,SAAS,OAAO,EAGzE,CAAA;AAED,sGAAsG;AACtG,eAAO,MAAM,aAAa,GAAI,SAAS,OAAO,KAAG,MAAkD,CAAA;AAQnG;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,YAAY,EACpB,UAAU,SAAS,YAAY,EAAE,KAChC,SAAS,MAAM,EAG4C,CAAA"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * A write is never a default a project should be able to reach by accident: Payload grants none of these
3
+ * to an anonymous caller unless the project's own rule says so. `read` is judged too, but it is the one
4
+ * a public site legitimately grants, which is what `publicAccess` exists to record.
5
+ */
6
+ export const JUDGED_OPERATIONS = ['create', 'read', 'update', 'delete'];
7
+ /** Whether Payload reported this operation as permitted, in either of the two shapes it sends. */
8
+ export const isPermitted = (permission) => typeof permission === 'boolean' ? permission : permission?.permission === true;
9
+ const grantsIn = (entities) => Object.entries(entities).flatMap(([entity, permissions]) => JUDGED_OPERATIONS.filter((operation) => isPermitted(permissions[operation])).map((operation) => ({ entity, operation })));
10
+ /** Every permission an access report grants, across collections and globals alike. */
11
+ export const grantedPermissions = (report) => [
12
+ ...grantsIn(report.collections ?? {}),
13
+ ...grantsIn(report.globals ?? {}),
14
+ ];
15
+ /** How one grant is named, both in a report and in the `publicAccess` entry that would declare it. */
16
+ export const describeGrant = (granted) => `${granted.entity}.${granted.operation}`;
17
+ const isDeclared = (granted, declared) => declared.some((entry) => entry.entity === granted.entity && entry.operation === granted.operation);
18
+ /**
19
+ * The grants the running application makes to a stranger that the project has not recorded. Empty is
20
+ * the only passing answer: a project that declares nothing is judged most strictly, and a declaration
21
+ * narrows nothing else.
22
+ */
23
+ export const undeclaredGrants = (report, declared) => grantedPermissions(report)
24
+ .filter((granted) => !isDeclared(granted, declared))
25
+ .map((granted) => describeGrant(granted));
26
+ //# sourceMappingURL=access-boundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-boundary.js","sourceRoot":"","sources":["../src/access-boundary.ts"],"names":[],"mappings":"AAyCA;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;AAE1F,kGAAkG;AAClG,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,UAA0C,EAAW,EAAE,CACjF,OAAO,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAA;AAEhF,MAAM,QAAQ,GAAG,CAAC,QAAkD,EAAsB,EAAE,CAC1F,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAC9B,CAAC,CAAC,MAAM,EAAE,WAAW,CAAoC,EAAsB,EAAE,CAC/E,iBAAiB,CAAC,MAAM,CAAC,CAAC,SAAiB,EAAW,EAAE,CACtD,WAAW,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CACpC,CAAC,GAAG,CAAC,CAAC,SAAiB,EAAW,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CACjE,CAAA;AAEH,sFAAsF;AACtF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAoB,EAAsB,EAAE,CAAC;IAC9E,GAAG,QAAQ,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC;IACrC,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;CAClC,CAAA;AAED,sGAAsG;AACtG,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAgB,EAAU,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,SAAS,EAAE,CAAA;AAEnG,MAAM,UAAU,GAAG,CAAC,OAAgB,EAAE,QAAiC,EAAW,EAAE,CAClF,QAAQ,CAAC,IAAI,CACX,CAAC,KAAmB,EAAW,EAAE,CAC/B,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,CAC3E,CAAA;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,MAAoB,EACpB,QAAiC,EACd,EAAE,CACrB,kBAAkB,CAAC,MAAM,CAAC;KACvB,MAAM,CAAC,CAAC,OAAgB,EAAW,EAAE,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;KACrE,GAAG,CAAC,CAAC,OAAgB,EAAU,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAA"}
@@ -0,0 +1,12 @@
1
+ export interface AgentReferenceMatch {
2
+ readonly line: number;
3
+ readonly label: string;
4
+ }
5
+ /**
6
+ * Scans text for references that attribute a change to an AI agent or its session, reporting the
7
+ * 1-based line and the kind of attribution matched.
8
+ * @param text the content to scan, with lines separated by "\n".
9
+ * @returns one match per attribution marker found, in reading order.
10
+ */
11
+ export declare const findAgentReferences: (text: string) => readonly AgentReferenceMatch[];
12
+ //# sourceMappingURL=agent-references.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-references.d.ts","sourceRoot":"","sources":["../src/agent-references.ts"],"names":[],"mappings":"AAqDA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAQD;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAAI,MAAM,MAAM,KAAG,SAAS,mBAAmB,EAK1E,CAAA"}
@@ -0,0 +1,53 @@
1
+ // Shared AI-agent attribution ban: a governed repository's history must not record which automated
2
+ // agent, or which agent session, produced a change. Commit messages therefore carry no co-authorship
3
+ // trailer, vendor sign-off email, session identifier, or generated-by signature that attributes the
4
+ // change to an AI agent. This module is the single source of truth for the known attribution patterns;
5
+ // the `commit-history` gate in packages/cli/src/checks/history.ts consumes it. Only structured attribution markers
6
+ // are matched, never a bare product name in prose: this repository ships agent instructions and
7
+ // documents such tools by name, so a commit like "docs: explain the claude code skill" must pass.
8
+ // Named automated coding agents and their vendors, as one alternation fragment reused across patterns.
9
+ // The set is the "known ones" the ban targets; extend it as new agents appear (no pattern can know them
10
+ // all, so the guideline also states the rule in prose for an inspector to apply).
11
+ const AGENT_NAMES = [
12
+ 'claude|anthropic|copilot|cursor|codex|chatgpt|openai',
13
+ 'gpt(?:[- ][0-9a-z.]+)?|devin|aider|windsurf|opencode',
14
+ 'gemini|bard|codeium|tabnine|sourcegraph|cody',
15
+ ].join('|');
16
+ const AGENT_REFERENCE_PATTERNS = [
17
+ {
18
+ // A co-authorship trailer naming a known agent, e.g. "Co-Authored-By: Claude <...>".
19
+ pattern: new RegExp(String.raw `co-authored-by:[^\n]*\b(?:${AGENT_NAMES})\b`, 'i'),
20
+ label: 'agent co-authorship trailer',
21
+ },
22
+ {
23
+ // An agent vendor's sign-off address, e.g. the "noreply@anthropic.com" author Claude Code stamps.
24
+ pattern: /\b[\w.+-]*@(?:anthropic|openai|cursor|devin|aider)\.(?:com|ai|dev)\b/i,
25
+ label: 'agent vendor email',
26
+ },
27
+ {
28
+ // A session identifier an agent stamps on its work, e.g. "Claude-Session:" or "Codex-Session-Id:".
29
+ pattern: new RegExp(String.raw `\b(?:${AGENT_NAMES}|agent|assistant)[- ]?session(?:[- ]?id)?\s*:`, 'i'),
30
+ label: 'agent session identifier',
31
+ },
32
+ {
33
+ // A generated-by signature, e.g. "Generated with Claude Code" or its robot-emoji-prefixed variant.
34
+ pattern: new RegExp(String.raw `generated\s+(?:with|by)\s.*\b(?:${AGENT_NAMES})\b`, 'i'),
35
+ label: 'agent generation signature',
36
+ },
37
+ {
38
+ // The Claude Code product signature link, e.g. "[Claude Code](https://claude.com/claude-code)".
39
+ pattern: /claude\.(?:ai|com)\/claude-code/i,
40
+ label: 'agent product signature',
41
+ },
42
+ ];
43
+ const findMatchesInLine = (line, lineNumber) => AGENT_REFERENCE_PATTERNS.flatMap((entry) => entry.pattern.test(line) ? [{ line: lineNumber, label: entry.label }] : []);
44
+ /**
45
+ * Scans text for references that attribute a change to an AI agent or its session, reporting the
46
+ * 1-based line and the kind of attribution matched.
47
+ * @param text the content to scan, with lines separated by "\n".
48
+ * @returns one match per attribution marker found, in reading order.
49
+ */
50
+ export const findAgentReferences = (text) => text
51
+ .split('\n')
52
+ .flatMap((line, index) => findMatchesInLine(line, index + 1));
53
+ //# sourceMappingURL=agent-references.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-references.js","sourceRoot":"","sources":["../src/agent-references.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,qGAAqG;AACrG,oGAAoG;AACpG,uGAAuG;AACvG,mHAAmH;AACnH,gGAAgG;AAChG,kGAAkG;AAOlG,uGAAuG;AACvG,wGAAwG;AACxG,kFAAkF;AAClF,MAAM,WAAW,GAAW;IAC1B,sDAAsD;IACtD,sDAAsD;IACtD,8CAA8C;CAC/C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAEX,MAAM,wBAAwB,GAAqC;IACjE;QACE,qFAAqF;QACrF,OAAO,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,6BAA6B,WAAW,KAAK,EAAE,GAAG,CAAC;QACjF,KAAK,EAAE,6BAA6B;KACrC;IACD;QACE,kGAAkG;QAClG,OAAO,EAAE,uEAAuE;QAChF,KAAK,EAAE,oBAAoB;KAC5B;IACD;QACE,mGAAmG;QACnG,OAAO,EAAE,IAAI,MAAM,CACjB,MAAM,CAAC,GAAG,CAAA,QAAQ,WAAW,+CAA+C,EAC5E,GAAG,CACJ;QACD,KAAK,EAAE,0BAA0B;KAClC;IACD;QACE,mGAAmG;QACnG,OAAO,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,mCAAmC,WAAW,KAAK,EAAE,GAAG,CAAC;QACvF,KAAK,EAAE,4BAA4B;KACpC;IACD;QACE,gGAAgG;QAChG,OAAO,EAAE,kCAAkC;QAC3C,KAAK,EAAE,yBAAyB;KACjC;CACF,CAAA;AAOD,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAE,UAAkB,EAAkC,EAAE,CAC7F,wBAAwB,CAAC,OAAO,CAC9B,CAAC,KAA4B,EAAkC,EAAE,CAC/D,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAC7E,CAAA;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,IAAY,EAAkC,EAAE,CAClF,IAAI;KACD,KAAK,CAAC,IAAI,CAAC;KACX,OAAO,CAAC,CAAC,IAAY,EAAE,KAAa,EAAkC,EAAE,CACvE,iBAAiB,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CACnC,CAAA"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * The forbidden rule that keeps the declared pure-logic directories pure.
3
+ *
4
+ * Phrased as "these directories may depend on nothing else under a source root" rather than by listing
5
+ * the layers above them, so a new source directory is governed the moment it exists instead of when
6
+ * somebody remembers to add it here.
7
+ * @param pureLogicRoots the directories forming the floor, repo-relative and without a trailing slash.
8
+ * @returns the dependency-cruiser rule, or undefined when the project declares no floor.
9
+ */
10
+ export declare const pureLogicRule: (pureLogicRoots: readonly string[]) => Record<string, unknown> | undefined;
11
+ //# sourceMappingURL=architecture-layers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"architecture-layers.d.ts","sourceRoot":"","sources":["../src/architecture-layers.ts"],"names":[],"mappings":"AA2BA;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,GACxB,gBAAgB,SAAS,MAAM,EAAE,KAChC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAmB5B,CAAA"}
@@ -0,0 +1,47 @@
1
+ // The pure-logic floor, as data rather than as a fixed path.
2
+ //
3
+ // The architecture contract calls the layer map "the one genuinely project-shaped part" and then named
4
+ // `src/access` and `src/lib` in a file a governed project is forbidden to own. A project that puts pure
5
+ // logic somewhere else - a configuration layer, a domain directory - could satisfy the intent and still
6
+ // fail the rule, with no way to say so. The floor is declared under the `ploaness` key now, and this
7
+ // renders it into the shape the analyzer reads.
8
+ /** The generated files the floor may depend on, which carry types rather than behaviour. */
9
+ const TYPE_ONLY_ARTEFACTS = ['src/payload-types.ts'];
10
+ // Every root is spliced into a regular expression, so it has to be escaped on the way in. It was not,
11
+ // and both halves of that were live: `src/app/(payload)` - a real directory in a Payload project - read
12
+ // as a capture group and matched `src/app/payload/` instead, and a glob-shaped root produced
13
+ // `^(src/config/**\/)`, which is not a valid expression at all and took dependency-cruiser down with no
14
+ // finding attached. The artefact list beside this one was already escaped; the roots were the half that
15
+ // was missed.
16
+ const REGEX_METACHARACTERS = /[$()*+.?[\\\]^{|}]/gu;
17
+ // A trailing slash is normalised where the setting is read, so what arrives here is already a bare
18
+ // directory. This escapes it, and nothing else.
19
+ const asRoot = (directory) => directory.replaceAll(REGEX_METACHARACTERS, String.raw `\$&`);
20
+ const alternation = (directories) => directories.map((directory) => `${asRoot(directory)}/`).join('|');
21
+ /**
22
+ * The forbidden rule that keeps the declared pure-logic directories pure.
23
+ *
24
+ * Phrased as "these directories may depend on nothing else under a source root" rather than by listing
25
+ * the layers above them, so a new source directory is governed the moment it exists instead of when
26
+ * somebody remembers to add it here.
27
+ * @param pureLogicRoots the directories forming the floor, repo-relative and without a trailing slash.
28
+ * @returns the dependency-cruiser rule, or undefined when the project declares no floor.
29
+ */
30
+ export const pureLogicRule = (pureLogicRoots) => {
31
+ if (pureLogicRoots.length === 0) {
32
+ return undefined;
33
+ }
34
+ const floor = alternation(pureLogicRoots);
35
+ const escaped = TYPE_ONLY_ARTEFACTS.map((artefact) => artefact.replaceAll('.', String.raw `\.`));
36
+ const exempt = escaped.map((artefact) => `^${artefact}$`).join('|');
37
+ return {
38
+ name: 'pure-logic-stays-pure',
39
+ severity: 'error',
40
+ comment: `${pureLogicRoots.join(' and ')} are the pure-logic floor: they must depend on nothing else ` +
41
+ 'in src (only types and third-party libs). If you need framework data, pass it in as a plain ' +
42
+ 'value. This is what keeps them unit-testable without mocks.',
43
+ from: { path: `^(${floor})` },
44
+ to: { path: '^src/', pathNot: `^(${floor})|${exempt}` },
45
+ };
46
+ };
47
+ //# sourceMappingURL=architecture-layers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"architecture-layers.js","sourceRoot":"","sources":["../src/architecture-layers.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,EAAE;AACF,uGAAuG;AACvG,wGAAwG;AACxG,wGAAwG;AACxG,qGAAqG;AACrG,gDAAgD;AAEhD,4FAA4F;AAC5F,MAAM,mBAAmB,GAAsB,CAAC,sBAAsB,CAAC,CAAA;AAEvE,sGAAsG;AACtG,wGAAwG;AACxG,6FAA6F;AAC7F,wGAAwG;AACxG,wGAAwG;AACxG,cAAc;AACd,MAAM,oBAAoB,GAAW,sBAAsB,CAAA;AAE3D,mGAAmG;AACnG,gDAAgD;AAChD,MAAM,MAAM,GAAG,CAAC,SAAiB,EAAU,EAAE,CAC3C,SAAS,CAAC,UAAU,CAAC,oBAAoB,EAAE,MAAM,CAAC,GAAG,CAAA,KAAK,CAAC,CAAA;AAE7D,MAAM,WAAW,GAAG,CAAC,WAA8B,EAAU,EAAE,CAC7D,WAAW,CAAC,GAAG,CAAC,CAAC,SAAiB,EAAU,EAAE,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAEnF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,cAAiC,EACI,EAAE;IACvC,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,MAAM,KAAK,GAAW,WAAW,CAAC,cAAc,CAAC,CAAA;IACjD,MAAM,OAAO,GAAsB,mBAAmB,CAAC,GAAG,CAAC,CAAC,QAAgB,EAAU,EAAE,CACtF,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAA,IAAI,CAAC,CACzC,CAAA;IACD,MAAM,MAAM,GAAW,OAAO,CAAC,GAAG,CAAC,CAAC,QAAgB,EAAU,EAAE,CAAC,IAAI,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC3F,OAAO;QACL,IAAI,EAAE,uBAAuB;QAC7B,QAAQ,EAAE,OAAO;QACjB,OAAO,EACL,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,8DAA8D;YAC7F,8FAA8F;YAC9F,6DAA6D;QAC/D,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,KAAK,GAAG,EAAE;QAC7B,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,KAAK,KAAK,MAAM,EAAE,EAAE;KACxD,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,138 @@
1
+ /** How ploaness treats a path in the consumer working tree. */
2
+ export type Disposition = 'PINNED' | 'SEED' | 'FORBIDDEN' | 'SECTION' | 'REFERENCE';
3
+ /**
4
+ * Where a managed path lives.
5
+ *
6
+ * REPOSITORY is what git, an editor or a coding agent reads from the tree root: one contract per
7
+ * repository, not one per package, and a second copy inside a member would be a second answer to the
8
+ * same question. APPLICATION is what belongs to a member that serves one - the executable sweeps, each
9
+ * interrogating one running server, so two applications are two sets of answers rather than one shared
10
+ * file. PAYLOAD narrows that to the members that can answer at all: the access-boundary sweep asks
11
+ * Payload itself what it grants an anonymous caller, and a Next application with no Payload has no such
12
+ * endpoint to ask. EVERYWHERE is for a forbidden path, where a copy at the root OR inside any member
13
+ * would shadow what ploaness supplies.
14
+ */
15
+ export type AssetScope = 'REPOSITORY' | 'APPLICATION' | 'PAYLOAD' | 'EVERYWHERE';
16
+ /** One catalogue entry: a repo-relative path, its disposition, and where it lives. */
17
+ export interface ManagedAsset {
18
+ readonly path: string;
19
+ readonly disposition: Disposition;
20
+ readonly scope: AssetScope;
21
+ }
22
+ /** A managed-file defect found in the consumer working tree. */
23
+ export interface AssetViolation {
24
+ readonly path: string;
25
+ readonly reason: string;
26
+ }
27
+ /** The working-tree facts the policy needs, injected so the core stays free of filesystem access. */
28
+ export interface AssetState {
29
+ /** Whether the path is present in the consumer working tree. */
30
+ readonly isPresent: boolean;
31
+ /** The working-tree content, or undefined when the path is absent. */
32
+ readonly actual: string | undefined;
33
+ /** The content ploaness ships for the path, or undefined for a FORBIDDEN entry. */
34
+ readonly expected: string | undefined;
35
+ }
36
+ /** The outcome of parsing a manifest: the entries, and any rows too malformed to honour. */
37
+ export interface ParsedManifest {
38
+ readonly assets: readonly ManagedAsset[];
39
+ readonly problems: readonly string[];
40
+ }
41
+ /** Opens the block ploaness owns inside a SECTION file. */
42
+ export declare const SECTION_BEGIN: string;
43
+ /** Closes the block ploaness owns inside a SECTION file. */
44
+ export declare const SECTION_END: string;
45
+ /**
46
+ * What a SECTION file currently carries. The three cases are not interchangeable: `absent` is a file
47
+ * ploaness may safely write into, `present` is a block it may compare and replace, and `malformed` is a
48
+ * file it must refuse, because every automatic repair of ambiguous markers risks swallowing or
49
+ * duplicating text the project owns.
50
+ */
51
+ export type SectionState = {
52
+ readonly kind: 'absent';
53
+ } | {
54
+ readonly kind: 'present';
55
+ readonly block: string;
56
+ } | {
57
+ readonly kind: 'malformed';
58
+ readonly reason: string;
59
+ };
60
+ /**
61
+ * Read back the ploaness-owned block, markers included.
62
+ *
63
+ * The markers are HTML comments so they survive in every Markdown renderer without being visible to a
64
+ * human reader, and so an agent editing the file below them can see exactly where its own territory
65
+ * starts. The block must lead the file and appear exactly once: a contract an agent reaches only after
66
+ * scrolling past the project's own prose is not the first thing it reads, and a second copy would let
67
+ * one block drift while the other stayed current.
68
+ * @param rawContent the whole file as it currently stands in the working tree.
69
+ * @returns which of the three states the file is in.
70
+ */
71
+ export declare const readManagedSection: (rawContent: string) => SectionState;
72
+ /**
73
+ * Put the ploaness-owned block into a file, preserving everything the project owns.
74
+ *
75
+ * An existing block is replaced where it stands, so the project text below it is carried through
76
+ * byte for byte. A file with no block gets one at the very top, because the contract has to be the
77
+ * first thing an agent reads.
78
+ * @param rawContent the current file, or the empty string when it does not exist yet.
79
+ * @param block the block ploaness ships, markers included.
80
+ * @returns the spliced file, or undefined when the markers are too ambiguous to edit safely.
81
+ */
82
+ export declare const applyManagedSection: (rawContent: string, block: string) => string | undefined;
83
+ /**
84
+ * Parse a manifest into catalogue entries. Blank lines and `#` comments are ignored; a row is a
85
+ * repo-relative path, a tab, and a disposition. A malformed row is reported rather than silently
86
+ * skipped, so a packaging mistake cannot quietly shrink the catalogue.
87
+ * @param manifest the raw manifest.tsv contents.
88
+ * @returns the parsed entries and any malformed rows.
89
+ */
90
+ export declare const parseManifest: (manifest: string) => ParsedManifest;
91
+ /**
92
+ * Judge one managed path against its disposition.
93
+ * @param asset the catalogue entry.
94
+ * @param state the working-tree facts for that path.
95
+ * @returns a violation, or undefined when the path conforms.
96
+ */
97
+ export declare const checkAsset: (asset: ManagedAsset, state: AssetState) => AssetViolation | undefined;
98
+ /**
99
+ * Judge every catalogue entry the project has not explicitly taken over.
100
+ * @param assets the parsed catalogue.
101
+ * @param unmanaged repo-relative paths the project owns instead.
102
+ * @param stateOf resolves the working-tree and shipped content for a path.
103
+ * @returns one violation per non-conforming path; empty means the tree matches the catalogue.
104
+ */
105
+ export declare const findAssetViolations: (assets: readonly ManagedAsset[], unmanaged: readonly string[], stateOf: (path: string) => AssetState) => readonly AssetViolation[];
106
+ /** What `ploaness sync` should do with one managed path. */
107
+ export type SyncAction = 'write' | 'delete' | 'skip' | 'splice';
108
+ /**
109
+ * Decide the sync action for one path. A PINNED file is always rewritten, so drift is repaired; a SEED
110
+ * file is written only when absent, so the project's own edits survive; a FORBIDDEN file is deleted; a
111
+ * SECTION file has only its marked block replaced.
112
+ * @param asset the catalogue entry.
113
+ * @param isPresent whether the path is currently present in the working tree.
114
+ * @returns the action `ploaness sync` performs.
115
+ */
116
+ export declare const syncAction: (asset: ManagedAsset, isPresent: boolean) => SyncAction;
117
+ /** What a member can hold a managed file for, derived from its kind. */
118
+ export interface AssetHost {
119
+ readonly hasRuntime: boolean;
120
+ readonly isPayload: boolean;
121
+ }
122
+ /**
123
+ * The catalogue entries that apply at the repository root.
124
+ * @param assets the whole catalogue.
125
+ * @returns the repository-scope entries and the forbidden paths, which apply everywhere.
126
+ */
127
+ export declare const repositoryAssets: (assets: readonly ManagedAsset[]) => readonly ManagedAsset[];
128
+ /**
129
+ * The catalogue entries that apply inside one member.
130
+ *
131
+ * A library receives only the forbidden paths: it has no server to sweep, so a spec that drives one
132
+ * would be a managed file demanding a browser the package was never going to open.
133
+ * @param assets the whole catalogue.
134
+ * @param host what the member can hold, derived from its kind.
135
+ * @returns the entries that apply to that member.
136
+ */
137
+ export declare const memberAssets: (assets: readonly ManagedAsset[], host: AssetHost) => readonly ManagedAsset[];
138
+ //# sourceMappingURL=asset-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-policy.d.ts","sourceRoot":"","sources":["../src/asset-policy.ts"],"names":[],"mappings":"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"}