@rasensio/aidlc 1.15.2 → 1.17.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 (209) hide show
  1. package/README.md +1 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +4 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/compliance.d.ts +36 -0
  6. package/dist/commands/compliance.d.ts.map +1 -0
  7. package/dist/commands/compliance.js +275 -0
  8. package/dist/commands/compliance.js.map +1 -0
  9. package/dist/commands/constitution.d.ts +26 -0
  10. package/dist/commands/constitution.d.ts.map +1 -0
  11. package/dist/commands/constitution.js +145 -0
  12. package/dist/commands/constitution.js.map +1 -0
  13. package/dist/commands/cost.d.ts.map +1 -1
  14. package/dist/commands/cost.js +54 -35
  15. package/dist/commands/cost.js.map +1 -1
  16. package/dist/commands/doctor.js +7 -0
  17. package/dist/commands/doctor.js.map +1 -1
  18. package/dist/commands/gate.d.ts.map +1 -1
  19. package/dist/commands/gate.js +13 -0
  20. package/dist/commands/gate.js.map +1 -1
  21. package/dist/commands/init.d.ts.map +1 -1
  22. package/dist/commands/init.js +119 -10
  23. package/dist/commands/init.js.map +1 -1
  24. package/dist/commands/metrics.d.ts.map +1 -1
  25. package/dist/commands/metrics.js +6 -1
  26. package/dist/commands/metrics.js.map +1 -1
  27. package/dist/commands/review.d.ts +2 -27
  28. package/dist/commands/review.d.ts.map +1 -1
  29. package/dist/commands/review.js +10 -166
  30. package/dist/commands/review.js.map +1 -1
  31. package/dist/commands/status.d.ts.map +1 -1
  32. package/dist/commands/status.js +7 -0
  33. package/dist/commands/status.js.map +1 -1
  34. package/dist/commands/transition.d.ts.map +1 -1
  35. package/dist/commands/transition.js +24 -1
  36. package/dist/commands/transition.js.map +1 -1
  37. package/dist/compile/adapters/claude-code.d.ts.map +1 -1
  38. package/dist/compile/adapters/claude-code.js +2 -1
  39. package/dist/compile/adapters/claude-code.js.map +1 -1
  40. package/dist/compile/adapters/codex.d.ts +22 -1
  41. package/dist/compile/adapters/codex.d.ts.map +1 -1
  42. package/dist/compile/adapters/codex.js +61 -27
  43. package/dist/compile/adapters/codex.js.map +1 -1
  44. package/dist/compile/adapters/cursor.d.ts.map +1 -1
  45. package/dist/compile/adapters/cursor.js +2 -19
  46. package/dist/compile/adapters/cursor.js.map +1 -1
  47. package/dist/compile/adapters/kiro.d.ts.map +1 -1
  48. package/dist/compile/adapters/kiro.js +1 -19
  49. package/dist/compile/adapters/kiro.js.map +1 -1
  50. package/dist/compile/adapters/windsurf.d.ts.map +1 -1
  51. package/dist/compile/adapters/windsurf.js +2 -1
  52. package/dist/compile/adapters/windsurf.js.map +1 -1
  53. package/dist/compile/guidance-install.d.ts +16 -19
  54. package/dist/compile/guidance-install.d.ts.map +1 -1
  55. package/dist/compile/guidance-install.js +26 -111
  56. package/dist/compile/guidance-install.js.map +1 -1
  57. package/dist/compile/layer-install.d.ts +122 -0
  58. package/dist/compile/layer-install.d.ts.map +1 -0
  59. package/dist/compile/layer-install.js +195 -0
  60. package/dist/compile/layer-install.js.map +1 -0
  61. package/dist/compile/loaders.d.ts +14 -0
  62. package/dist/compile/loaders.d.ts.map +1 -1
  63. package/dist/compile/loaders.js +23 -18
  64. package/dist/compile/loaders.js.map +1 -1
  65. package/dist/compile/skill-format.d.ts +39 -0
  66. package/dist/compile/skill-format.d.ts.map +1 -0
  67. package/dist/compile/skill-format.js +50 -0
  68. package/dist/compile/skill-format.js.map +1 -0
  69. package/dist/compliance/check.d.ts +79 -0
  70. package/dist/compliance/check.d.ts.map +1 -0
  71. package/dist/compliance/check.js +224 -0
  72. package/dist/compliance/check.js.map +1 -0
  73. package/dist/compliance/config.d.ts +91 -0
  74. package/dist/compliance/config.d.ts.map +1 -0
  75. package/dist/compliance/config.js +173 -0
  76. package/dist/compliance/config.js.map +1 -0
  77. package/dist/compliance/findings.d.ts +70 -0
  78. package/dist/compliance/findings.d.ts.map +1 -0
  79. package/dist/compliance/findings.js +132 -0
  80. package/dist/compliance/findings.js.map +1 -0
  81. package/dist/compliance/gate-criterion.d.ts +87 -0
  82. package/dist/compliance/gate-criterion.d.ts.map +1 -0
  83. package/dist/compliance/gate-criterion.js +168 -0
  84. package/dist/compliance/gate-criterion.js.map +1 -0
  85. package/dist/compliance/install.d.ts +135 -0
  86. package/dist/compliance/install.d.ts.map +1 -0
  87. package/dist/compliance/install.js +291 -0
  88. package/dist/compliance/install.js.map +1 -0
  89. package/dist/compliance/report.d.ts +144 -0
  90. package/dist/compliance/report.d.ts.map +1 -0
  91. package/dist/compliance/report.js +347 -0
  92. package/dist/compliance/report.js.map +1 -0
  93. package/dist/compliance/resolver.d.ts +65 -0
  94. package/dist/compliance/resolver.d.ts.map +1 -0
  95. package/dist/compliance/resolver.js +176 -0
  96. package/dist/compliance/resolver.js.map +1 -0
  97. package/dist/compliance/schema.d.ts +74 -0
  98. package/dist/compliance/schema.d.ts.map +1 -0
  99. package/dist/compliance/schema.js +474 -0
  100. package/dist/compliance/schema.js.map +1 -0
  101. package/dist/compliance/types.d.ts +140 -0
  102. package/dist/compliance/types.d.ts.map +1 -0
  103. package/dist/compliance/types.js +29 -0
  104. package/dist/compliance/types.js.map +1 -0
  105. package/dist/constitution/check.d.ts +22 -0
  106. package/dist/constitution/check.d.ts.map +1 -0
  107. package/dist/constitution/check.js +89 -0
  108. package/dist/constitution/check.js.map +1 -0
  109. package/dist/constitution/docx.d.ts +51 -0
  110. package/dist/constitution/docx.d.ts.map +1 -0
  111. package/dist/constitution/docx.js +157 -0
  112. package/dist/constitution/docx.js.map +1 -0
  113. package/dist/constitution/entries.d.ts +27 -0
  114. package/dist/constitution/entries.d.ts.map +1 -0
  115. package/dist/constitution/entries.js +65 -0
  116. package/dist/constitution/entries.js.map +1 -0
  117. package/dist/constitution/extract.d.ts +34 -0
  118. package/dist/constitution/extract.d.ts.map +1 -0
  119. package/dist/constitution/extract.js +117 -0
  120. package/dist/constitution/extract.js.map +1 -0
  121. package/dist/constitution/snapshot.d.ts +47 -0
  122. package/dist/constitution/snapshot.d.ts.map +1 -0
  123. package/dist/constitution/snapshot.js +159 -0
  124. package/dist/constitution/snapshot.js.map +1 -0
  125. package/dist/constitution/statements.d.ts +37 -0
  126. package/dist/constitution/statements.d.ts.map +1 -0
  127. package/dist/constitution/statements.js +64 -0
  128. package/dist/constitution/statements.js.map +1 -0
  129. package/dist/constitution/types.d.ts +80 -0
  130. package/dist/constitution/types.d.ts.map +1 -0
  131. package/dist/constitution/types.js +9 -0
  132. package/dist/constitution/types.js.map +1 -0
  133. package/dist/core/gate.d.ts +10 -0
  134. package/dist/core/gate.d.ts.map +1 -1
  135. package/dist/core/gate.js.map +1 -1
  136. package/dist/core/paths.d.ts +48 -0
  137. package/dist/core/paths.d.ts.map +1 -0
  138. package/dist/core/paths.js +57 -0
  139. package/dist/core/paths.js.map +1 -0
  140. package/dist/core/types.d.ts +12 -1
  141. package/dist/core/types.d.ts.map +1 -1
  142. package/dist/cost/hooks/registry.d.ts +44 -0
  143. package/dist/cost/hooks/registry.d.ts.map +1 -0
  144. package/dist/cost/hooks/registry.js +66 -0
  145. package/dist/cost/hooks/registry.js.map +1 -0
  146. package/dist/cost/pin.d.ts +63 -0
  147. package/dist/cost/pin.d.ts.map +1 -0
  148. package/dist/cost/pin.js +95 -0
  149. package/dist/cost/pin.js.map +1 -0
  150. package/dist/cost/providers/claude-code.d.ts +9 -2
  151. package/dist/cost/providers/claude-code.d.ts.map +1 -1
  152. package/dist/cost/providers/claude-code.js +10 -5
  153. package/dist/cost/providers/claude-code.js.map +1 -1
  154. package/dist/cost/providers/codex.d.ts +107 -0
  155. package/dist/cost/providers/codex.d.ts.map +1 -0
  156. package/dist/cost/providers/codex.js +283 -0
  157. package/dist/cost/providers/codex.js.map +1 -0
  158. package/dist/cost/providers/index.d.ts.map +1 -1
  159. package/dist/cost/providers/index.js +6 -0
  160. package/dist/cost/providers/index.js.map +1 -1
  161. package/dist/cost/rates.d.ts.map +1 -1
  162. package/dist/cost/rates.js +14 -0
  163. package/dist/cost/rates.js.map +1 -1
  164. package/dist/cost/report.d.ts +23 -1
  165. package/dist/cost/report.d.ts.map +1 -1
  166. package/dist/cost/report.js +26 -5
  167. package/dist/cost/report.js.map +1 -1
  168. package/dist/cost/sessions.d.ts +10 -1
  169. package/dist/cost/sessions.d.ts.map +1 -1
  170. package/dist/cost/sessions.js +10 -2
  171. package/dist/cost/sessions.js.map +1 -1
  172. package/dist/cost/sync.d.ts.map +1 -1
  173. package/dist/cost/sync.js +190 -5
  174. package/dist/cost/sync.js.map +1 -1
  175. package/dist/doctor/migrations/compliance-pack-drift.d.ts +62 -0
  176. package/dist/doctor/migrations/compliance-pack-drift.d.ts.map +1 -0
  177. package/dist/doctor/migrations/compliance-pack-drift.js +255 -0
  178. package/dist/doctor/migrations/compliance-pack-drift.js.map +1 -0
  179. package/dist/doctor/migrations/index.d.ts.map +1 -1
  180. package/dist/doctor/migrations/index.js +11 -0
  181. package/dist/doctor/migrations/index.js.map +1 -1
  182. package/dist/doctor/migrations/legacy-cost-hooks.d.ts.map +1 -1
  183. package/dist/doctor/migrations/legacy-cost-hooks.js +7 -4
  184. package/dist/doctor/migrations/legacy-cost-hooks.js.map +1 -1
  185. package/dist/doctor/migrations/missing-cost-shim.d.ts.map +1 -1
  186. package/dist/doctor/migrations/missing-cost-shim.js +5 -4
  187. package/dist/doctor/migrations/missing-cost-shim.js.map +1 -1
  188. package/dist/doctor/migrations/outdated-cost-hooks.d.ts.map +1 -1
  189. package/dist/doctor/migrations/outdated-cost-hooks.js +7 -4
  190. package/dist/doctor/migrations/outdated-cost-hooks.js.map +1 -1
  191. package/dist/doctor/runner.js +14 -0
  192. package/dist/doctor/runner.js.map +1 -1
  193. package/dist/doctor/types.d.ts +35 -3
  194. package/dist/doctor/types.d.ts.map +1 -1
  195. package/dist/menu/roster.d.ts.map +1 -1
  196. package/dist/menu/roster.js +5 -0
  197. package/dist/menu/roster.js.map +1 -1
  198. package/dist/metrics/report.d.ts.map +1 -1
  199. package/dist/metrics/report.js +11 -2
  200. package/dist/metrics/report.js.map +1 -1
  201. package/dist/review/findings-parser.d.ts +92 -0
  202. package/dist/review/findings-parser.d.ts.map +1 -0
  203. package/dist/review/findings-parser.js +196 -0
  204. package/dist/review/findings-parser.js.map +1 -0
  205. package/dist/setup/setup-compute.d.ts +10 -15
  206. package/dist/setup/setup-compute.d.ts.map +1 -1
  207. package/dist/setup/setup-compute.js +39 -0
  208. package/dist/setup/setup-compute.js.map +1 -1
  209. package/package.json +2 -2
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Compliance pack validation.
3
+ *
4
+ * The whole pack is validated before any part of it is installed, and every
5
+ * problem is collected rather than the first one thrown. A pack with one
6
+ * malformed control installs nothing — a partially installed pack is worse than
7
+ * an absent one, because it looks like a working install.
8
+ *
9
+ * Absence is never a default. Every field named in the schema must be present, so
10
+ * an omitted `reviewed_by` cannot quietly read as "reviewed", and an omitted
11
+ * `kind` cannot quietly read as `checked-only`.
12
+ *
13
+ * Two bounds exist for one reason: **pack text becomes instructions an agent
14
+ * executes.** Control text is rendered into a review prompt, and a constraint
15
+ * layer is copied to disk and read on every phase. Both are bounded in length and
16
+ * both reject `{{` placeholder syntax, because placeholder resolution runs the
17
+ * guidance pass before the glossary pass deliberately — so a `{{glossary:...}}`
18
+ * inside a layer body would expand when inlined. Bounding the input closes that at
19
+ * the source rather than relying on the delivery mechanism to make it unreachable.
20
+ *
21
+ * Requirements: compliance-packs/AC-1, AC-2, AC-3, AC-4, AC-5, AC-7, AC-65, AC-105
22
+ */
23
+ import type { Pack } from './types.js';
24
+ /**
25
+ * Maximum characters in any single control prose field.
26
+ *
27
+ * Sized to hold a full regime clause and its fail condition comfortably while
28
+ * ruling out a smuggled instruction block. The shipped SOC 2 pack's longest field
29
+ * is well under half of this.
30
+ */
31
+ export declare const MAX_CONTROL_FIELD_CHARS = 1000;
32
+ /** Maximum characters across all of a pack's control text. */
33
+ export declare const MAX_PACK_CONTROL_CHARS = 40000;
34
+ /** Maximum characters in a single constraint-layer body. */
35
+ export declare const MAX_LAYER_BODY_CHARS = 20000;
36
+ /** Maximum characters across all of a pack's constraint-layer bodies. */
37
+ export declare const MAX_PACK_LAYER_CHARS = 60000;
38
+ /**
39
+ * The notice a pack with `reviewed_by: null` must carry in its constraint text.
40
+ *
41
+ * Matched case-insensitively as a substring, so a pack may word the surrounding
42
+ * sentence freely. Held in three places — here, the report generator, and a doctor
43
+ * check — because a notice that lives only in installed text can be edited away
44
+ * permanently, since a locally edited layer is preserved forever by design.
45
+ */
46
+ export declare const UNREVIEWED_NOTICE = "not been reviewed by a compliance practitioner";
47
+ /** The raw text of a pack, as read from disk by the resolver. */
48
+ export interface PackSources {
49
+ /** Pack directory name, which the metadata's `id` must match. */
50
+ id: string;
51
+ /** Contents of `pack.yaml`. */
52
+ packYaml: string;
53
+ /** Contents of `controls.yaml`. */
54
+ controlsYaml: string;
55
+ /** Layer file name → body, for every layer the pack registers. */
56
+ layerBodies: Map<string, string>;
57
+ }
58
+ /** Outcome of validating a pack. Every problem, not just the first. */
59
+ export type PackValidation = {
60
+ ok: true;
61
+ pack: Pack;
62
+ } | {
63
+ ok: false;
64
+ errors: string[];
65
+ };
66
+ /**
67
+ * Validate a whole pack from its raw sources.
68
+ *
69
+ * Pure: takes text, returns a verdict, touches no filesystem. The resolver does
70
+ * the reading and the containment checks; this decides whether the content is
71
+ * usable. Nothing is installed unless this returns `ok`.
72
+ */
73
+ export declare function validatePack(sources: PackSources): PackValidation;
74
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/compliance/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAKH,OAAO,KAAK,EAKV,IAAI,EAIL,MAAM,YAAY,CAAC;AAMpB;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAE5C,8DAA8D;AAC9D,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAE7C,4DAA4D;AAC5D,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAE3C,yEAAyE;AACzE,eAAO,MAAM,oBAAoB,QAAS,CAAC;AA6B3C;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,mDAAmD,CAAC;AAgUlF,iEAAiE;AACjE,MAAM,WAAW,WAAW;IAC1B,iEAAiE;IACjE,EAAE,EAAE,MAAM,CAAC;IACX,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,uEAAuE;AACvE,MAAM,MAAM,cAAc,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAExF;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAoHjE"}
@@ -0,0 +1,474 @@
1
+ /**
2
+ * Compliance pack validation.
3
+ *
4
+ * The whole pack is validated before any part of it is installed, and every
5
+ * problem is collected rather than the first one thrown. A pack with one
6
+ * malformed control installs nothing — a partially installed pack is worse than
7
+ * an absent one, because it looks like a working install.
8
+ *
9
+ * Absence is never a default. Every field named in the schema must be present, so
10
+ * an omitted `reviewed_by` cannot quietly read as "reviewed", and an omitted
11
+ * `kind` cannot quietly read as `checked-only`.
12
+ *
13
+ * Two bounds exist for one reason: **pack text becomes instructions an agent
14
+ * executes.** Control text is rendered into a review prompt, and a constraint
15
+ * layer is copied to disk and read on every phase. Both are bounded in length and
16
+ * both reject `{{` placeholder syntax, because placeholder resolution runs the
17
+ * guidance pass before the glossary pass deliberately — so a `{{glossary:...}}`
18
+ * inside a layer body would expand when inlined. Bounding the input closes that at
19
+ * the source rather than relying on the delivery mechanism to make it unreachable.
20
+ *
21
+ * Requirements: compliance-packs/AC-1, AC-2, AC-3, AC-4, AC-5, AC-7, AC-65, AC-105
22
+ */
23
+ import { parse as parseYaml } from 'yaml';
24
+ // ---------------------------------------------------------------------------
25
+ // Bounds and vocabularies
26
+ // ---------------------------------------------------------------------------
27
+ /**
28
+ * Maximum characters in any single control prose field.
29
+ *
30
+ * Sized to hold a full regime clause and its fail condition comfortably while
31
+ * ruling out a smuggled instruction block. The shipped SOC 2 pack's longest field
32
+ * is well under half of this.
33
+ */
34
+ export const MAX_CONTROL_FIELD_CHARS = 1000;
35
+ /** Maximum characters across all of a pack's control text. */
36
+ export const MAX_PACK_CONTROL_CHARS = 40_000;
37
+ /** Maximum characters in a single constraint-layer body. */
38
+ export const MAX_LAYER_BODY_CHARS = 20_000;
39
+ /** Maximum characters across all of a pack's constraint-layer bodies. */
40
+ export const MAX_PACK_LAYER_CHARS = 60_000;
41
+ /** Placeholder syntax, rejected anywhere in pack text. */
42
+ const PLACEHOLDER_RE = /\{\{/;
43
+ /** A fenced code block, rejected in control prose. */
44
+ const FENCE_RE = /(^|\n)\s*```/;
45
+ /** Pack and layer slugs: lowercase alphanumeric with interior hyphens. */
46
+ const SLUG_RE = /^[a-z][a-z0-9-]*$/;
47
+ /** A regime control id, e.g. `CC8.1`. Deliberately not regime-specific beyond shape. */
48
+ const CONTROL_ID_RE = /^[A-Z]{1,4}[0-9]+(\.[0-9]+)?$/;
49
+ const CONTROL_KINDS = ['evidenced', 'checked-only'];
50
+ const CHECK_KINDS = ['agent', 'mechanical'];
51
+ const SEVERITIES = ['critical', 'major', 'minor', 'info'];
52
+ const ENTITLEMENTS = ['unrestricted'];
53
+ const EXCLUSION_REASONS = ['organizational', 'not-yet-built'];
54
+ const PHASES = [
55
+ 'ideation',
56
+ 'requirements',
57
+ 'design',
58
+ 'implementation',
59
+ 'testing',
60
+ 'deployment',
61
+ 'maintenance',
62
+ ];
63
+ /**
64
+ * The notice a pack with `reviewed_by: null` must carry in its constraint text.
65
+ *
66
+ * Matched case-insensitively as a substring, so a pack may word the surrounding
67
+ * sentence freely. Held in three places — here, the report generator, and a doctor
68
+ * check — because a notice that lives only in installed text can be edited away
69
+ * permanently, since a locally edited layer is preserved forever by design.
70
+ */
71
+ export const UNREVIEWED_NOTICE = 'not been reviewed by a compliance practitioner';
72
+ // ---------------------------------------------------------------------------
73
+ // Small helpers
74
+ // ---------------------------------------------------------------------------
75
+ /** Accumulates problems so a pack is reported whole rather than first-error-only. */
76
+ class Problems {
77
+ list = [];
78
+ add(message) {
79
+ this.list.push(message);
80
+ }
81
+ /** Require a non-empty string at `where`. Returns it, or null having recorded why. */
82
+ str(value, where) {
83
+ if (typeof value !== 'string') {
84
+ this.add(`${where}: expected a string, got ${describe(value)}`);
85
+ return null;
86
+ }
87
+ if (value.trim() === '') {
88
+ this.add(`${where}: must not be empty`);
89
+ return null;
90
+ }
91
+ return value;
92
+ }
93
+ /**
94
+ * Require one of `allowed`.
95
+ *
96
+ * Reports the permitted values even when the field is absent or the wrong type.
97
+ * "expected a string, got nothing" tells a content author that something is
98
+ * missing but not what to write there, and the vocabulary is the whole point of
99
+ * an enumerated field.
100
+ */
101
+ oneOf(value, where, allowed) {
102
+ if (typeof value !== 'string' || value.trim() === '') {
103
+ this.add(`${where}: expected one of ${allowed.join(', ')}, got ${describe(value)}`);
104
+ return null;
105
+ }
106
+ if (!allowed.includes(value)) {
107
+ this.add(`${where}: expected one of ${allowed.join(', ')}, got '${value}'`);
108
+ return null;
109
+ }
110
+ return value;
111
+ }
112
+ /** Bound a prose field's length and reject smuggled syntax. */
113
+ prose(value, where, max, opts = {}) {
114
+ if (value.length > max) {
115
+ this.add(`${where}: ${value.length} characters exceeds the ${max}-character limit`);
116
+ }
117
+ if (PLACEHOLDER_RE.test(value)) {
118
+ this.add(`${where}: must not contain '{{' placeholder syntax`);
119
+ }
120
+ if (!opts.allowFences && FENCE_RE.test(value)) {
121
+ this.add(`${where}: must not contain a fenced code block`);
122
+ }
123
+ }
124
+ }
125
+ /** A short, safe description of an unexpected value — never its contents. */
126
+ function describe(value) {
127
+ if (value === null)
128
+ return 'null';
129
+ if (value === undefined)
130
+ return 'nothing';
131
+ if (Array.isArray(value))
132
+ return 'a list';
133
+ return typeof value;
134
+ }
135
+ /** Parse YAML, returning null rather than throwing. */
136
+ function parseObject(raw, where, problems) {
137
+ let parsed;
138
+ try {
139
+ parsed = parseYaml(raw);
140
+ }
141
+ catch (err) {
142
+ problems.add(`${where}: is not valid YAML (${err.message})`);
143
+ return null;
144
+ }
145
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
146
+ problems.add(`${where}: expected a mapping, got ${describe(parsed)}`);
147
+ return null;
148
+ }
149
+ return parsed;
150
+ }
151
+ // ---------------------------------------------------------------------------
152
+ // Field validators
153
+ // ---------------------------------------------------------------------------
154
+ /** Validate `pack.yaml`. `expectedId` is the directory name it must match. */
155
+ function validateMeta(raw, expectedId, problems) {
156
+ const where = 'pack.yaml';
157
+ // Every field is required. `reviewed_by` is checked separately because null is
158
+ // a legitimate value there and `str` would reject it.
159
+ const id = problems.str(raw.id, `${where}: id`);
160
+ const regime = problems.str(raw.regime, `${where}: regime`);
161
+ const version = problems.str(raw.version, `${where}: version`);
162
+ const entitlement = problems.oneOf(raw.entitlement, `${where}: entitlement`, ENTITLEMENTS);
163
+ if (id !== null && !SLUG_RE.test(id)) {
164
+ problems.add(`${where}: id '${id}' must be a lowercase slug`);
165
+ }
166
+ if (id !== null && id !== expectedId) {
167
+ problems.add(`${where}: id '${id}' does not match the pack directory '${expectedId}'`);
168
+ }
169
+ if (!Array.isArray(raw.industries)) {
170
+ problems.add(`${where}: industries: expected a list, got ${describe(raw.industries)}`);
171
+ }
172
+ else if (raw.industries.length === 0) {
173
+ problems.add(`${where}: industries: must name at least one industry, or ['any']`);
174
+ }
175
+ else {
176
+ for (const [i, value] of raw.industries.entries()) {
177
+ const s = problems.str(value, `${where}: industries[${i}]`);
178
+ if (s !== null && !SLUG_RE.test(s)) {
179
+ problems.add(`${where}: industries[${i}]: '${s}' must be a lowercase slug`);
180
+ }
181
+ }
182
+ }
183
+ // Absent is not null. An omitted field must not read as an unreviewed draft,
184
+ // and must not read as a reviewed one either.
185
+ if (!('reviewed_by' in raw)) {
186
+ problems.add(`${where}: reviewed_by: required — use null for an unreviewed draft`);
187
+ }
188
+ else if (raw.reviewed_by !== null && typeof raw.reviewed_by !== 'string') {
189
+ problems.add(`${where}: reviewed_by: expected a string or null, got ${describe(raw.reviewed_by)}`);
190
+ }
191
+ else if (typeof raw.reviewed_by === 'string' && raw.reviewed_by.trim() === '') {
192
+ problems.add(`${where}: reviewed_by: use null rather than an empty string`);
193
+ }
194
+ if (id === null || regime === null || version === null || entitlement === null)
195
+ return null;
196
+ if (!Array.isArray(raw.industries))
197
+ return null;
198
+ return {
199
+ id,
200
+ regime,
201
+ version,
202
+ industries: raw.industries.filter((v) => typeof v === 'string'),
203
+ entitlement,
204
+ reviewed_by: (raw.reviewed_by ?? null),
205
+ };
206
+ }
207
+ /** Validate one control entry. */
208
+ function validateControl(raw, index, problems) {
209
+ const where = `controls.yaml: controls[${index}]`;
210
+ if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {
211
+ problems.add(`${where}: expected a mapping, got ${describe(raw)}`);
212
+ return null;
213
+ }
214
+ const r = raw;
215
+ const id = problems.str(r.id, `${where}: id`);
216
+ const label = id === null ? where : `controls.yaml: control ${id}`;
217
+ if (id !== null && !CONTROL_ID_RE.test(id)) {
218
+ problems.add(`${label}: id '${id}' is not a control id (expected e.g. CC8.1)`);
219
+ }
220
+ const kind = problems.oneOf(r.kind, `${label}: kind`, CONTROL_KINDS);
221
+ const checkKind = problems.oneOf(r.check_kind, `${label}: check_kind`, CHECK_KINDS);
222
+ const severity = problems.oneOf(r.severity, `${label}: severity`, SEVERITIES);
223
+ const requires = problems.str(r.requires, `${label}: requires`);
224
+ const lookAt = problems.str(r.look_at, `${label}: look_at`);
225
+ const failsWhen = problems.str(r.fails_when, `${label}: fails_when`);
226
+ for (const [value, field] of [
227
+ [requires, 'requires'],
228
+ [lookAt, 'look_at'],
229
+ [failsWhen, 'fails_when'],
230
+ ]) {
231
+ if (value !== null)
232
+ problems.prose(value, `${label}: ${field}`, MAX_CONTROL_FIELD_CHARS);
233
+ }
234
+ if (!Array.isArray(r.phases)) {
235
+ problems.add(`${label}: phases: expected a list, got ${describe(r.phases)}`);
236
+ }
237
+ else if (r.phases.length === 0) {
238
+ problems.add(`${label}: phases: must name at least one lifecycle phase`);
239
+ }
240
+ else {
241
+ for (const [i, value] of r.phases.entries()) {
242
+ problems.oneOf(value, `${label}: phases[${i}]`, PHASES);
243
+ }
244
+ }
245
+ // The evidence rule, and the reason it is a rule: a checked-only control has no
246
+ // evidence, so letting it name an artifact is how a check becomes an attestation.
247
+ if (kind === 'evidenced') {
248
+ const artifact = problems.str(r.evidence_artifact, `${label}: evidence_artifact`);
249
+ if (artifact !== null) {
250
+ problems.prose(artifact, `${label}: evidence_artifact`, MAX_CONTROL_FIELD_CHARS);
251
+ }
252
+ }
253
+ else if (kind === 'checked-only' && r.evidence_artifact !== undefined) {
254
+ problems.add(`${label}: evidence_artifact is not allowed on a checked-only control — ` +
255
+ `the lifecycle trail evidences that the check ran, never that the control operates`);
256
+ }
257
+ // A mechanical control must carry something the check can actually apply.
258
+ if (checkKind === 'mechanical') {
259
+ const pattern = problems.str(r.pattern, `${label}: pattern`);
260
+ if (pattern !== null) {
261
+ try {
262
+ new RegExp(pattern);
263
+ }
264
+ catch (err) {
265
+ problems.add(`${label}: pattern is not a valid regular expression (${err.message})`);
266
+ }
267
+ }
268
+ }
269
+ else if (checkKind === 'agent' && r.pattern !== undefined) {
270
+ problems.add(`${label}: pattern is only meaningful on a mechanical control`);
271
+ }
272
+ if (r.references !== undefined) {
273
+ const references = problems.str(r.references, `${label}: references`);
274
+ if (references !== null) {
275
+ problems.prose(references, `${label}: references`, MAX_CONTROL_FIELD_CHARS);
276
+ }
277
+ }
278
+ if (id === null ||
279
+ kind === null ||
280
+ checkKind === null ||
281
+ severity === null ||
282
+ requires === null ||
283
+ lookAt === null ||
284
+ failsWhen === null ||
285
+ !Array.isArray(r.phases)) {
286
+ return null;
287
+ }
288
+ return {
289
+ id,
290
+ kind,
291
+ check_kind: checkKind,
292
+ phases: r.phases.filter((p) => PHASES.includes(p)),
293
+ requires,
294
+ look_at: lookAt,
295
+ fails_when: failsWhen,
296
+ severity,
297
+ ...(typeof r.pattern === 'string' && { pattern: r.pattern }),
298
+ ...(typeof r.evidence_artifact === 'string' && { evidence_artifact: r.evidence_artifact }),
299
+ ...(typeof r.references === 'string' && { references: r.references }),
300
+ };
301
+ }
302
+ /** Validate one exclusion entry. */
303
+ function validateExclusion(raw, index, problems) {
304
+ const where = `controls.yaml: excluded[${index}]`;
305
+ if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {
306
+ problems.add(`${where}: expected a mapping, got ${describe(raw)}`);
307
+ return null;
308
+ }
309
+ const r = raw;
310
+ const id = problems.str(r.id, `${where}: id`);
311
+ if (id !== null && !CONTROL_ID_RE.test(id)) {
312
+ problems.add(`${where}: id '${id}' is not a control id (expected e.g. CC1.1)`);
313
+ }
314
+ const reason = problems.oneOf(r.reason, `${where}: reason`, EXCLUSION_REASONS);
315
+ if (r.note !== undefined) {
316
+ const note = problems.str(r.note, `${where}: note`);
317
+ if (note !== null)
318
+ problems.prose(note, `${where}: note`, MAX_CONTROL_FIELD_CHARS);
319
+ }
320
+ if (id === null || reason === null)
321
+ return null;
322
+ return { id, reason, ...(typeof r.note === 'string' && { note: r.note }) };
323
+ }
324
+ /** Validate one layer registration from `pack.yaml`. */
325
+ function validateLayer(raw, index, problems) {
326
+ const where = `pack.yaml: layers[${index}]`;
327
+ if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {
328
+ problems.add(`${where}: expected a mapping, got ${describe(raw)}`);
329
+ return null;
330
+ }
331
+ const r = raw;
332
+ const name = problems.str(r.name, `${where}: name`);
333
+ const file = problems.str(r.file, `${where}: file`);
334
+ if (name !== null && !SLUG_RE.test(name)) {
335
+ problems.add(`${where}: name '${name}' must be a lowercase slug`);
336
+ }
337
+ // Containment is checked by the loader against real directories, using the one
338
+ // exported `isContainedRelative`. Here we only reject shapes that can never be
339
+ // valid, so a bad registration fails before any path is built from it.
340
+ //
341
+ // The rejected value is deliberately NOT echoed: it is untrusted data that may
342
+ // be an absolute path, and every message this module emits has to stay free of
343
+ // them (AC-7). The field label is enough to locate the problem.
344
+ const containable = file !== null && !file.startsWith('/') && !file.includes('..');
345
+ if (file !== null && !containable) {
346
+ problems.add(`${where}: file must be a relative name inside the pack, with no '..' segment`);
347
+ }
348
+ // Declared rather than inferred: pack layers are delivered by pointer whatever
349
+ // their size, so a small layer cannot be inlined into an emitted skill.
350
+ if (r.always_pointer !== true) {
351
+ problems.add(`${where}: always_pointer must be true — pack layers are never inlined`);
352
+ }
353
+ // An out-of-bounds registration yields no layer at all. Returning one anyway
354
+ // would carry the bad name into the body check, whose message names the file —
355
+ // which is how an absolute path reached an error message.
356
+ if (name === null || file === null || !containable)
357
+ return null;
358
+ return { name, file, always_pointer: true };
359
+ }
360
+ /**
361
+ * Validate a whole pack from its raw sources.
362
+ *
363
+ * Pure: takes text, returns a verdict, touches no filesystem. The resolver does
364
+ * the reading and the containment checks; this decides whether the content is
365
+ * usable. Nothing is installed unless this returns `ok`.
366
+ */
367
+ export function validatePack(sources) {
368
+ const problems = new Problems();
369
+ const metaRaw = parseObject(sources.packYaml, 'pack.yaml', problems);
370
+ const controlsRaw = parseObject(sources.controlsYaml, 'controls.yaml', problems);
371
+ const meta = metaRaw ? validateMeta(metaRaw, sources.id, problems) : null;
372
+ // Layers
373
+ const layers = [];
374
+ if (metaRaw) {
375
+ if (!Array.isArray(metaRaw.layers)) {
376
+ problems.add(`pack.yaml: layers: expected a list, got ${describe(metaRaw.layers)}`);
377
+ }
378
+ else if (metaRaw.layers.length === 0) {
379
+ problems.add('pack.yaml: layers: a pack must register at least one constraint layer');
380
+ }
381
+ else {
382
+ for (const [i, raw] of metaRaw.layers.entries()) {
383
+ const layer = validateLayer(raw, i, problems);
384
+ if (layer)
385
+ layers.push(layer);
386
+ }
387
+ }
388
+ }
389
+ // Controls
390
+ const controls = [];
391
+ const exclusions = [];
392
+ if (controlsRaw) {
393
+ if (!Array.isArray(controlsRaw.controls)) {
394
+ problems.add(`controls.yaml: controls: expected a list, got ${describe(controlsRaw.controls)}`);
395
+ }
396
+ else if (controlsRaw.controls.length === 0) {
397
+ problems.add('controls.yaml: controls: a pack must declare at least one control');
398
+ }
399
+ else {
400
+ for (const [i, raw] of controlsRaw.controls.entries()) {
401
+ const control = validateControl(raw, i, problems);
402
+ if (control)
403
+ controls.push(control);
404
+ }
405
+ }
406
+ if (!Array.isArray(controlsRaw.excluded)) {
407
+ problems.add(`controls.yaml: excluded: expected a list, got ${describe(controlsRaw.excluded)}`);
408
+ }
409
+ else {
410
+ for (const [i, raw] of controlsRaw.excluded.entries()) {
411
+ const exclusion = validateExclusion(raw, i, problems);
412
+ if (exclusion)
413
+ exclusions.push(exclusion);
414
+ }
415
+ }
416
+ }
417
+ // A control id must not be both covered and excluded — that is a claim and its
418
+ // retraction in one file, and whichever a reader trusts is a coin flip.
419
+ const controlIds = new Set(controls.map((c) => c.id));
420
+ for (const exclusion of exclusions) {
421
+ if (controlIds.has(exclusion.id)) {
422
+ problems.add(`controls.yaml: ${exclusion.id} is both covered and excluded`);
423
+ }
424
+ }
425
+ for (const [ids, label] of [
426
+ [controls.map((c) => c.id), 'controls'],
427
+ [exclusions.map((e) => e.id), 'excluded'],
428
+ ]) {
429
+ const seen = new Set();
430
+ for (const id of ids) {
431
+ if (seen.has(id))
432
+ problems.add(`controls.yaml: ${label}: ${id} appears more than once`);
433
+ seen.add(id);
434
+ }
435
+ }
436
+ // Layer bodies: bounded, placeholder-free, and — when the pack is an unreviewed
437
+ // draft — carrying the notice. Fenced blocks are allowed in a layer body, which
438
+ // is prose an agent reads, but placeholders are not.
439
+ let totalLayerChars = 0;
440
+ let noticeFound = false;
441
+ for (const layer of layers) {
442
+ const body = sources.layerBodies.get(layer.file);
443
+ if (body === undefined) {
444
+ problems.add(`pack.yaml: layer '${layer.name}' registers ${layer.file}, which is missing`);
445
+ continue;
446
+ }
447
+ totalLayerChars += body.length;
448
+ problems.prose(body, `${layer.file}`, MAX_LAYER_BODY_CHARS, { allowFences: true });
449
+ if (body.toLowerCase().includes(UNREVIEWED_NOTICE))
450
+ noticeFound = true;
451
+ }
452
+ if (totalLayerChars > MAX_PACK_LAYER_CHARS) {
453
+ problems.add(`pack layer bodies total ${totalLayerChars} characters, exceeding the ${MAX_PACK_LAYER_CHARS}-character limit`);
454
+ }
455
+ const totalControlChars = controls.reduce((sum, c) => sum + c.requires.length + c.look_at.length + c.fails_when.length, 0);
456
+ if (totalControlChars > MAX_PACK_CONTROL_CHARS) {
457
+ problems.add(`pack control text totals ${totalControlChars} characters, exceeding the ${MAX_PACK_CONTROL_CHARS}-character limit`);
458
+ }
459
+ // The first of the notice's three enforcement points. The other two are the
460
+ // report generator, which emits it from code, and a doctor check for the case
461
+ // where someone edits it out of an installed layer.
462
+ if (meta && meta.reviewed_by === null && layers.length > 0 && !noticeFound) {
463
+ problems.add(`pack.yaml: reviewed_by is null, so a constraint layer must state that the control text has ` +
464
+ `'${UNREVIEWED_NOTICE}'`);
465
+ }
466
+ if (problems.list.length > 0 || meta === null) {
467
+ return {
468
+ ok: false,
469
+ errors: problems.list.length > 0 ? problems.list : ['pack.yaml: could not be validated'],
470
+ };
471
+ }
472
+ return { ok: true, pack: { meta, controls, exclusions, layers } };
473
+ }
474
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/compliance/schema.ts"],"names":[],"mappings":"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"}