@aicqtools/provenance 1.0.0-beta.1 → 1.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -2,8 +2,8 @@ export type { AiTool, AiSession, AiPromptRecord, CodeAttribution, ProvenanceReco
2
2
  export { emitAiBom } from './ai-bom/index.js';
3
3
  export { capture, getStagedFiles, getStagedHunks, getCurrentCommitSha, readActiveSessions, findClosestSession, writeProvenanceRecord, buildRecord, } from './git-hook/index.js';
4
4
  export type { CaptureContext, CaptureResult, StagedHunk, } from './git-hook/index.js';
5
- export { buildArticle50Report, renderArticle50Html, renderArticle50Pdf, } from './reporter/index.js';
6
- export type { Article50Report, RenderHtmlOptions, RenderPdfOptions, } from './reporter/index.js';
5
+ export { buildArticle50Report, summarizeGuardrail, renderArticle50Html, renderArticle50Pdf, } from './reporter/index.js';
6
+ export type { Article50Report, BuildArticle50Options, GuardrailSummary, RenderHtmlOptions, RenderPdfOptions, } from './reporter/index.js';
7
7
  export { ManualSessionReader, ClaudeCodeSessionReader, CursorSessionReader, CompositeSessionReader, createReader, encodeClaudeProjectId, getCursorWorkspaceStorageDir, } from './session-readers/index.js';
8
8
  export type { SessionReader, SessionReaderResult, ClaudeCodeReaderOptions, CursorReaderOptions, ReaderName, } from './session-readers/index.js';
9
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,MAAM,EACN,SAAS,EACT,cAAc,EACd,eAAe,EACf,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EACL,OAAO,EACP,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,cAAc,EACd,aAAa,EACb,UAAU,GACX,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,sBAAsB,EACtB,YAAY,EACZ,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACV,aAAa,EACb,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,UAAU,GACX,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,MAAM,EACN,SAAS,EACT,cAAc,EACd,eAAe,EACf,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EACL,OAAO,EACP,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,cAAc,EACd,aAAa,EACb,UAAU,GACX,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,eAAe,EACf,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,sBAAsB,EACtB,YAAY,EACZ,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACV,aAAa,EACb,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,UAAU,GACX,MAAM,4BAA4B,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  export { emitAiBom } from './ai-bom/index.js';
2
2
  export { capture, getStagedFiles, getStagedHunks, getCurrentCommitSha, readActiveSessions, findClosestSession, writeProvenanceRecord, buildRecord, } from './git-hook/index.js';
3
- export { buildArticle50Report, renderArticle50Html, renderArticle50Pdf, } from './reporter/index.js';
3
+ export { buildArticle50Report, summarizeGuardrail, renderArticle50Html, renderArticle50Pdf, } from './reporter/index.js';
4
4
  export { ManualSessionReader, ClaudeCodeSessionReader, CursorSessionReader, CompositeSessionReader, createReader, encodeClaudeProjectId, getCursorWorkspaceStorageDir, } from './session-readers/index.js';
5
5
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EACL,OAAO,EACP,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,sBAAsB,EACtB,YAAY,EACZ,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EACL,OAAO,EACP,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAQ7B,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,sBAAsB,EACtB,YAAY,EACZ,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,4BAA4B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"article-50-html.d.ts","sourceRoot":"","sources":["../../src/reporter/article-50-html.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CAC/B;AA4CD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,GAAE,iBAAsB,GAAG,MAAM,CA4GjG"}
1
+ {"version":3,"file":"article-50-html.d.ts","sourceRoot":"","sources":["../../src/reporter/article-50-html.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAoB,MAAM,iBAAiB,CAAC;AAEzE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CAC/B;AA+ID,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,GAAE,iBAAsB,GAAG,MAAM,CAiHjG"}
@@ -12,6 +12,18 @@ const messages = {
12
12
  attributedFiles: '출처 명시 파일',
13
13
  none: '(없음)',
14
14
  notAvailable: '미상',
15
+ guardrailSummary: '가드레일 위반 요약',
16
+ noViolations: '(검출된 위반 없음)',
17
+ totalViolations: '총 위반',
18
+ filesWithViolations: '위반 포함 파일',
19
+ severityBreakdown: '심각도 분포',
20
+ categoryBreakdown: '룰 카테고리 분포',
21
+ severityError: '오류',
22
+ severityWarning: '경고',
23
+ severityInfo: '정보',
24
+ severity: '심각도',
25
+ ruleId: '룰 ID',
26
+ count: '개수',
15
27
  footer: 'aicqtools provenance · MIT License · https://github.com/aicqtools/aicqtools',
16
28
  },
17
29
  en: {
@@ -27,6 +39,18 @@ const messages = {
27
39
  attributedFiles: 'Attributed Files',
28
40
  none: '(none)',
29
41
  notAvailable: 'n/a',
42
+ guardrailSummary: 'Guardrail violations summary',
43
+ noViolations: '(no violations detected)',
44
+ totalViolations: 'Total violations',
45
+ filesWithViolations: 'Files with violations',
46
+ severityBreakdown: 'Severity breakdown',
47
+ categoryBreakdown: 'Rule category breakdown',
48
+ severityError: 'Error',
49
+ severityWarning: 'Warning',
50
+ severityInfo: 'Info',
51
+ severity: 'Severity',
52
+ ruleId: 'Rule ID',
53
+ count: 'Count',
30
54
  footer: 'aicqtools provenance · MIT License · https://github.com/aicqtools/aicqtools',
31
55
  },
32
56
  };
@@ -38,6 +62,70 @@ function escapeHtml(s) {
38
62
  .replace(/"/g, '"')
39
63
  .replace(/'/g, ''');
40
64
  }
65
+ function renderGuardrailSection(summary, m) {
66
+ // No violations: keep the section but show a friendly empty state.
67
+ if (summary.totalViolations === 0) {
68
+ return `
69
+ <section>
70
+ <h2>${m.guardrailSummary}</h2>
71
+ <p class="empty">${m.noViolations}</p>
72
+ </section>
73
+ `;
74
+ }
75
+ const severityLabel = {
76
+ error: m.severityError,
77
+ warning: m.severityWarning,
78
+ info: m.severityInfo,
79
+ };
80
+ // Severity rows in fixed order: error → warning → info (stable for diff-friendly fixtures).
81
+ const severityRows = ['error', 'warning', 'info']
82
+ .map((sev) => `<tr>
83
+ <td>${severityLabel[sev]}</td>
84
+ <td class="num">${summary.severityCount[sev]}</td>
85
+ </tr>`)
86
+ .join('\n');
87
+ // Category rows sorted by count desc, then ruleId asc — stable & readable.
88
+ const categoryRows = Object.entries(summary.categoryCount)
89
+ .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))
90
+ .map(([ruleId, count]) => `<tr>
91
+ <td><code>${escapeHtml(ruleId)}</code></td>
92
+ <td class="num">${count}</td>
93
+ </tr>`)
94
+ .join('\n');
95
+ return `
96
+ <section>
97
+ <h2>${m.guardrailSummary}</h2>
98
+ <dl class="meta">
99
+ <dt>${m.totalViolations}</dt><dd>${summary.totalViolations}</dd>
100
+ <dt>${m.filesWithViolations}</dt><dd>${summary.filesWithViolations}</dd>
101
+ </dl>
102
+ <h3>${m.severityBreakdown}</h3>
103
+ <table>
104
+ <thead>
105
+ <tr>
106
+ <th>${m.severity}</th>
107
+ <th class="num">${m.count}</th>
108
+ </tr>
109
+ </thead>
110
+ <tbody>
111
+ ${severityRows}
112
+ </tbody>
113
+ </table>
114
+ <h3>${m.categoryBreakdown}</h3>
115
+ <table>
116
+ <thead>
117
+ <tr>
118
+ <th>${m.ruleId}</th>
119
+ <th class="num">${m.count}</th>
120
+ </tr>
121
+ </thead>
122
+ <tbody>
123
+ ${categoryRows}
124
+ </tbody>
125
+ </table>
126
+ </section>
127
+ `;
128
+ }
41
129
  export function renderArticle50Html(report, opts = {}) {
42
130
  const locale = opts.locale ?? 'en';
43
131
  const m = messages[locale];
@@ -54,6 +142,9 @@ export function renderArticle50Html(report, opts = {}) {
54
142
  const fileItems = report.attributedFiles.length === 0
55
143
  ? `<li class="empty">${m.none}</li>`
56
144
  : report.attributedFiles.map((f) => `<li><code>${escapeHtml(f)}</code></li>`).join('\n');
145
+ const guardrailSection = report.guardrailSummary
146
+ ? renderGuardrailSection(report.guardrailSummary, m)
147
+ : '';
57
148
  return `<!DOCTYPE html>
58
149
  <html lang="${locale}">
59
150
  <head>
@@ -84,6 +175,7 @@ export function renderArticle50Html(report, opts = {}) {
84
175
  .meta dt { color: var(--muted); }
85
176
  .meta dd { margin: 0; font-family: ui-monospace, SFMono-Regular, Consolas, monospace; }
86
177
  h2 { font-size: 1.25rem; margin-top: 2rem; padding-bottom: 0.25rem; border-bottom: 1px solid var(--border); }
178
+ h3 { font-size: 1rem; margin-top: 1.25rem; margin-bottom: 0.25rem; color: var(--muted); font-weight: 600; }
87
179
  table { width: 100%; border-collapse: collapse; margin-top: 0.5rem; }
88
180
  th, td { padding: 0.5rem 0.75rem; text-align: left; border-bottom: 1px solid var(--border); }
89
181
  th { background: var(--bg-alt); font-weight: 600; }
@@ -134,7 +226,7 @@ ${systemsRows}
134
226
  ${fileItems}
135
227
  </ul>
136
228
  </section>
137
-
229
+ ${guardrailSection}
138
230
  <footer>${m.footer}</footer>
139
231
  </body>
140
232
  </html>
@@ -1 +1 @@
1
- {"version":3,"file":"article-50-html.js","sourceRoot":"","sources":["../../src/reporter/article-50-html.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"article-50-html.js","sourceRoot":"","sources":["../../src/reporter/article-50-html.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { CheckResult, Severity } from '@aicqtools/core';
1
2
  import type { ProvenanceRecord } from '../types.js';
2
3
  /**
3
4
  * EU AI Act Article 50 compliance report (skeleton).
@@ -10,6 +11,12 @@ import type { ProvenanceRecord } from '../types.js';
10
11
  *
11
12
  * Phase 1a will produce both JSON (machine-readable) and PDF (auditor-friendly).
12
13
  */
14
+ export interface GuardrailSummary {
15
+ readonly severityCount: Readonly<Record<Severity, number>>;
16
+ readonly categoryCount: Readonly<Record<string, number>>;
17
+ readonly filesWithViolations: number;
18
+ readonly totalViolations: number;
19
+ }
13
20
  export interface Article50Report {
14
21
  readonly format: 'aicq-article50/0.1';
15
22
  readonly generatedAt: string;
@@ -20,6 +27,11 @@ export interface Article50Report {
20
27
  readonly sessionCount: number;
21
28
  }>;
22
29
  readonly attributedFiles: readonly string[];
30
+ readonly guardrailSummary?: GuardrailSummary;
31
+ }
32
+ export interface BuildArticle50Options {
33
+ readonly guardrail?: CheckResult;
23
34
  }
24
- export declare function buildArticle50Report(record: ProvenanceRecord): Article50Report;
35
+ export declare function summarizeGuardrail(result: CheckResult): GuardrailSummary;
36
+ export declare function buildArticle50Report(record: ProvenanceRecord, options?: BuildArticle50Options): Article50Report;
25
37
  //# sourceMappingURL=article-50.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"article-50.d.ts","sourceRoot":"","sources":["../../src/reporter/article-50.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;QAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QACrC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;KAC/B,CAAC,CAAC;IACH,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7C;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,eAAe,CA0B9E"}
1
+ {"version":3,"file":"article-50.d.ts","sourceRoot":"","sources":["../../src/reporter/article-50.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACzD,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;QAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QACrC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;KAC/B,CAAC,CAAC;IACH,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CAC9C;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC;CAClC;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,gBAAgB,CAiBxE;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,gBAAgB,EACxB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,eAAe,CA8BjB"}
@@ -1,4 +1,20 @@
1
- export function buildArticle50Report(record) {
1
+ export function summarizeGuardrail(result) {
2
+ const severityCount = { error: 0, warning: 0, info: 0 };
3
+ const categoryCount = {};
4
+ const filesWithViolations = new Set();
5
+ for (const d of result.diagnostics) {
6
+ severityCount[d.severity] = (severityCount[d.severity] ?? 0) + 1;
7
+ categoryCount[d.ruleId] = (categoryCount[d.ruleId] ?? 0) + 1;
8
+ filesWithViolations.add(d.file);
9
+ }
10
+ return {
11
+ severityCount,
12
+ categoryCount,
13
+ filesWithViolations: filesWithViolations.size,
14
+ totalViolations: result.diagnostics.length,
15
+ };
16
+ }
17
+ export function buildArticle50Report(record, options) {
2
18
  const systems = new Map();
3
19
  for (const s of record.sessions) {
4
20
  const key = `${s.tool}|${s.model}|${s.modelVersion ?? ''}`;
@@ -14,7 +30,7 @@ export function buildArticle50Report(record) {
14
30
  });
15
31
  }
16
32
  const files = new Set(record.attributions.map((a) => a.filePath));
17
- return {
33
+ const base = {
18
34
  format: 'aicq-article50/0.1',
19
35
  generatedAt: new Date().toISOString(),
20
36
  aiSystems: [...systems.values()].map((s) => ({
@@ -25,5 +41,9 @@ export function buildArticle50Report(record) {
25
41
  })),
26
42
  attributedFiles: [...files],
27
43
  };
44
+ if (options?.guardrail) {
45
+ return { ...base, guardrailSummary: summarizeGuardrail(options.guardrail) };
46
+ }
47
+ return base;
28
48
  }
29
49
  //# sourceMappingURL=article-50.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"article-50.js","sourceRoot":"","sources":["../../src/reporter/article-50.ts"],"names":[],"mappings":"AA0BA,MAAM,UAAU,oBAAoB,CAAC,MAAwB;IAC3D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuF,CAAC;IAC/G,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC;QAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,QAAQ;YAAE,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC;;YAEhC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE;gBACf,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,YAAY,EAAE,CAAC,CAAC,YAAY,IAAI,IAAI;gBACpC,KAAK,EAAE,CAAC;aACT,CAAC,CAAC;IACP,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClE,OAAO;QACL,MAAM,EAAE,oBAAoB;QAC5B,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,SAAS,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3C,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,YAAY,EAAE,CAAC,CAAC,KAAK;SACtB,CAAC,CAAC;QACH,eAAe,EAAE,CAAC,GAAG,KAAK,CAAC;KAC5B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"article-50.js","sourceRoot":"","sources":["../../src/reporter/article-50.ts"],"names":[],"mappings":"AAuCA,MAAM,UAAU,kBAAkB,CAAC,MAAmB;IACpD,MAAM,aAAa,GAA6B,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAClF,MAAM,aAAa,GAA2B,EAAE,CAAC;IACjD,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAU,CAAC;IAE9C,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACnC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACjE,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC7D,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,OAAO;QACL,aAAa;QACb,aAAa;QACb,mBAAmB,EAAE,mBAAmB,CAAC,IAAI;QAC7C,eAAe,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM;KAC3C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,MAAwB,EACxB,OAA+B;IAE/B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuF,CAAC;IAC/G,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC;QAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,QAAQ;YAAE,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC;;YAEhC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE;gBACf,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,YAAY,EAAE,CAAC,CAAC,YAAY,IAAI,IAAI;gBACpC,KAAK,EAAE,CAAC;aACT,CAAC,CAAC;IACP,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClE,MAAM,IAAI,GAAoB;QAC5B,MAAM,EAAE,oBAAoB;QAC5B,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,SAAS,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3C,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,YAAY,EAAE,CAAC,CAAC,KAAK;SACtB,CAAC,CAAC;QACH,eAAe,EAAE,CAAC,GAAG,KAAK,CAAC;KAC5B,CAAC;IACF,IAAI,OAAO,EAAE,SAAS,EAAE,CAAC;QACvB,OAAO,EAAE,GAAG,IAAI,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;IAC9E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1,5 +1,5 @@
1
- export { buildArticle50Report } from './article-50.js';
2
- export type { Article50Report } from './article-50.js';
1
+ export { buildArticle50Report, summarizeGuardrail } from './article-50.js';
2
+ export type { Article50Report, GuardrailSummary, BuildArticle50Options } from './article-50.js';
3
3
  export { renderArticle50Html } from './article-50-html.js';
4
4
  export type { RenderHtmlOptions } from './article-50-html.js';
5
5
  export { renderArticle50Pdf, loadPuppeteer } from './article-50-pdf.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reporter/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACxE,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reporter/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAChG,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACxE,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -1,4 +1,4 @@
1
- export { buildArticle50Report } from './article-50.js';
1
+ export { buildArticle50Report, summarizeGuardrail } from './article-50.js';
2
2
  export { renderArticle50Html } from './article-50-html.js';
3
3
  export { renderArticle50Pdf, loadPuppeteer } from './article-50-pdf.js';
4
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reporter/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reporter/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aicqtools/provenance",
3
- "version": "1.0.0-beta.1",
3
+ "version": "1.0.0-beta.2",
4
4
  "type": "module",
5
5
  "description": "AI code provenance tracker — Git pre-commit capture, CycloneDX 1.6 AI-BOM emitter, EU AI Act Article 50 reporter.",
6
6
  "keywords": [
@@ -38,7 +38,7 @@
38
38
  },
39
39
  "dependencies": {
40
40
  "better-sqlite3": "^11.7.0",
41
- "@aicqtools/core": "1.0.0-beta.1"
41
+ "@aicqtools/core": "1.0.0-beta.2"
42
42
  },
43
43
  "peerDependencies": {
44
44
  "puppeteer": ">=22.0.0"