@ai-dossier/core 1.0.2 → 1.1.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 (33) hide show
  1. package/README.md +192 -18
  2. package/dist/formatter/formatter.d.ts.map +1 -1
  3. package/dist/formatter/formatter.js +2 -0
  4. package/dist/formatter/formatter.js.map +1 -1
  5. package/dist/index.d.ts +3 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +13 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/linter/rules/external-references-declared.d.ts +3 -0
  10. package/dist/linter/rules/external-references-declared.d.ts.map +1 -0
  11. package/dist/linter/rules/external-references-declared.js +48 -0
  12. package/dist/linter/rules/external-references-declared.js.map +1 -0
  13. package/dist/linter/rules/index.d.ts +2 -1
  14. package/dist/linter/rules/index.d.ts.map +1 -1
  15. package/dist/linter/rules/index.js +4 -1
  16. package/dist/linter/rules/index.js.map +1 -1
  17. package/dist/linter/rules/risk-level-consistency.d.ts.map +1 -1
  18. package/dist/linter/rules/risk-level-consistency.js +12 -2
  19. package/dist/linter/rules/risk-level-consistency.js.map +1 -1
  20. package/dist/linter/rules/tools-check-command.d.ts.map +1 -1
  21. package/dist/linter/rules/tools-check-command.js.map +1 -1
  22. package/dist/risk-assessment.d.ts +29 -0
  23. package/dist/risk-assessment.d.ts.map +1 -0
  24. package/dist/risk-assessment.js +83 -0
  25. package/dist/risk-assessment.js.map +1 -0
  26. package/dist/schema/dossier-schema.json +47 -0
  27. package/dist/types.d.ts +25 -0
  28. package/dist/types.d.ts.map +1 -1
  29. package/dist/utils/url-scanner.d.ts +8 -0
  30. package/dist/utils/url-scanner.d.ts.map +1 -0
  31. package/dist/utils/url-scanner.js +73 -0
  32. package/dist/utils/url-scanner.js.map +1 -0
  33. package/package.json +1 -1
package/README.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # @ai-dossier/core
2
2
 
3
+ [![npm version](https://img.shields.io/npm/v/@ai-dossier/core)](https://www.npmjs.com/package/@ai-dossier/core)
4
+ [![npm downloads](https://img.shields.io/npm/dm/@ai-dossier/core)](https://www.npmjs.com/package/@ai-dossier/core)
5
+ [![License: AGPL-3.0](https://img.shields.io/badge/License-AGPL--3.0-blue.svg)](https://github.com/imboard-ai/ai-dossier/blob/main/LICENSE)
6
+
3
7
  Core parsing, verification, and linting logic for the [Dossier](https://github.com/imboard-ai/ai-dossier) automation standard.
4
8
 
5
9
  ## Installation
@@ -8,65 +12,235 @@ Core parsing, verification, and linting logic for the [Dossier](https://github.c
8
12
  npm install @ai-dossier/core
9
13
  ```
10
14
 
15
+ Requires Node.js >= 20.0.0.
16
+
17
+ ## Quick Start
18
+
19
+ ```typescript
20
+ import {
21
+ parseDossierContent,
22
+ verifyIntegrity,
23
+ lintDossier,
24
+ } from '@ai-dossier/core';
25
+
26
+ // 1. Parse a dossier
27
+ const dossier = parseDossierContent(rawContent);
28
+ console.log(dossier.frontmatter.title); // => "My Dossier"
29
+
30
+ // 2. Verify integrity
31
+ const integrity = verifyIntegrity(
32
+ dossier.body,
33
+ dossier.frontmatter.checksum?.hash
34
+ );
35
+ console.log(integrity.status); // => "valid" | "invalid" | "missing"
36
+
37
+ // 3. Lint for issues
38
+ const result = lintDossier(rawContent);
39
+ console.log(result.errorCount, result.warningCount);
40
+ ```
41
+
11
42
  ## API
12
43
 
13
44
  ### Parsing
14
45
 
15
46
  ```typescript
16
- import { parseDossierContent, parseDossierFile, validateFrontmatter } from '@ai-dossier/core';
47
+ import {
48
+ parseDossierContent,
49
+ parseDossierFile,
50
+ validateFrontmatter,
51
+ } from '@ai-dossier/core';
52
+ ```
53
+
54
+ #### `parseDossierContent(content: string): ParsedDossier`
55
+
56
+ Parse a dossier content string into frontmatter and body. Accepts both `---dossier` (JSON/YAML) and standard `---` (YAML) delimiters.
57
+
58
+ ```typescript
59
+ const { frontmatter, body, raw } = parseDossierContent(content);
60
+ ```
61
+
62
+ #### `parseDossierFile(filePath: string): ParsedDossier`
63
+
64
+ Read and parse a dossier file from disk.
65
+
66
+ ```typescript
67
+ const parsed = parseDossierFile('./path/to/dossier.ds.md');
68
+ ```
17
69
 
18
- // Parse dossier content string
19
- const { frontmatter, body } = parseDossierContent(content);
70
+ #### `validateFrontmatter(frontmatter: DossierFrontmatter): string[]`
20
71
 
21
- // Parse from file path
22
- const parsed = parseDossierFile('./my-dossier.ds.md');
72
+ Validate required fields and enum values. Returns an array of error messages (empty if valid).
23
73
 
24
- // Validate required fields
74
+ ```typescript
25
75
  const errors = validateFrontmatter(parsed.frontmatter);
76
+ if (errors.length > 0) {
77
+ console.error('Validation errors:', errors);
78
+ }
26
79
  ```
27
80
 
28
81
  ### Checksum Verification
29
82
 
30
83
  ```typescript
31
84
  import { calculateChecksum, verifyIntegrity } from '@ai-dossier/core';
85
+ ```
86
+
87
+ #### `calculateChecksum(body: string): string`
88
+
89
+ Calculate the SHA-256 hash of dossier body content (excluding frontmatter).
32
90
 
33
- const hash = calculateChecksum(body);
34
- const isValid = verifyIntegrity(body, expectedHash);
91
+ #### `verifyIntegrity(body: string, expectedHash: string | undefined): IntegrityResult`
92
+
93
+ Compare the computed hash against the expected hash from frontmatter.
94
+
95
+ ```typescript
96
+ const result = verifyIntegrity(body, frontmatter.checksum?.hash);
97
+ // result.status: "valid" | "invalid" | "missing"
35
98
  ```
36
99
 
37
100
  ### Signature Verification
38
101
 
39
102
  ```typescript
40
- import { verifySignature, verifyWithEd25519, loadTrustedKeys } from '@ai-dossier/core';
103
+ import {
104
+ verifySignature,
105
+ verifyWithEd25519,
106
+ verifyWithKms,
107
+ loadTrustedKeys,
108
+ } from '@ai-dossier/core';
109
+ ```
41
110
 
42
- // Verify using trusted keys
43
- const result = await verifySignature(frontmatter, body);
111
+ #### `verifySignature(content: string, signature: SignatureResult): Promise<VerifyResult>`
44
112
 
45
- // Verify with a specific Ed25519 public key
46
- const valid = verifyWithEd25519(data, signature, publicKeyPem);
113
+ Verify a signature using the verifier registry. Automatically selects the correct verifier based on `signature.algorithm`.
114
+
115
+ ```typescript
116
+ const result = await verifySignature(body, frontmatter.signature);
117
+ console.log(result.valid); // true | false
47
118
  ```
48
119
 
120
+ #### `verifyWithEd25519(content: string, signature: string, publicKey: string): VerifyResult`
121
+
122
+ Verify an Ed25519 signature directly.
123
+
124
+ #### `verifyWithKms(content: string, signature: string, keyId: string, region?: string): Promise<VerifyResult>`
125
+
126
+ Verify an ECDSA-SHA-256 signature using AWS KMS.
127
+
128
+ #### `loadTrustedKeys(filePath?: string): Map<string, string>`
129
+
130
+ Load trusted public keys from a file (default: `~/.dossier/trusted-keys.txt`). Returns a map of public key to key ID.
131
+
49
132
  ### Linting
50
133
 
51
134
  ```typescript
52
135
  import { lintDossier, lintDossierFile } from '@ai-dossier/core';
136
+ ```
137
+
138
+ #### `lintDossier(content: string, config?: LintConfig): LintResult`
53
139
 
54
- const results = lintDossier(content);
55
- // or
56
- const results = lintDossierFile('./my-dossier.ds.md');
140
+ Lint dossier content against built-in rules (checksum validity, schema validation, required sections, semver version, etc.).
141
+
142
+ ```typescript
143
+ const result = lintDossier(content);
144
+ for (const d of result.diagnostics) {
145
+ console.log(`[${d.severity}] ${d.ruleId}: ${d.message}`);
146
+ }
57
147
  ```
58
148
 
149
+ #### `lintDossierFile(filePath: string, config?: LintConfig): LintResult`
150
+
151
+ Lint a dossier file from disk.
152
+
59
153
  ### Formatting
60
154
 
61
155
  ```typescript
62
- import { formatDossierContent } from '@ai-dossier/core';
156
+ import { formatDossierContent, formatDossierFile } from '@ai-dossier/core';
157
+ ```
158
+
159
+ #### `formatDossierContent(content: string, options?: Partial<FormatOptions>): FormatResult`
63
160
 
64
- const { content, changed } = formatDossierContent(rawContent, {
161
+ Format dossier content (sort keys, update checksum). Returns `{ formatted, changed }`.
162
+
163
+ ```typescript
164
+ const { formatted, changed } = formatDossierContent(rawContent, {
65
165
  sortKeys: true,
66
166
  updateChecksum: true,
67
167
  });
68
168
  ```
69
169
 
170
+ #### `formatDossierFile(filePath: string, options?: Partial<FormatOptions>): FormatResult`
171
+
172
+ Format a dossier file in place. Only writes if changes were made.
173
+
174
+ ### Signer/Verifier Interfaces
175
+
176
+ The package exports extensible interfaces for signing and verification:
177
+
178
+ ```typescript
179
+ import type { Signer, Verifier, SignatureResult, VerifyResult } from '@ai-dossier/core';
180
+ ```
181
+
182
+ Built-in implementations:
183
+ - `Ed25519Signer` / `Ed25519Verifier` — Ed25519 key pair signing
184
+ - `KmsSigner` / `KmsVerifier` — AWS KMS ECDSA-SHA-256 signing
185
+
186
+ Registry for algorithm dispatch:
187
+ ```typescript
188
+ import { getVerifierRegistry, VerifierRegistry } from '@ai-dossier/core';
189
+
190
+ const registry = getVerifierRegistry();
191
+ const verifier = registry.get('ed25519');
192
+ const result = await verifier.verify(content, signature);
193
+ ```
194
+
195
+ ## Types
196
+
197
+ All TypeScript types are exported from the package root:
198
+
199
+ ```typescript
200
+ import type {
201
+ // Core types
202
+ DossierFrontmatter, // Frontmatter fields (title, version, checksum, signature, ...)
203
+ ParsedDossier, // { frontmatter, body, raw }
204
+ DossierStatus, // "Draft" | "Stable" | "Deprecated" | "Experimental"
205
+ DossierListItem, // Summary for listing dossiers
206
+
207
+ // Verification
208
+ IntegrityResult, // Checksum verification result
209
+ AuthenticityResult, // Signature verification result
210
+ RiskAssessment, // Risk level, factors, destructive ops
211
+ VerificationResult, // Combined verification report
212
+ TrustedKey, // { publicKey, keyId }
213
+
214
+ // Signing
215
+ Signer, // Sign interface
216
+ Verifier, // Verify interface
217
+ SignatureResult, // Signature metadata
218
+ VerifyResult, // { valid, error? }
219
+ VerifierRegistry, // Algorithm → verifier dispatch
220
+
221
+ // Linting
222
+ LintResult, // { diagnostics, errorCount, warningCount, infoCount }
223
+ LintDiagnostic, // { ruleId, severity, message, field? }
224
+ LintRule, // Custom rule interface
225
+ LintConfig, // { rules: Record<string, severity> }
226
+ LintSeverity, // "error" | "warning" | "info"
227
+
228
+ // Formatting
229
+ FormatOptions, // { indent, sortKeys, updateChecksum }
230
+ FormatResult, // { formatted, changed }
231
+ } from '@ai-dossier/core';
232
+ ```
233
+
234
+ ## Development
235
+
236
+ Part of the [ai-dossier](https://github.com/imboard-ai/ai-dossier) monorepo.
237
+
238
+ ```bash
239
+ npm run build -w packages/core # build
240
+ npm run test -w packages/core # test
241
+ make build-core # build via Makefile
242
+ ```
243
+
70
244
  ## License
71
245
 
72
246
  [AGPL-3.0](https://github.com/imboard-ai/ai-dossier/blob/main/LICENSE)
@@ -1 +1 @@
1
- {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/formatter/formatter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAiG3D,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAC/B,YAAY,CAmCd"}
1
+ {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/formatter/formatter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAmG3D,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAC/B,YAAY,CAmCd"}
@@ -25,6 +25,8 @@ const KEY_ORDER = [
25
25
  'risk_factors',
26
26
  'requires_approval',
27
27
  'destructive_operations',
28
+ 'content_scope',
29
+ 'external_references',
28
30
  'prerequisites',
29
31
  'inputs',
30
32
  'outputs',
@@ -1 +1 @@
1
- {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../src/formatter/formatter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../src/formatter/formatter.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -13,11 +13,14 @@ export { formatDossierContent, formatDossierFile } from './formatter';
13
13
  export type { LintConfig, LintDiagnostic, LintResult, LintRule, LintRuleContext, LintSeverity, RuleSeverityOverride, } from './linter';
14
14
  export { defaultRules, LintRuleRegistry, lintDossier, lintDossierFile, loadLintConfig, } from './linter';
15
15
  export { parseDossierContent, parseDossierFile, RECOMMENDED_FIELDS, REQUIRED_FIELDS, VALID_RISK_LEVELS, VALID_STATUSES, validateFrontmatter, } from './parser';
16
+ export type { ChecksumStatus, ContentRiskResult, SignatureStatus, VerificationRiskLevel, VerificationRiskResult, } from './risk-assessment';
17
+ export { assessContentRisk, assessVerificationRisk } from './risk-assessment';
16
18
  export { loadTrustedKeys, verifySignature, verifyWithEd25519, verifyWithKms } from './signature';
17
19
  export { Ed25519Signer, Ed25519Verifier, getVerifierRegistry, KmsSigner, KmsVerifier, SignatureResult, Signer, Verifier, VerifierRegistry, VerifyResult, } from './signers';
18
20
  export * from './types';
19
21
  export { sha256Hash, sha256Hex } from './utils/crypto';
20
22
  export { getErrorMessage, getErrorStack } from './utils/errors';
21
23
  export { readFileIfExists } from './utils/fs';
24
+ export { collectDeclaredUrls, findStaleReferences, findUndeclaredUrls, isPlaceholderUrl, isUrlCoveredByDeclared, scanBodyForUrls, } from './utils/url-scanner';
22
25
  export { createDefaultVerificationResult } from './utils/verification';
23
26
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAChE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE/D,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACtE,YAAY,EACV,UAAU,EACV,cAAc,EACd,UAAU,EACV,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,oBAAoB,GACrB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,cAAc,GACf,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,mBAAmB,GACpB,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjG,OAAO,EACL,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,SAAS,EACT,WAAW,EACX,eAAe,EACf,MAAM,EACN,QAAQ,EACR,gBAAgB,EAChB,YAAY,GACb,MAAM,WAAW,CAAC;AAEnB,cAAc,SAAS,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,OAAO,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAChE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE/D,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACtE,YAAY,EACV,UAAU,EACV,cAAc,EACd,UAAU,EACV,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,oBAAoB,GACrB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,cAAc,GACf,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,mBAAmB,GACpB,MAAM,UAAU,CAAC;AAClB,YAAY,EACV,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAE9E,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjG,OAAO,EACL,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,SAAS,EACT,WAAW,EACX,eAAe,EACf,MAAM,EACN,QAAQ,EACR,gBAAgB,EAChB,YAAY,GACb,MAAM,WAAW,CAAC;AAEnB,cAAc,SAAS,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,EACtB,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAC"}
package/dist/index.js CHANGED
@@ -23,7 +23,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
23
23
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.createDefaultVerificationResult = exports.readFileIfExists = exports.getErrorStack = exports.getErrorMessage = exports.sha256Hex = exports.sha256Hash = exports.VerifierRegistry = exports.KmsVerifier = exports.KmsSigner = exports.getVerifierRegistry = exports.Ed25519Verifier = exports.Ed25519Signer = exports.verifyWithKms = exports.verifyWithEd25519 = exports.verifySignature = exports.loadTrustedKeys = exports.validateFrontmatter = exports.VALID_STATUSES = exports.VALID_RISK_LEVELS = exports.REQUIRED_FIELDS = exports.RECOMMENDED_FIELDS = exports.parseDossierFile = exports.parseDossierContent = exports.loadLintConfig = exports.lintDossierFile = exports.lintDossier = exports.LintRuleRegistry = exports.defaultRules = exports.formatDossierFile = exports.formatDossierContent = exports.verifyIntegrity = exports.calculateChecksum = void 0;
26
+ exports.createDefaultVerificationResult = exports.scanBodyForUrls = exports.isUrlCoveredByDeclared = exports.isPlaceholderUrl = exports.findUndeclaredUrls = exports.findStaleReferences = exports.collectDeclaredUrls = exports.readFileIfExists = exports.getErrorStack = exports.getErrorMessage = exports.sha256Hex = exports.sha256Hash = exports.VerifierRegistry = exports.KmsVerifier = exports.KmsSigner = exports.getVerifierRegistry = exports.Ed25519Verifier = exports.Ed25519Signer = exports.verifyWithKms = exports.verifyWithEd25519 = exports.verifySignature = exports.loadTrustedKeys = exports.assessVerificationRisk = exports.assessContentRisk = exports.validateFrontmatter = exports.VALID_STATUSES = exports.VALID_RISK_LEVELS = exports.REQUIRED_FIELDS = exports.RECOMMENDED_FIELDS = exports.parseDossierFile = exports.parseDossierContent = exports.loadLintConfig = exports.lintDossierFile = exports.lintDossier = exports.LintRuleRegistry = exports.defaultRules = exports.formatDossierFile = exports.formatDossierContent = exports.verifyIntegrity = exports.calculateChecksum = void 0;
27
27
  // Checksum exports
28
28
  var checksum_1 = require("./checksum");
29
29
  Object.defineProperty(exports, "calculateChecksum", { enumerable: true, get: function () { return checksum_1.calculateChecksum; } });
@@ -48,6 +48,10 @@ Object.defineProperty(exports, "REQUIRED_FIELDS", { enumerable: true, get: funct
48
48
  Object.defineProperty(exports, "VALID_RISK_LEVELS", { enumerable: true, get: function () { return parser_1.VALID_RISK_LEVELS; } });
49
49
  Object.defineProperty(exports, "VALID_STATUSES", { enumerable: true, get: function () { return parser_1.VALID_STATUSES; } });
50
50
  Object.defineProperty(exports, "validateFrontmatter", { enumerable: true, get: function () { return parser_1.validateFrontmatter; } });
51
+ // Risk assessment exports
52
+ var risk_assessment_1 = require("./risk-assessment");
53
+ Object.defineProperty(exports, "assessContentRisk", { enumerable: true, get: function () { return risk_assessment_1.assessContentRisk; } });
54
+ Object.defineProperty(exports, "assessVerificationRisk", { enumerable: true, get: function () { return risk_assessment_1.assessVerificationRisk; } });
51
55
  // Signature exports
52
56
  var signature_1 = require("./signature");
53
57
  Object.defineProperty(exports, "loadTrustedKeys", { enumerable: true, get: function () { return signature_1.loadTrustedKeys; } });
@@ -75,6 +79,14 @@ Object.defineProperty(exports, "getErrorStack", { enumerable: true, get: functio
75
79
  // File system utilities
76
80
  var fs_1 = require("./utils/fs");
77
81
  Object.defineProperty(exports, "readFileIfExists", { enumerable: true, get: function () { return fs_1.readFileIfExists; } });
82
+ // URL scanning utilities
83
+ var url_scanner_1 = require("./utils/url-scanner");
84
+ Object.defineProperty(exports, "collectDeclaredUrls", { enumerable: true, get: function () { return url_scanner_1.collectDeclaredUrls; } });
85
+ Object.defineProperty(exports, "findStaleReferences", { enumerable: true, get: function () { return url_scanner_1.findStaleReferences; } });
86
+ Object.defineProperty(exports, "findUndeclaredUrls", { enumerable: true, get: function () { return url_scanner_1.findUndeclaredUrls; } });
87
+ Object.defineProperty(exports, "isPlaceholderUrl", { enumerable: true, get: function () { return url_scanner_1.isPlaceholderUrl; } });
88
+ Object.defineProperty(exports, "isUrlCoveredByDeclared", { enumerable: true, get: function () { return url_scanner_1.isUrlCoveredByDeclared; } });
89
+ Object.defineProperty(exports, "scanBodyForUrls", { enumerable: true, get: function () { return url_scanner_1.scanBodyForUrls; } });
78
90
  // Verification utilities
79
91
  var verification_1 = require("./utils/verification");
80
92
  Object.defineProperty(exports, "createDefaultVerificationResult", { enumerable: true, get: function () { return verification_1.createDefaultVerificationResult; } });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;;;;;;;;;;;;;AAEH,mBAAmB;AACnB,uCAAgE;AAAvD,6GAAA,iBAAiB,OAAA;AAAE,2GAAA,eAAe,OAAA;AAE3C,oBAAoB;AACpB,yCAAsE;AAA7D,iHAAA,oBAAoB,OAAA;AAAE,8GAAA,iBAAiB,OAAA;AAUhD,iBAAiB;AACjB,mCAMkB;AALhB,sGAAA,YAAY,OAAA;AACZ,0GAAA,gBAAgB,OAAA;AAChB,qGAAA,WAAW,OAAA;AACX,yGAAA,eAAe,OAAA;AACf,wGAAA,cAAc,OAAA;AAEhB,iBAAiB;AACjB,mCAQkB;AAPhB,6GAAA,mBAAmB,OAAA;AACnB,0GAAA,gBAAgB,OAAA;AAChB,4GAAA,kBAAkB,OAAA;AAClB,yGAAA,eAAe,OAAA;AACf,2GAAA,iBAAiB,OAAA;AACjB,wGAAA,cAAc,OAAA;AACd,6GAAA,mBAAmB,OAAA;AAErB,oBAAoB;AACpB,yCAAiG;AAAxF,4GAAA,eAAe,OAAA;AAAE,4GAAA,eAAe,OAAA;AAAE,8GAAA,iBAAiB,OAAA;AAAE,0GAAA,aAAa,OAAA;AAC3E,iDAAiD;AACjD,qCAWmB;AAVjB,wGAAA,aAAa,OAAA;AACb,0GAAA,eAAe,OAAA;AACf,8GAAA,mBAAmB,OAAA;AACnB,oGAAA,SAAS,OAAA;AACT,sGAAA,WAAW,OAAA;AAIX,2GAAA,gBAAgB,OAAA;AAGlB,eAAe;AACf,0CAAwB;AACxB,mBAAmB;AACnB,yCAAuD;AAA9C,oGAAA,UAAU,OAAA;AAAE,mGAAA,SAAS,OAAA;AAC9B,kBAAkB;AAClB,yCAAgE;AAAvD,yGAAA,eAAe,OAAA;AAAE,uGAAA,aAAa,OAAA;AACvC,wBAAwB;AACxB,iCAA8C;AAArC,sGAAA,gBAAgB,OAAA;AACzB,yBAAyB;AACzB,qDAAuE;AAA9D,+HAAA,+BAA+B,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;;;;;;;;;;;;;AAEH,mBAAmB;AACnB,uCAAgE;AAAvD,6GAAA,iBAAiB,OAAA;AAAE,2GAAA,eAAe,OAAA;AAE3C,oBAAoB;AACpB,yCAAsE;AAA7D,iHAAA,oBAAoB,OAAA;AAAE,8GAAA,iBAAiB,OAAA;AAUhD,iBAAiB;AACjB,mCAMkB;AALhB,sGAAA,YAAY,OAAA;AACZ,0GAAA,gBAAgB,OAAA;AAChB,qGAAA,WAAW,OAAA;AACX,yGAAA,eAAe,OAAA;AACf,wGAAA,cAAc,OAAA;AAEhB,iBAAiB;AACjB,mCAQkB;AAPhB,6GAAA,mBAAmB,OAAA;AACnB,0GAAA,gBAAgB,OAAA;AAChB,4GAAA,kBAAkB,OAAA;AAClB,yGAAA,eAAe,OAAA;AACf,2GAAA,iBAAiB,OAAA;AACjB,wGAAA,cAAc,OAAA;AACd,6GAAA,mBAAmB,OAAA;AASrB,0BAA0B;AAC1B,qDAA8E;AAArE,oHAAA,iBAAiB,OAAA;AAAE,yHAAA,sBAAsB,OAAA;AAClD,oBAAoB;AACpB,yCAAiG;AAAxF,4GAAA,eAAe,OAAA;AAAE,4GAAA,eAAe,OAAA;AAAE,8GAAA,iBAAiB,OAAA;AAAE,0GAAA,aAAa,OAAA;AAC3E,iDAAiD;AACjD,qCAWmB;AAVjB,wGAAA,aAAa,OAAA;AACb,0GAAA,eAAe,OAAA;AACf,8GAAA,mBAAmB,OAAA;AACnB,oGAAA,SAAS,OAAA;AACT,sGAAA,WAAW,OAAA;AAIX,2GAAA,gBAAgB,OAAA;AAGlB,eAAe;AACf,0CAAwB;AACxB,mBAAmB;AACnB,yCAAuD;AAA9C,oGAAA,UAAU,OAAA;AAAE,mGAAA,SAAS,OAAA;AAC9B,kBAAkB;AAClB,yCAAgE;AAAvD,yGAAA,eAAe,OAAA;AAAE,uGAAA,aAAa,OAAA;AACvC,wBAAwB;AACxB,iCAA8C;AAArC,sGAAA,gBAAgB,OAAA;AACzB,yBAAyB;AACzB,mDAO6B;AAN3B,kHAAA,mBAAmB,OAAA;AACnB,kHAAA,mBAAmB,OAAA;AACnB,iHAAA,kBAAkB,OAAA;AAClB,+GAAA,gBAAgB,OAAA;AAChB,qHAAA,sBAAsB,OAAA;AACtB,8GAAA,eAAe,OAAA;AAEjB,yBAAyB;AACzB,qDAAuE;AAA9D,+HAAA,+BAA+B,OAAA"}
@@ -0,0 +1,3 @@
1
+ import type { LintRule } from '../types';
2
+ export declare const externalReferencesDeclaredRule: LintRule;
3
+ //# sourceMappingURL=external-references-declared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-references-declared.d.ts","sourceRoot":"","sources":["../../../src/linter/rules/external-references-declared.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAkB,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzD,eAAO,MAAM,8BAA8B,EAAE,QAgD5C,CAAC"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.externalReferencesDeclaredRule = void 0;
4
+ const url_scanner_1 = require("../../utils/url-scanner");
5
+ exports.externalReferencesDeclaredRule = {
6
+ id: 'external-references-declared',
7
+ description: 'External URLs in body must be declared in external_references',
8
+ defaultSeverity: 'error',
9
+ run(context) {
10
+ const { frontmatter, body } = context;
11
+ const diagnostics = [];
12
+ const bodyUrls = (0, url_scanner_1.scanBodyForUrls)(body);
13
+ if (bodyUrls.length === 0) {
14
+ return diagnostics;
15
+ }
16
+ const declaredUrls = (0, url_scanner_1.collectDeclaredUrls)(frontmatter);
17
+ const undeclaredUrls = (0, url_scanner_1.findUndeclaredUrls)(bodyUrls, declaredUrls);
18
+ for (const url of undeclaredUrls) {
19
+ diagnostics.push({
20
+ ruleId: 'external-references-declared',
21
+ severity: 'error',
22
+ message: `Undeclared external URL in body: ${url} — add it to external_references`,
23
+ field: 'external_references',
24
+ });
25
+ }
26
+ if (bodyUrls.length > 0 && frontmatter.content_scope !== 'references-external') {
27
+ diagnostics.push({
28
+ ruleId: 'external-references-declared',
29
+ severity: 'error',
30
+ message: `Body contains ${bodyUrls.length} external URL(s) but content_scope is not "references-external"`,
31
+ field: 'content_scope',
32
+ });
33
+ }
34
+ if (Array.isArray(frontmatter.external_references)) {
35
+ const stale = (0, url_scanner_1.findStaleReferences)(frontmatter.external_references, bodyUrls);
36
+ for (const ref of stale) {
37
+ diagnostics.push({
38
+ ruleId: 'external-references-declared',
39
+ severity: 'info',
40
+ message: `Declared external reference not found in body (possibly stale): ${ref.url}`,
41
+ field: 'external_references',
42
+ });
43
+ }
44
+ }
45
+ return diagnostics;
46
+ },
47
+ };
48
+ //# sourceMappingURL=external-references-declared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-references-declared.js","sourceRoot":"","sources":["../../../src/linter/rules/external-references-declared.ts"],"names":[],"mappings":";;;AAAA,yDAKiC;AAGpB,QAAA,8BAA8B,GAAa;IACtD,EAAE,EAAE,8BAA8B;IAClC,WAAW,EAAE,+DAA+D;IAC5E,eAAe,EAAE,OAAO;IACxB,GAAG,CAAC,OAAO;QACT,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;QACtC,MAAM,WAAW,GAAqB,EAAE,CAAC;QAEzC,MAAM,QAAQ,GAAG,IAAA,6BAAe,EAAC,IAAI,CAAC,CAAC;QACvC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,MAAM,YAAY,GAAG,IAAA,iCAAmB,EAAC,WAAW,CAAC,CAAC;QACtD,MAAM,cAAc,GAAG,IAAA,gCAAkB,EAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAElE,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;YACjC,WAAW,CAAC,IAAI,CAAC;gBACf,MAAM,EAAE,8BAA8B;gBACtC,QAAQ,EAAE,OAAgB;gBAC1B,OAAO,EAAE,oCAAoC,GAAG,kCAAkC;gBAClF,KAAK,EAAE,qBAAqB;aAC7B,CAAC,CAAC;QACL,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,aAAa,KAAK,qBAAqB,EAAE,CAAC;YAC/E,WAAW,CAAC,IAAI,CAAC;gBACf,MAAM,EAAE,8BAA8B;gBACtC,QAAQ,EAAE,OAAgB;gBAC1B,OAAO,EAAE,iBAAiB,QAAQ,CAAC,MAAM,iEAAiE;gBAC1G,KAAK,EAAE,eAAe;aACvB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACnD,MAAM,KAAK,GAAG,IAAA,iCAAmB,EAAC,WAAW,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAC;YAC7E,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;gBACxB,WAAW,CAAC,IAAI,CAAC;oBACf,MAAM,EAAE,8BAA8B;oBACtC,QAAQ,EAAE,MAAe;oBACzB,OAAO,EAAE,mEAAmE,GAAG,CAAC,GAAG,EAAE;oBACrF,KAAK,EAAE,qBAAqB;iBAC7B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;CACF,CAAC"}
@@ -1,11 +1,12 @@
1
1
  import type { LintRule } from '../types';
2
2
  import { checksumValidRule } from './checksum-valid';
3
+ import { externalReferencesDeclaredRule } from './external-references-declared';
3
4
  import { objectiveQualityRule } from './objective-quality';
4
5
  import { requiredSectionsRule } from './required-sections';
5
6
  import { riskLevelConsistencyRule } from './risk-level-consistency';
6
7
  import { schemaValidRule } from './schema-valid';
7
8
  import { semverVersionRule } from './semver-version';
8
9
  import { toolsCheckCommandRule } from './tools-check-command';
9
- export { checksumValidRule, objectiveQualityRule, requiredSectionsRule, riskLevelConsistencyRule, schemaValidRule, semverVersionRule, toolsCheckCommandRule, };
10
+ export { checksumValidRule, externalReferencesDeclaredRule, objectiveQualityRule, requiredSectionsRule, riskLevelConsistencyRule, schemaValidRule, semverVersionRule, toolsCheckCommandRule, };
10
11
  export declare const defaultRules: LintRule[];
11
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/linter/rules/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,EACxB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,GACtB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,QAAQ,EAQlC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/linter/rules/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,8BAA8B,EAAE,MAAM,gCAAgC,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,EACL,iBAAiB,EACjB,8BAA8B,EAC9B,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,EACxB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,GACtB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,QAAQ,EASlC,CAAC"}
@@ -1,8 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.defaultRules = exports.toolsCheckCommandRule = exports.semverVersionRule = exports.schemaValidRule = exports.riskLevelConsistencyRule = exports.requiredSectionsRule = exports.objectiveQualityRule = exports.checksumValidRule = void 0;
3
+ exports.defaultRules = exports.toolsCheckCommandRule = exports.semverVersionRule = exports.schemaValidRule = exports.riskLevelConsistencyRule = exports.requiredSectionsRule = exports.objectiveQualityRule = exports.externalReferencesDeclaredRule = exports.checksumValidRule = void 0;
4
4
  const checksum_valid_1 = require("./checksum-valid");
5
5
  Object.defineProperty(exports, "checksumValidRule", { enumerable: true, get: function () { return checksum_valid_1.checksumValidRule; } });
6
+ const external_references_declared_1 = require("./external-references-declared");
7
+ Object.defineProperty(exports, "externalReferencesDeclaredRule", { enumerable: true, get: function () { return external_references_declared_1.externalReferencesDeclaredRule; } });
6
8
  const objective_quality_1 = require("./objective-quality");
7
9
  Object.defineProperty(exports, "objectiveQualityRule", { enumerable: true, get: function () { return objective_quality_1.objectiveQualityRule; } });
8
10
  const required_sections_1 = require("./required-sections");
@@ -23,5 +25,6 @@ exports.defaultRules = [
23
25
  tools_check_command_1.toolsCheckCommandRule,
24
26
  objective_quality_1.objectiveQualityRule,
25
27
  required_sections_1.requiredSectionsRule,
28
+ external_references_declared_1.externalReferencesDeclaredRule,
26
29
  ];
27
30
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/linter/rules/index.ts"],"names":[],"mappings":";;;AACA,qDAAqD;AASnD,kGATO,kCAAiB,OASP;AARnB,2DAA2D;AASzD,qGATO,wCAAoB,OASP;AARtB,2DAA2D;AASzD,qGATO,wCAAoB,OASP;AARtB,qEAAoE;AASlE,yGATO,iDAAwB,OASP;AAR1B,iDAAiD;AAS/C,gGATO,8BAAe,OASP;AARjB,qDAAqD;AASnD,kGATO,kCAAiB,OASP;AARnB,+DAA8D;AAS5D,sGATO,2CAAqB,OASP;AAGV,QAAA,YAAY,GAAe;IACtC,8BAAe;IACf,kCAAiB;IACjB,kCAAiB;IACjB,iDAAwB;IACxB,2CAAqB;IACrB,wCAAoB;IACpB,wCAAoB;CACrB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/linter/rules/index.ts"],"names":[],"mappings":";;;AACA,qDAAqD;AAUnD,kGAVO,kCAAiB,OAUP;AATnB,iFAAgF;AAU9E,+GAVO,6DAA8B,OAUP;AAThC,2DAA2D;AAUzD,qGAVO,wCAAoB,OAUP;AATtB,2DAA2D;AAUzD,qGAVO,wCAAoB,OAUP;AATtB,qEAAoE;AAUlE,yGAVO,iDAAwB,OAUP;AAT1B,iDAAiD;AAU/C,gGAVO,8BAAe,OAUP;AATjB,qDAAqD;AAUnD,kGAVO,kCAAiB,OAUP;AATnB,+DAA8D;AAU5D,sGAVO,2CAAqB,OAUP;AAGV,QAAA,YAAY,GAAe;IACtC,8BAAe;IACf,kCAAiB;IACjB,kCAAiB;IACjB,iDAAwB;IACxB,2CAAqB;IACrB,wCAAoB;IACpB,wCAAoB;IACpB,6DAA8B;CAC/B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"risk-level-consistency.d.ts","sourceRoot":"","sources":["../../../src/linter/rules/risk-level-consistency.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,wBAAwB,EAAE,QAuBtC,CAAC"}
1
+ {"version":3,"file":"risk-level-consistency.d.ts","sourceRoot":"","sources":["../../../src/linter/rules/risk-level-consistency.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzD,eAAO,MAAM,wBAAwB,EAAE,QAqCtC,CAAC"}
@@ -3,10 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.riskLevelConsistencyRule = void 0;
4
4
  exports.riskLevelConsistencyRule = {
5
5
  id: 'risk-level-consistency',
6
- description: 'Risk level should be consistent with destructive operations',
6
+ description: 'Risk level should be consistent with destructive operations and external references',
7
7
  defaultSeverity: 'warning',
8
8
  run(context) {
9
- const { risk_level, destructive_operations } = context.frontmatter;
9
+ const { risk_level, destructive_operations, external_references, risk_factors } = context.frontmatter;
10
10
  const diagnostics = [];
11
11
  if (risk_level === 'low' &&
12
12
  Array.isArray(destructive_operations) &&
@@ -18,6 +18,16 @@ exports.riskLevelConsistencyRule = {
18
18
  field: 'risk_level',
19
19
  });
20
20
  }
21
+ if (Array.isArray(external_references) && external_references.length > 0) {
22
+ if (!Array.isArray(risk_factors) || !risk_factors.includes('network_access')) {
23
+ diagnostics.push({
24
+ ruleId: 'risk-level-consistency',
25
+ severity: 'warning',
26
+ message: 'external_references declared but risk_factors does not include "network_access"',
27
+ field: 'risk_factors',
28
+ });
29
+ }
30
+ }
21
31
  return diagnostics;
22
32
  },
23
33
  };
@@ -1 +1 @@
1
- {"version":3,"file":"risk-level-consistency.js","sourceRoot":"","sources":["../../../src/linter/rules/risk-level-consistency.ts"],"names":[],"mappings":";;;AAEa,QAAA,wBAAwB,GAAa;IAChD,EAAE,EAAE,wBAAwB;IAC5B,WAAW,EAAE,6DAA6D;IAC1E,eAAe,EAAE,SAAS;IAC1B,GAAG,CAAC,OAAO;QACT,MAAM,EAAE,UAAU,EAAE,sBAAsB,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;QACnE,MAAM,WAAW,GAAG,EAAE,CAAC;QAEvB,IACE,UAAU,KAAK,KAAK;YACpB,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAC;YACrC,sBAAsB,CAAC,MAAM,GAAG,CAAC,EACjC,CAAC;YACD,WAAW,CAAC,IAAI,CAAC;gBACf,MAAM,EAAE,wBAAwB;gBAChC,QAAQ,EAAE,SAAkB;gBAC5B,OAAO,EAAE,2BAA2B,sBAAsB,CAAC,MAAM,kEAAkE;gBACnI,KAAK,EAAE,YAAY;aACpB,CAAC,CAAC;QACL,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"risk-level-consistency.js","sourceRoot":"","sources":["../../../src/linter/rules/risk-level-consistency.ts"],"names":[],"mappings":";;;AAEa,QAAA,wBAAwB,GAAa;IAChD,EAAE,EAAE,wBAAwB;IAC5B,WAAW,EACT,qFAAqF;IACvF,eAAe,EAAE,SAAS;IAC1B,GAAG,CAAC,OAAO;QACT,MAAM,EAAE,UAAU,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,YAAY,EAAE,GAC7E,OAAO,CAAC,WAAW,CAAC;QACtB,MAAM,WAAW,GAAqB,EAAE,CAAC;QAEzC,IACE,UAAU,KAAK,KAAK;YACpB,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAC;YACrC,sBAAsB,CAAC,MAAM,GAAG,CAAC,EACjC,CAAC;YACD,WAAW,CAAC,IAAI,CAAC;gBACf,MAAM,EAAE,wBAAwB;gBAChC,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,2BAA2B,sBAAsB,CAAC,MAAM,kEAAkE;gBACnI,KAAK,EAAE,YAAY;aACpB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBAC7E,WAAW,CAAC,IAAI,CAAC;oBACf,MAAM,EAAE,wBAAwB;oBAChC,QAAQ,EAAE,SAAS;oBACnB,OAAO,EACL,iFAAiF;oBACnF,KAAK,EAAE,cAAc;iBACtB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"tools-check-command.d.ts","sourceRoot":"","sources":["../../../src/linter/rules/tools-check-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAOzC,eAAO,MAAM,qBAAqB,EAAE,QA0BnC,CAAC"}
1
+ {"version":3,"file":"tools-check-command.d.ts","sourceRoot":"","sources":["../../../src/linter/rules/tools-check-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,qBAAqB,EAAE,QA0BnC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"tools-check-command.js","sourceRoot":"","sources":["../../../src/linter/rules/tools-check-command.ts"],"names":[],"mappings":";;;AAOa,QAAA,qBAAqB,GAAa;IAC7C,EAAE,EAAE,qBAAqB;IACzB,WAAW,EAAE,oDAAoD;IACjE,eAAe,EAAE,SAAS;IAC1B,GAAG,CAAC,OAAO;QACT,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,cAA4C,CAAC;QAE/E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,WAAW,GAAG,EAAE,CAAC;QAEvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACxB,WAAW,CAAC,IAAI,CAAC;oBACf,MAAM,EAAE,qBAAqB;oBAC7B,QAAQ,EAAE,SAAkB;oBAC5B,OAAO,EAAE,SAAS,IAAI,CAAC,IAAI,+DAA+D;oBAC1F,KAAK,EAAE,gBAAgB;iBACxB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"tools-check-command.js","sourceRoot":"","sources":["../../../src/linter/rules/tools-check-command.ts"],"names":[],"mappings":";;;AAEa,QAAA,qBAAqB,GAAa;IAC7C,EAAE,EAAE,qBAAqB;IACzB,WAAW,EAAE,oDAAoD;IACjE,eAAe,EAAE,SAAS;IAC1B,GAAG,CAAC,OAAO;QACT,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC;QAEjD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,WAAW,GAAG,EAAE,CAAC;QAEvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACxB,WAAW,CAAC,IAAI,CAAC;oBACf,MAAM,EAAE,qBAAqB;oBAC7B,QAAQ,EAAE,SAAkB;oBAC5B,OAAO,EAAE,SAAS,IAAI,CAAC,IAAI,+DAA+D;oBAC1F,KAAK,EAAE,gBAAgB;iBACxB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;CACF,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Verification risk assessment for dossiers.
3
+ *
4
+ * Evaluates checksum, signature, and declared risk level
5
+ * to produce a recommendation (ALLOW or BLOCK).
6
+ */
7
+ import type { DossierFrontmatter } from './types';
8
+ export interface ChecksumStatus {
9
+ passed: boolean;
10
+ }
11
+ export interface SignatureStatus {
12
+ present: boolean;
13
+ verified: boolean;
14
+ trusted: boolean;
15
+ }
16
+ export type VerificationRiskLevel = 'low' | 'medium' | 'high' | 'critical';
17
+ export interface VerificationRiskResult {
18
+ level: VerificationRiskLevel;
19
+ issues: string[];
20
+ recommendation: 'ALLOW' | 'BLOCK';
21
+ }
22
+ export declare function assessVerificationRisk(declaredRiskLevel: string | undefined, checksumResult: ChecksumStatus, signatureResult: SignatureStatus): VerificationRiskResult;
23
+ export interface ContentRiskResult {
24
+ level: VerificationRiskLevel;
25
+ issues: string[];
26
+ undeclaredUrls: string[];
27
+ }
28
+ export declare function assessContentRisk(frontmatter: DossierFrontmatter, body: string): ContentRiskResult;
29
+ //# sourceMappingURL=risk-assessment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk-assessment.d.ts","sourceRoot":"","sources":["../src/risk-assessment.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAGlD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,qBAAqB,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAE3E,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,qBAAqB,CAAC;IAC7B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,cAAc,EAAE,OAAO,GAAG,OAAO,CAAC;CACnC;AAED,wBAAgB,sBAAsB,CACpC,iBAAiB,EAAE,MAAM,GAAG,SAAS,EACrC,cAAc,EAAE,cAAc,EAC9B,eAAe,EAAE,eAAe,GAC/B,sBAAsB,CA2CxB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,qBAAqB,CAAC;IAC7B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,kBAAkB,EAC/B,IAAI,EAAE,MAAM,GACX,iBAAiB,CAuCnB"}
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ /**
3
+ * Verification risk assessment for dossiers.
4
+ *
5
+ * Evaluates checksum, signature, and declared risk level
6
+ * to produce a recommendation (ALLOW or BLOCK).
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.assessVerificationRisk = assessVerificationRisk;
10
+ exports.assessContentRisk = assessContentRisk;
11
+ const url_scanner_1 = require("./utils/url-scanner");
12
+ function assessVerificationRisk(declaredRiskLevel, checksumResult, signatureResult) {
13
+ const issues = [];
14
+ let riskLevel = 'low';
15
+ let shouldBlock = false;
16
+ // Checksum failure is critical
17
+ if (!checksumResult.passed) {
18
+ issues.push('Checksum verification FAILED - content has been tampered with');
19
+ riskLevel = 'critical';
20
+ shouldBlock = true;
21
+ }
22
+ // Signature issues
23
+ if (signatureResult.present && !signatureResult.verified) {
24
+ issues.push('Signature verification FAILED or could not be verified');
25
+ if (riskLevel !== 'critical')
26
+ riskLevel = 'high';
27
+ shouldBlock = true;
28
+ }
29
+ // Valid signature but not trusted - BLOCK execution
30
+ if (signatureResult.present && signatureResult.verified && !signatureResult.trusted) {
31
+ issues.push('Signature is valid but signer is not in your trusted keys list');
32
+ issues.push('Add the public key to ~/.dossier/trusted-keys.txt to trust this signer');
33
+ if (riskLevel === 'low')
34
+ riskLevel = 'medium';
35
+ shouldBlock = true;
36
+ }
37
+ // No signature on high-risk dossier
38
+ if (!signatureResult.present && declaredRiskLevel === 'high') {
39
+ issues.push('High-risk dossier without signature');
40
+ if (riskLevel === 'low')
41
+ riskLevel = 'medium';
42
+ }
43
+ if (!signatureResult.present && declaredRiskLevel === 'critical') {
44
+ issues.push('Critical-risk dossier without signature');
45
+ if (riskLevel !== 'critical')
46
+ riskLevel = 'high';
47
+ }
48
+ return {
49
+ level: riskLevel,
50
+ issues,
51
+ recommendation: shouldBlock ? 'BLOCK' : 'ALLOW',
52
+ };
53
+ }
54
+ function assessContentRisk(frontmatter, body) {
55
+ const issues = [];
56
+ let level = 'low';
57
+ const bodyUrls = (0, url_scanner_1.scanBodyForUrls)(body);
58
+ if (bodyUrls.length === 0) {
59
+ return { level, issues, undeclaredUrls: [] };
60
+ }
61
+ const declaredUrls = (0, url_scanner_1.collectDeclaredUrls)(frontmatter);
62
+ const undeclaredUrls = (0, url_scanner_1.findUndeclaredUrls)(bodyUrls, declaredUrls);
63
+ if (undeclaredUrls.length > 0) {
64
+ issues.push(`Body contains ${undeclaredUrls.length} undeclared external URL(s): ${undeclaredUrls.join(', ')}`);
65
+ if (level === 'low')
66
+ level = 'medium';
67
+ }
68
+ if (Array.isArray(frontmatter.external_references)) {
69
+ for (const ref of frontmatter.external_references) {
70
+ if (ref.type === 'script' && ref.trust_level === 'unknown') {
71
+ issues.push(`External script with unknown trust level: ${ref.url} — requires user approval`);
72
+ level = 'high';
73
+ }
74
+ }
75
+ }
76
+ if (bodyUrls.length > 0 &&
77
+ Array.isArray(frontmatter.risk_factors) &&
78
+ !frontmatter.risk_factors.includes('network_access')) {
79
+ issues.push('Body contains external URLs but risk_factors does not include "network_access"');
80
+ }
81
+ return { level, issues, undeclaredUrls };
82
+ }
83
+ //# sourceMappingURL=risk-assessment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk-assessment.js","sourceRoot":"","sources":["../src/risk-assessment.ts"],"names":[],"mappings":"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"}
@@ -168,6 +168,53 @@
168
168
  "minLength": 10
169
169
  }
170
170
  },
171
+ "content_scope": {
172
+ "type": "string",
173
+ "description": "Whether the dossier body is self-contained or references external URLs",
174
+ "enum": ["self-contained", "references-external"]
175
+ },
176
+ "external_references": {
177
+ "type": "array",
178
+ "description": "Manifest of all external resources referenced in the dossier body",
179
+ "items": {
180
+ "type": "object",
181
+ "required": ["url", "description", "type", "trust_level", "required"],
182
+ "properties": {
183
+ "url": {
184
+ "type": "string",
185
+ "description": "URL or URL prefix of the external resource",
186
+ "format": "uri"
187
+ },
188
+ "description": {
189
+ "type": "string",
190
+ "description": "What this external resource is used for"
191
+ },
192
+ "type": {
193
+ "type": "string",
194
+ "description": "Type of external resource",
195
+ "enum": [
196
+ "download",
197
+ "api",
198
+ "documentation",
199
+ "script",
200
+ "config",
201
+ "image",
202
+ "dossier",
203
+ "other"
204
+ ]
205
+ },
206
+ "trust_level": {
207
+ "type": "string",
208
+ "description": "Trust level of the external resource",
209
+ "enum": ["trusted", "user-verified", "unknown"]
210
+ },
211
+ "required": {
212
+ "type": "boolean",
213
+ "description": "Whether this external resource is required for execution"
214
+ }
215
+ }
216
+ }
217
+ },
171
218
  "checksum": {
172
219
  "type": "object",
173
220
  "description": "Content integrity hash (REQUIRED for security - verifies dossier hasn't been tampered with)",
package/dist/types.d.ts CHANGED
@@ -2,6 +2,27 @@
2
2
  * TypeScript type definitions for Dossier format
3
3
  */
4
4
  export type DossierStatus = 'Draft' | 'Stable' | 'Deprecated' | 'Experimental';
5
+ export type ContentScope = 'self-contained' | 'references-external';
6
+ export type ExternalReferenceType = 'download' | 'api' | 'documentation' | 'script' | 'config' | 'image' | 'dossier' | 'other';
7
+ export type ExternalTrustLevel = 'trusted' | 'user-verified' | 'unknown';
8
+ export interface ExternalReference {
9
+ url: string;
10
+ description: string;
11
+ type: ExternalReferenceType;
12
+ trust_level: ExternalTrustLevel;
13
+ required: boolean;
14
+ }
15
+ export interface ToolRequired {
16
+ name: string;
17
+ version?: string;
18
+ check_command?: string;
19
+ install_url?: string;
20
+ }
21
+ export interface DossierAuthor {
22
+ name?: string;
23
+ email?: string;
24
+ url?: string;
25
+ }
5
26
  export interface DossierFrontmatter {
6
27
  dossier_schema_version?: string;
7
28
  name?: string;
@@ -16,6 +37,10 @@ export interface DossierFrontmatter {
16
37
  risk_level?: 'low' | 'medium' | 'high' | 'critical';
17
38
  risk_factors?: string[];
18
39
  destructive_operations?: string[];
40
+ content_scope?: ContentScope;
41
+ external_references?: ExternalReference[];
42
+ tools_required?: ToolRequired[];
43
+ authors?: DossierAuthor[];
19
44
  requires_approval?: boolean;
20
45
  checksum?: {
21
46
  algorithm: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { DossierFrontmatter, ExternalReference } from '../types';
2
+ export declare function isPlaceholderUrl(url: string): boolean;
3
+ export declare function scanBodyForUrls(body: string): string[];
4
+ export declare function collectDeclaredUrls(frontmatter: DossierFrontmatter): string[];
5
+ export declare function isUrlCoveredByDeclared(url: string, declaredUrls: string[]): boolean;
6
+ export declare function findUndeclaredUrls(bodyUrls: string[], declaredUrls: string[]): string[];
7
+ export declare function findStaleReferences(externalRefs: ExternalReference[], bodyUrls: string[]): ExternalReference[];
8
+ //# sourceMappingURL=url-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-scanner.d.ts","sourceRoot":"","sources":["../../src/utils/url-scanner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAsBtE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAKtD;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,kBAAkB,GAAG,MAAM,EAAE,CAkC7E;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAEnF;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAEvF;AAED,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,iBAAiB,EAAE,EACjC,QAAQ,EAAE,MAAM,EAAE,GACjB,iBAAiB,EAAE,CAIrB"}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isPlaceholderUrl = isPlaceholderUrl;
4
+ exports.scanBodyForUrls = scanBodyForUrls;
5
+ exports.collectDeclaredUrls = collectDeclaredUrls;
6
+ exports.isUrlCoveredByDeclared = isUrlCoveredByDeclared;
7
+ exports.findUndeclaredUrls = findUndeclaredUrls;
8
+ exports.findStaleReferences = findStaleReferences;
9
+ // Matches http/https URLs, stopping at whitespace and common delimiters
10
+ // that typically surround URLs in markdown/text (quotes, angle brackets,
11
+ // parentheses, commas, semicolons, backticks).
12
+ const URL_REGEX = /https?:\/\/[^\s"'<>\])|,;`]+/g;
13
+ // Strip trailing periods and closing parens that are often part of
14
+ // surrounding prose rather than the URL itself (e.g. "see https://x.com).")
15
+ const TRAILING_PUNCTUATION = /[.)]+$/;
16
+ const PLACEHOLDER_PATTERNS = [
17
+ /^https?:\/\/example\.(com|org|net)/,
18
+ /^https?:\/\/localhost/,
19
+ /^https?:\/\/127\.0\.0\.\d/,
20
+ /^https?:\/\/\[::1\]/,
21
+ /^https?:\/\/0\.0\.0\.0/,
22
+ /<[^>]+>/,
23
+ /\$\{[^}]+\}/,
24
+ /\{\{[^}]+\}\}/,
25
+ ];
26
+ function isPlaceholderUrl(url) {
27
+ return PLACEHOLDER_PATTERNS.some((pattern) => pattern.test(url));
28
+ }
29
+ function scanBodyForUrls(body) {
30
+ const matches = body.match(URL_REGEX) || [];
31
+ const cleaned = matches.map((url) => url.replace(TRAILING_PUNCTUATION, ''));
32
+ const unique = [...new Set(cleaned)];
33
+ return unique.filter((url) => !isPlaceholderUrl(url));
34
+ }
35
+ function collectDeclaredUrls(frontmatter) {
36
+ const urls = [];
37
+ if (frontmatter.external_references) {
38
+ for (const ref of frontmatter.external_references) {
39
+ urls.push(ref.url);
40
+ }
41
+ }
42
+ if (frontmatter.tools_required) {
43
+ for (const tool of frontmatter.tools_required) {
44
+ if (tool.install_url) {
45
+ urls.push(tool.install_url);
46
+ }
47
+ }
48
+ }
49
+ if (typeof frontmatter.homepage === 'string') {
50
+ urls.push(frontmatter.homepage);
51
+ }
52
+ if (typeof frontmatter.repository === 'string') {
53
+ urls.push(frontmatter.repository);
54
+ }
55
+ if (frontmatter.authors) {
56
+ for (const author of frontmatter.authors) {
57
+ if (author.url) {
58
+ urls.push(author.url);
59
+ }
60
+ }
61
+ }
62
+ return urls;
63
+ }
64
+ function isUrlCoveredByDeclared(url, declaredUrls) {
65
+ return declaredUrls.some((declared) => url === declared || url.startsWith(declared));
66
+ }
67
+ function findUndeclaredUrls(bodyUrls, declaredUrls) {
68
+ return bodyUrls.filter((url) => !isUrlCoveredByDeclared(url, declaredUrls));
69
+ }
70
+ function findStaleReferences(externalRefs, bodyUrls) {
71
+ return externalRefs.filter((ref) => !bodyUrls.some((bodyUrl) => bodyUrl === ref.url || bodyUrl.startsWith(ref.url)));
72
+ }
73
+ //# sourceMappingURL=url-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-scanner.js","sourceRoot":"","sources":["../../src/utils/url-scanner.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-dossier/core",
3
- "version": "1.0.2",
3
+ "version": "1.1.0",
4
4
  "description": "Core verification and parsing logic for dossier automation standard",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",