@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.
- package/README.md +192 -18
- package/dist/formatter/formatter.d.ts.map +1 -1
- package/dist/formatter/formatter.js +2 -0
- package/dist/formatter/formatter.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -1
- package/dist/index.js.map +1 -1
- package/dist/linter/rules/external-references-declared.d.ts +3 -0
- package/dist/linter/rules/external-references-declared.d.ts.map +1 -0
- package/dist/linter/rules/external-references-declared.js +48 -0
- package/dist/linter/rules/external-references-declared.js.map +1 -0
- package/dist/linter/rules/index.d.ts +2 -1
- package/dist/linter/rules/index.d.ts.map +1 -1
- package/dist/linter/rules/index.js +4 -1
- package/dist/linter/rules/index.js.map +1 -1
- package/dist/linter/rules/risk-level-consistency.d.ts.map +1 -1
- package/dist/linter/rules/risk-level-consistency.js +12 -2
- package/dist/linter/rules/risk-level-consistency.js.map +1 -1
- package/dist/linter/rules/tools-check-command.d.ts.map +1 -1
- package/dist/linter/rules/tools-check-command.js.map +1 -1
- package/dist/risk-assessment.d.ts +29 -0
- package/dist/risk-assessment.d.ts.map +1 -0
- package/dist/risk-assessment.js +83 -0
- package/dist/risk-assessment.js.map +1 -0
- package/dist/schema/dossier-schema.json +47 -0
- package/dist/types.d.ts +25 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/url-scanner.d.ts +8 -0
- package/dist/utils/url-scanner.d.ts.map +1 -0
- package/dist/utils/url-scanner.js +73 -0
- package/dist/utils/url-scanner.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# @ai-dossier/core
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/@ai-dossier/core)
|
|
4
|
+
[](https://www.npmjs.com/package/@ai-dossier/core)
|
|
5
|
+
[](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 {
|
|
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
|
-
|
|
19
|
-
const { frontmatter, body } = parseDossierContent(content);
|
|
70
|
+
#### `validateFrontmatter(frontmatter: DossierFrontmatter): string[]`
|
|
20
71
|
|
|
21
|
-
|
|
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
|
-
|
|
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
|
-
|
|
34
|
-
|
|
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 {
|
|
103
|
+
import {
|
|
104
|
+
verifySignature,
|
|
105
|
+
verifyWithEd25519,
|
|
106
|
+
verifyWithKms,
|
|
107
|
+
loadTrustedKeys,
|
|
108
|
+
} from '@ai-dossier/core';
|
|
109
|
+
```
|
|
41
110
|
|
|
42
|
-
|
|
43
|
-
const result = await verifySignature(frontmatter, body);
|
|
111
|
+
#### `verifySignature(content: string, signature: SignatureResult): Promise<VerifyResult>`
|
|
44
112
|
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
-
|
|
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;
|
|
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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../src/formatter/formatter.ts"],"names":[],"mappings":";;
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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;
|
|
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 @@
|
|
|
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,
|
|
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;
|
|
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,
|
|
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,
|
|
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;
|
|
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":";;;
|
|
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;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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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"}
|