@ai-dossier/core 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/checksum.d.ts +15 -0
- package/dist/checksum.d.ts.map +1 -0
- package/dist/checksum.js +45 -0
- package/dist/checksum.js.map +1 -0
- package/dist/formatter/formatter.d.ts +3 -0
- package/dist/formatter/formatter.d.ts.map +1 -0
- package/dist/formatter/formatter.js +120 -0
- package/dist/formatter/formatter.js.map +1 -0
- package/dist/formatter/index.d.ts +5 -0
- package/dist/formatter/index.d.ts.map +1 -0
- package/dist/formatter/index.js +32 -0
- package/dist/formatter/index.js.map +1 -0
- package/dist/formatter/types.d.ts +11 -0
- package/dist/formatter/types.d.ts.map +1 -0
- package/dist/formatter/types.js +9 -0
- package/dist/formatter/types.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +77 -0
- package/dist/index.js.map +1 -0
- package/dist/linter/config.d.ts +4 -0
- package/dist/linter/config.d.ts.map +1 -0
- package/dist/linter/config.js +42 -0
- package/dist/linter/config.js.map +1 -0
- package/dist/linter/index.d.ts +8 -0
- package/dist/linter/index.d.ts.map +1 -0
- package/dist/linter/index.js +69 -0
- package/dist/linter/index.js.map +1 -0
- package/dist/linter/registry.d.ts +10 -0
- package/dist/linter/registry.d.ts.map +1 -0
- package/dist/linter/registry.js +37 -0
- package/dist/linter/registry.js.map +1 -0
- package/dist/linter/rules/checksum-valid.d.ts +3 -0
- package/dist/linter/rules/checksum-valid.d.ts.map +1 -0
- package/dist/linter/rules/checksum-valid.js +46 -0
- package/dist/linter/rules/checksum-valid.js.map +1 -0
- package/dist/linter/rules/index.d.ts +11 -0
- package/dist/linter/rules/index.d.ts.map +1 -0
- package/dist/linter/rules/index.js +27 -0
- package/dist/linter/rules/index.js.map +1 -0
- package/dist/linter/rules/objective-quality.d.ts +3 -0
- package/dist/linter/rules/objective-quality.d.ts.map +1 -0
- package/dist/linter/rules/objective-quality.js +44 -0
- package/dist/linter/rules/objective-quality.js.map +1 -0
- package/dist/linter/rules/required-sections.d.ts +3 -0
- package/dist/linter/rules/required-sections.d.ts.map +1 -0
- package/dist/linter/rules/required-sections.js +32 -0
- package/dist/linter/rules/required-sections.js.map +1 -0
- package/dist/linter/rules/risk-level-consistency.d.ts +3 -0
- package/dist/linter/rules/risk-level-consistency.d.ts.map +1 -0
- package/dist/linter/rules/risk-level-consistency.js +24 -0
- package/dist/linter/rules/risk-level-consistency.js.map +1 -0
- package/dist/linter/rules/schema-valid.d.ts +3 -0
- package/dist/linter/rules/schema-valid.d.ts.map +1 -0
- package/dist/linter/rules/schema-valid.js +63 -0
- package/dist/linter/rules/schema-valid.js.map +1 -0
- package/dist/linter/rules/semver-version.d.ts +3 -0
- package/dist/linter/rules/semver-version.d.ts.map +1 -0
- package/dist/linter/rules/semver-version.js +34 -0
- package/dist/linter/rules/semver-version.js.map +1 -0
- package/dist/linter/rules/tools-check-command.d.ts +3 -0
- package/dist/linter/rules/tools-check-command.d.ts.map +1 -0
- package/dist/linter/rules/tools-check-command.js +27 -0
- package/dist/linter/rules/tools-check-command.js.map +1 -0
- package/dist/linter/types.d.ts +31 -0
- package/dist/linter/types.d.ts.map +1 -0
- package/dist/linter/types.js +3 -0
- package/dist/linter/types.js.map +1 -0
- package/dist/parser.d.ts +18 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +74 -0
- package/dist/parser.js.map +1 -0
- package/dist/schema/dossier-schema.json +745 -0
- package/dist/signature.d.ts +33 -0
- package/dist/signature.d.ts.map +1 -0
- package/dist/signature.js +111 -0
- package/dist/signature.js.map +1 -0
- package/dist/signers/ed25519.d.ts +17 -0
- package/dist/signers/ed25519.d.ts.map +1 -0
- package/dist/signers/ed25519.js +66 -0
- package/dist/signers/ed25519.js.map +1 -0
- package/dist/signers/index.d.ts +39 -0
- package/dist/signers/index.d.ts.map +1 -0
- package/dist/signers/index.js +18 -0
- package/dist/signers/index.js.map +1 -0
- package/dist/signers/kms.d.ts +20 -0
- package/dist/signers/kms.d.ts.map +1 -0
- package/dist/signers/kms.js +108 -0
- package/dist/signers/kms.js.map +1 -0
- package/dist/signers/registry.d.ts +29 -0
- package/dist/signers/registry.d.ts.map +1 -0
- package/dist/signers/registry.js +67 -0
- package/dist/signers/registry.js.map +1 -0
- package/dist/types.d.ts +79 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/crypto.d.ts +16 -0
- package/dist/utils/crypto.d.ts.map +1 -0
- package/dist/utils/crypto.js +25 -0
- package/dist/utils/crypto.js.map +1 -0
- package/dist/utils/errors.d.ts +18 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +32 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/fs.d.ts +12 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +24 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/verification.d.ts +11 -0
- package/dist/utils/verification.d.ts.map +1 -0
- package/dist/utils/verification.js +35 -0
- package/dist/utils/verification.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.checksumValidRule = void 0;
|
|
4
|
+
const checksum_1 = require("../../checksum");
|
|
5
|
+
exports.checksumValidRule = {
|
|
6
|
+
id: 'checksum-valid',
|
|
7
|
+
description: 'Verify checksum hash matches body content',
|
|
8
|
+
defaultSeverity: 'error',
|
|
9
|
+
run(context) {
|
|
10
|
+
const checksum = context.frontmatter.checksum;
|
|
11
|
+
if (!checksum) {
|
|
12
|
+
return [
|
|
13
|
+
{
|
|
14
|
+
ruleId: 'checksum-valid',
|
|
15
|
+
severity: 'error',
|
|
16
|
+
message: 'Missing checksum field in frontmatter',
|
|
17
|
+
field: 'checksum',
|
|
18
|
+
},
|
|
19
|
+
];
|
|
20
|
+
}
|
|
21
|
+
const checksumObj = checksum;
|
|
22
|
+
if (!checksumObj.hash) {
|
|
23
|
+
return [
|
|
24
|
+
{
|
|
25
|
+
ruleId: 'checksum-valid',
|
|
26
|
+
severity: 'error',
|
|
27
|
+
message: 'Checksum object missing hash field',
|
|
28
|
+
field: 'checksum.hash',
|
|
29
|
+
},
|
|
30
|
+
];
|
|
31
|
+
}
|
|
32
|
+
const actualHash = (0, checksum_1.calculateChecksum)(context.body);
|
|
33
|
+
if (actualHash !== checksumObj.hash) {
|
|
34
|
+
return [
|
|
35
|
+
{
|
|
36
|
+
ruleId: 'checksum-valid',
|
|
37
|
+
severity: 'error',
|
|
38
|
+
message: `Checksum mismatch: expected ${checksumObj.hash.slice(0, 16)}..., got ${actualHash.slice(0, 16)}...`,
|
|
39
|
+
field: 'checksum.hash',
|
|
40
|
+
},
|
|
41
|
+
];
|
|
42
|
+
}
|
|
43
|
+
return [];
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=checksum-valid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checksum-valid.js","sourceRoot":"","sources":["../../../src/linter/rules/checksum-valid.ts"],"names":[],"mappings":";;;AAAA,6CAAmD;AAGtC,QAAA,iBAAiB,GAAa;IACzC,EAAE,EAAE,gBAAgB;IACpB,WAAW,EAAE,2CAA2C;IACxD,eAAe,EAAE,OAAO;IACxB,GAAG,CAAC,OAAO;QACT,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC;QAE9C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;gBACL;oBACE,MAAM,EAAE,gBAAgB;oBACxB,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,uCAAuC;oBAChD,KAAK,EAAE,UAAU;iBAClB;aACF,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAG,QAAiD,CAAC;QACtE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;YACtB,OAAO;gBACL;oBACE,MAAM,EAAE,gBAAgB;oBACxB,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,oCAAoC;oBAC7C,KAAK,EAAE,eAAe;iBACvB;aACF,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,IAAA,4BAAiB,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,UAAU,KAAK,WAAW,CAAC,IAAI,EAAE,CAAC;YACpC,OAAO;gBACL;oBACE,MAAM,EAAE,gBAAgB;oBACxB,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,+BAA+B,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK;oBAC7G,KAAK,EAAE,eAAe;iBACvB;aACF,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { LintRule } from '../types';
|
|
2
|
+
import { checksumValidRule } from './checksum-valid';
|
|
3
|
+
import { objectiveQualityRule } from './objective-quality';
|
|
4
|
+
import { requiredSectionsRule } from './required-sections';
|
|
5
|
+
import { riskLevelConsistencyRule } from './risk-level-consistency';
|
|
6
|
+
import { schemaValidRule } from './schema-valid';
|
|
7
|
+
import { semverVersionRule } from './semver-version';
|
|
8
|
+
import { toolsCheckCommandRule } from './tools-check-command';
|
|
9
|
+
export { checksumValidRule, objectiveQualityRule, requiredSectionsRule, riskLevelConsistencyRule, schemaValidRule, semverVersionRule, toolsCheckCommandRule, };
|
|
10
|
+
export declare const defaultRules: LintRule[];
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
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;
|
|
4
|
+
const checksum_valid_1 = require("./checksum-valid");
|
|
5
|
+
Object.defineProperty(exports, "checksumValidRule", { enumerable: true, get: function () { return checksum_valid_1.checksumValidRule; } });
|
|
6
|
+
const objective_quality_1 = require("./objective-quality");
|
|
7
|
+
Object.defineProperty(exports, "objectiveQualityRule", { enumerable: true, get: function () { return objective_quality_1.objectiveQualityRule; } });
|
|
8
|
+
const required_sections_1 = require("./required-sections");
|
|
9
|
+
Object.defineProperty(exports, "requiredSectionsRule", { enumerable: true, get: function () { return required_sections_1.requiredSectionsRule; } });
|
|
10
|
+
const risk_level_consistency_1 = require("./risk-level-consistency");
|
|
11
|
+
Object.defineProperty(exports, "riskLevelConsistencyRule", { enumerable: true, get: function () { return risk_level_consistency_1.riskLevelConsistencyRule; } });
|
|
12
|
+
const schema_valid_1 = require("./schema-valid");
|
|
13
|
+
Object.defineProperty(exports, "schemaValidRule", { enumerable: true, get: function () { return schema_valid_1.schemaValidRule; } });
|
|
14
|
+
const semver_version_1 = require("./semver-version");
|
|
15
|
+
Object.defineProperty(exports, "semverVersionRule", { enumerable: true, get: function () { return semver_version_1.semverVersionRule; } });
|
|
16
|
+
const tools_check_command_1 = require("./tools-check-command");
|
|
17
|
+
Object.defineProperty(exports, "toolsCheckCommandRule", { enumerable: true, get: function () { return tools_check_command_1.toolsCheckCommandRule; } });
|
|
18
|
+
exports.defaultRules = [
|
|
19
|
+
schema_valid_1.schemaValidRule,
|
|
20
|
+
checksum_valid_1.checksumValidRule,
|
|
21
|
+
semver_version_1.semverVersionRule,
|
|
22
|
+
risk_level_consistency_1.riskLevelConsistencyRule,
|
|
23
|
+
tools_check_command_1.toolsCheckCommandRule,
|
|
24
|
+
objective_quality_1.objectiveQualityRule,
|
|
25
|
+
required_sections_1.requiredSectionsRule,
|
|
26
|
+
];
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"objective-quality.d.ts","sourceRoot":"","sources":["../../../src/linter/rules/objective-quality.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,oBAAoB,EAAE,QA6ClC,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.objectiveQualityRule = void 0;
|
|
4
|
+
exports.objectiveQualityRule = {
|
|
5
|
+
id: 'objective-quality',
|
|
6
|
+
description: 'Objective should be a clear, concise statement',
|
|
7
|
+
defaultSeverity: 'info',
|
|
8
|
+
run(context) {
|
|
9
|
+
const objective = context.frontmatter.objective;
|
|
10
|
+
const diagnostics = [];
|
|
11
|
+
if (!objective) {
|
|
12
|
+
return [];
|
|
13
|
+
}
|
|
14
|
+
if (objective.length < 20) {
|
|
15
|
+
diagnostics.push({
|
|
16
|
+
ruleId: 'objective-quality',
|
|
17
|
+
severity: 'info',
|
|
18
|
+
message: `Objective is very short (${objective.length} chars) — consider being more descriptive`,
|
|
19
|
+
field: 'objective',
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
if (objective.length > 300) {
|
|
23
|
+
diagnostics.push({
|
|
24
|
+
ruleId: 'objective-quality',
|
|
25
|
+
severity: 'info',
|
|
26
|
+
message: `Objective is very long (${objective.length} chars) — consider being more concise (1-3 sentences)`,
|
|
27
|
+
field: 'objective',
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
// Check if objective starts with a verb (common best practice)
|
|
31
|
+
const firstWord = objective.split(/\s+/)[0]?.toLowerCase();
|
|
32
|
+
const commonNonVerbs = ['the', 'this', 'a', 'an', 'it', 'my'];
|
|
33
|
+
if (firstWord && commonNonVerbs.includes(firstWord)) {
|
|
34
|
+
diagnostics.push({
|
|
35
|
+
ruleId: 'objective-quality',
|
|
36
|
+
severity: 'info',
|
|
37
|
+
message: 'Objective should start with a verb (e.g., "Configure...", "Deploy...", "Set up...")',
|
|
38
|
+
field: 'objective',
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return diagnostics;
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=objective-quality.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"objective-quality.js","sourceRoot":"","sources":["../../../src/linter/rules/objective-quality.ts"],"names":[],"mappings":";;;AAEa,QAAA,oBAAoB,GAAa;IAC5C,EAAE,EAAE,mBAAmB;IACvB,WAAW,EAAE,gDAAgD;IAC7D,eAAe,EAAE,MAAM;IACvB,GAAG,CAAC,OAAO;QACT,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC;QAChD,MAAM,WAAW,GAAG,EAAE,CAAC;QAEvB,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAC1B,WAAW,CAAC,IAAI,CAAC;gBACf,MAAM,EAAE,mBAAmB;gBAC3B,QAAQ,EAAE,MAAe;gBACzB,OAAO,EAAE,4BAA4B,SAAS,CAAC,MAAM,2CAA2C;gBAChG,KAAK,EAAE,WAAW;aACnB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YAC3B,WAAW,CAAC,IAAI,CAAC;gBACf,MAAM,EAAE,mBAAmB;gBAC3B,QAAQ,EAAE,MAAe;gBACzB,OAAO,EAAE,2BAA2B,SAAS,CAAC,MAAM,uDAAuD;gBAC3G,KAAK,EAAE,WAAW;aACnB,CAAC,CAAC;QACL,CAAC;QAED,+DAA+D;QAC/D,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;QAC3D,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9D,IAAI,SAAS,IAAI,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACpD,WAAW,CAAC,IAAI,CAAC;gBACf,MAAM,EAAE,mBAAmB;gBAC3B,QAAQ,EAAE,MAAe;gBACzB,OAAO,EACL,qFAAqF;gBACvF,KAAK,EAAE,WAAW;aACnB,CAAC,CAAC;QACL,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"required-sections.d.ts","sourceRoot":"","sources":["../../../src/linter/rules/required-sections.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,oBAAoB,EAAE,QA8BlC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.requiredSectionsRule = void 0;
|
|
4
|
+
exports.requiredSectionsRule = {
|
|
5
|
+
id: 'required-sections',
|
|
6
|
+
description: 'Markdown body should contain at least one ## heading',
|
|
7
|
+
defaultSeverity: 'warning',
|
|
8
|
+
run(context) {
|
|
9
|
+
const body = context.body;
|
|
10
|
+
if (!body || body.trim().length === 0) {
|
|
11
|
+
return [
|
|
12
|
+
{
|
|
13
|
+
ruleId: 'required-sections',
|
|
14
|
+
severity: 'warning',
|
|
15
|
+
message: 'Dossier body is empty — add markdown content with ## sections',
|
|
16
|
+
},
|
|
17
|
+
];
|
|
18
|
+
}
|
|
19
|
+
const headingRegex = /^##\s+.+/m;
|
|
20
|
+
if (!headingRegex.test(body)) {
|
|
21
|
+
return [
|
|
22
|
+
{
|
|
23
|
+
ruleId: 'required-sections',
|
|
24
|
+
severity: 'warning',
|
|
25
|
+
message: 'Dossier body has no ## headings — add sections to organize content',
|
|
26
|
+
},
|
|
27
|
+
];
|
|
28
|
+
}
|
|
29
|
+
return [];
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=required-sections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"required-sections.js","sourceRoot":"","sources":["../../../src/linter/rules/required-sections.ts"],"names":[],"mappings":";;;AAEa,QAAA,oBAAoB,GAAa;IAC5C,EAAE,EAAE,mBAAmB;IACvB,WAAW,EAAE,sDAAsD;IACnE,eAAe,EAAE,SAAS;IAC1B,GAAG,CAAC,OAAO;QACT,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAE1B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtC,OAAO;gBACL;oBACE,MAAM,EAAE,mBAAmB;oBAC3B,QAAQ,EAAE,SAAS;oBACnB,OAAO,EAAE,+DAA+D;iBACzE;aACF,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAAG,WAAW,CAAC;QACjC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,OAAO;gBACL;oBACE,MAAM,EAAE,mBAAmB;oBAC3B,QAAQ,EAAE,SAAS;oBACnB,OAAO,EAAE,oEAAoE;iBAC9E;aACF,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.riskLevelConsistencyRule = void 0;
|
|
4
|
+
exports.riskLevelConsistencyRule = {
|
|
5
|
+
id: 'risk-level-consistency',
|
|
6
|
+
description: 'Risk level should be consistent with destructive operations',
|
|
7
|
+
defaultSeverity: 'warning',
|
|
8
|
+
run(context) {
|
|
9
|
+
const { risk_level, destructive_operations } = context.frontmatter;
|
|
10
|
+
const diagnostics = [];
|
|
11
|
+
if (risk_level === 'low' &&
|
|
12
|
+
Array.isArray(destructive_operations) &&
|
|
13
|
+
destructive_operations.length > 0) {
|
|
14
|
+
diagnostics.push({
|
|
15
|
+
ruleId: 'risk-level-consistency',
|
|
16
|
+
severity: 'warning',
|
|
17
|
+
message: `risk_level is "low" but ${destructive_operations.length} destructive operation(s) declared — consider "medium" or higher`,
|
|
18
|
+
field: 'risk_level',
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
return diagnostics;
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=risk-level-consistency.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-valid.d.ts","sourceRoot":"","sources":["../../../src/linter/rules/schema-valid.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAKzC,eAAO,MAAM,eAAe,EAAE,QAiD7B,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.schemaValidRule = void 0;
|
|
7
|
+
const ajv_1 = __importDefault(require("ajv"));
|
|
8
|
+
const dossier_schema_json_1 = __importDefault(require("../../schema/dossier-schema.json"));
|
|
9
|
+
const ajv = new ajv_1.default({ allErrors: true, strict: false, validateFormats: false });
|
|
10
|
+
const validate = ajv.compile(dossier_schema_json_1.default);
|
|
11
|
+
exports.schemaValidRule = {
|
|
12
|
+
id: 'schema-valid',
|
|
13
|
+
description: 'Validate frontmatter against the full JSON Schema',
|
|
14
|
+
defaultSeverity: 'error',
|
|
15
|
+
run(context) {
|
|
16
|
+
const valid = validate(context.frontmatter);
|
|
17
|
+
if (valid) {
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
20
|
+
return (validate.errors || []).map((err) => {
|
|
21
|
+
const path = err.instancePath || '';
|
|
22
|
+
const field = path.replace(/^\//, '').replace(/\//g, '.');
|
|
23
|
+
// Simplify oneOf errors for signature field
|
|
24
|
+
if (err.keyword === 'oneOf' && field === 'signature') {
|
|
25
|
+
return {
|
|
26
|
+
ruleId: 'schema-valid',
|
|
27
|
+
severity: 'error',
|
|
28
|
+
message: 'signature must match either AWS KMS (ecdsa-sha256) or Ed25519 format',
|
|
29
|
+
field: 'signature',
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
let message;
|
|
33
|
+
if (err.keyword === 'required') {
|
|
34
|
+
message = `Missing required field: ${err.params.missingProperty}`;
|
|
35
|
+
}
|
|
36
|
+
else if (err.keyword === 'enum') {
|
|
37
|
+
message = `${field || 'value'} must be one of: ${err.params.allowedValues.join(', ')}`;
|
|
38
|
+
}
|
|
39
|
+
else if (err.keyword === 'const') {
|
|
40
|
+
message = `${field || 'value'} must be ${JSON.stringify(err.params.allowedValue)}`;
|
|
41
|
+
}
|
|
42
|
+
else if (err.keyword === 'minLength') {
|
|
43
|
+
message = `${field || 'value'} is too short (minimum ${err.params.limit} characters)`;
|
|
44
|
+
}
|
|
45
|
+
else if (err.keyword === 'maxLength') {
|
|
46
|
+
message = `${field || 'value'} is too long (maximum ${err.params.limit} characters)`;
|
|
47
|
+
}
|
|
48
|
+
else if (err.keyword === 'pattern') {
|
|
49
|
+
message = `${field || 'value'} does not match expected pattern`;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
message = `${field || 'value'}: ${err.message}`;
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
ruleId: 'schema-valid',
|
|
56
|
+
severity: 'error',
|
|
57
|
+
message,
|
|
58
|
+
field: field || undefined,
|
|
59
|
+
};
|
|
60
|
+
});
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=schema-valid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-valid.js","sourceRoot":"","sources":["../../../src/linter/rules/schema-valid.ts"],"names":[],"mappings":";;;;;;AAAA,8CAAsB;AACtB,2FAA6D;AAG7D,MAAM,GAAG,GAAG,IAAI,aAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC;AAChF,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,6BAAa,CAAC,CAAC;AAE/B,QAAA,eAAe,GAAa;IACvC,EAAE,EAAE,cAAc;IAClB,WAAW,EAAE,mDAAmD;IAChE,eAAe,EAAE,OAAO;IACxB,GAAG,CAAC,OAAO;QACT,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC5C,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACzC,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAE1D,4CAA4C;YAC5C,IAAI,GAAG,CAAC,OAAO,KAAK,OAAO,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;gBACrD,OAAO;oBACL,MAAM,EAAE,cAAc;oBACtB,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,sEAAsE;oBAC/E,KAAK,EAAE,WAAW;iBACnB,CAAC;YACJ,CAAC;YAED,IAAI,OAAe,CAAC;YACpB,IAAI,GAAG,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;gBAC/B,OAAO,GAAG,2BAA2B,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;YACpE,CAAC;iBAAM,IAAI,GAAG,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;gBAClC,OAAO,GAAG,GAAG,KAAK,IAAI,OAAO,oBAAoB,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzF,CAAC;iBAAM,IAAI,GAAG,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;gBACnC,OAAO,GAAG,GAAG,KAAK,IAAI,OAAO,YAAY,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;YACrF,CAAC;iBAAM,IAAI,GAAG,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;gBACvC,OAAO,GAAG,GAAG,KAAK,IAAI,OAAO,0BAA0B,GAAG,CAAC,MAAM,CAAC,KAAK,cAAc,CAAC;YACxF,CAAC;iBAAM,IAAI,GAAG,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;gBACvC,OAAO,GAAG,GAAG,KAAK,IAAI,OAAO,yBAAyB,GAAG,CAAC,MAAM,CAAC,KAAK,cAAc,CAAC;YACvF,CAAC;iBAAM,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBACrC,OAAO,GAAG,GAAG,KAAK,IAAI,OAAO,kCAAkC,CAAC;YAClE,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,GAAG,KAAK,IAAI,OAAO,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC;YAClD,CAAC;YAED,OAAO;gBACL,MAAM,EAAE,cAAc;gBACtB,QAAQ,EAAE,OAAgB;gBAC1B,OAAO;gBACP,KAAK,EAAE,KAAK,IAAI,SAAS;aAC1B,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semver-version.d.ts","sourceRoot":"","sources":["../../../src/linter/rules/semver-version.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAIzC,eAAO,MAAM,iBAAiB,EAAE,QA+B/B,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.semverVersionRule = void 0;
|
|
4
|
+
const SEMVER_REGEX = /^\d+\.\d+\.\d+(-[a-zA-Z0-9.-]+)?(\+[a-zA-Z0-9.-]+)?$/;
|
|
5
|
+
exports.semverVersionRule = {
|
|
6
|
+
id: 'semver-version',
|
|
7
|
+
description: 'Version field must be valid semver',
|
|
8
|
+
defaultSeverity: 'error',
|
|
9
|
+
run(context) {
|
|
10
|
+
const version = context.frontmatter.version;
|
|
11
|
+
if (!version) {
|
|
12
|
+
return [
|
|
13
|
+
{
|
|
14
|
+
ruleId: 'semver-version',
|
|
15
|
+
severity: 'error',
|
|
16
|
+
message: 'Missing version field',
|
|
17
|
+
field: 'version',
|
|
18
|
+
},
|
|
19
|
+
];
|
|
20
|
+
}
|
|
21
|
+
if (!SEMVER_REGEX.test(version)) {
|
|
22
|
+
return [
|
|
23
|
+
{
|
|
24
|
+
ruleId: 'semver-version',
|
|
25
|
+
severity: 'error',
|
|
26
|
+
message: `Invalid semver version: "${version}"`,
|
|
27
|
+
field: 'version',
|
|
28
|
+
},
|
|
29
|
+
];
|
|
30
|
+
}
|
|
31
|
+
return [];
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=semver-version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semver-version.js","sourceRoot":"","sources":["../../../src/linter/rules/semver-version.ts"],"names":[],"mappings":";;;AAEA,MAAM,YAAY,GAAG,sDAAsD,CAAC;AAE/D,QAAA,iBAAiB,GAAa;IACzC,EAAE,EAAE,gBAAgB;IACpB,WAAW,EAAE,oCAAoC;IACjD,eAAe,EAAE,OAAO;IACxB,GAAG,CAAC,OAAO;QACT,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;QAE5C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;gBACL;oBACE,MAAM,EAAE,gBAAgB;oBACxB,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,uBAAuB;oBAChC,KAAK,EAAE,SAAS;iBACjB;aACF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAChC,OAAO;gBACL;oBACE,MAAM,EAAE,gBAAgB;oBACxB,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,4BAA4B,OAAO,GAAG;oBAC/C,KAAK,EAAE,SAAS;iBACjB;aACF,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toolsCheckCommandRule = void 0;
|
|
4
|
+
exports.toolsCheckCommandRule = {
|
|
5
|
+
id: 'tools-check-command',
|
|
6
|
+
description: 'tools_required entries should have a check_command',
|
|
7
|
+
defaultSeverity: 'warning',
|
|
8
|
+
run(context) {
|
|
9
|
+
const tools = context.frontmatter.tools_required;
|
|
10
|
+
if (!Array.isArray(tools) || tools.length === 0) {
|
|
11
|
+
return [];
|
|
12
|
+
}
|
|
13
|
+
const diagnostics = [];
|
|
14
|
+
for (const tool of tools) {
|
|
15
|
+
if (!tool.check_command) {
|
|
16
|
+
diagnostics.push({
|
|
17
|
+
ruleId: 'tools-check-command',
|
|
18
|
+
severity: 'warning',
|
|
19
|
+
message: `Tool "${tool.name}" is missing check_command — users cannot verify availability`,
|
|
20
|
+
field: 'tools_required',
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return diagnostics;
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=tools-check-command.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { DossierFrontmatter } from '../types';
|
|
2
|
+
export type LintSeverity = 'error' | 'warning' | 'info';
|
|
3
|
+
export interface LintDiagnostic {
|
|
4
|
+
ruleId: string;
|
|
5
|
+
severity: LintSeverity;
|
|
6
|
+
message: string;
|
|
7
|
+
field?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface LintRuleContext {
|
|
10
|
+
frontmatter: DossierFrontmatter;
|
|
11
|
+
body: string;
|
|
12
|
+
raw: string;
|
|
13
|
+
}
|
|
14
|
+
export interface LintRule {
|
|
15
|
+
id: string;
|
|
16
|
+
description: string;
|
|
17
|
+
defaultSeverity: LintSeverity;
|
|
18
|
+
run(context: LintRuleContext): LintDiagnostic[];
|
|
19
|
+
}
|
|
20
|
+
export type RuleSeverityOverride = LintSeverity | 'off';
|
|
21
|
+
export interface LintConfig {
|
|
22
|
+
rules: Record<string, RuleSeverityOverride>;
|
|
23
|
+
}
|
|
24
|
+
export interface LintResult {
|
|
25
|
+
file?: string;
|
|
26
|
+
diagnostics: LintDiagnostic[];
|
|
27
|
+
errorCount: number;
|
|
28
|
+
warningCount: number;
|
|
29
|
+
infoCount: number;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/linter/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAEnD,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAExD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,kBAAkB,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,YAAY,CAAC;IAC9B,GAAG,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc,EAAE,CAAC;CACjD;AAED,MAAM,MAAM,oBAAoB,GAAG,YAAY,GAAG,KAAK,CAAC;AAExD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/linter/types.ts"],"names":[],"mappings":""}
|
package/dist/parser.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dossier parser - extracts frontmatter and body from dossier files
|
|
3
|
+
*/
|
|
4
|
+
import type { DossierFrontmatter, ParsedDossier } from './types';
|
|
5
|
+
/**
|
|
6
|
+
* Parse dossier content into frontmatter and body
|
|
7
|
+
* Format: ---dossier\n{JSON}\n---\n[body]
|
|
8
|
+
*/
|
|
9
|
+
export declare function parseDossierContent(content: string): ParsedDossier;
|
|
10
|
+
/**
|
|
11
|
+
* Read and parse a dossier file
|
|
12
|
+
*/
|
|
13
|
+
export declare function parseDossierFile(filePath: string): ParsedDossier;
|
|
14
|
+
/**
|
|
15
|
+
* Validate required frontmatter fields
|
|
16
|
+
*/
|
|
17
|
+
export declare function validateFrontmatter(frontmatter: DossierFrontmatter): string[];
|
|
18
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAIjE;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAuBlE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAGhE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,kBAAkB,GAAG,MAAM,EAAE,CAmC7E"}
|
package/dist/parser.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Dossier parser - extracts frontmatter and body from dossier files
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.parseDossierContent = parseDossierContent;
|
|
7
|
+
exports.parseDossierFile = parseDossierFile;
|
|
8
|
+
exports.validateFrontmatter = validateFrontmatter;
|
|
9
|
+
const errors_1 = require("./utils/errors");
|
|
10
|
+
const fs_1 = require("./utils/fs");
|
|
11
|
+
/**
|
|
12
|
+
* Parse dossier content into frontmatter and body
|
|
13
|
+
* Format: ---dossier\n{JSON}\n---\n[body]
|
|
14
|
+
*/
|
|
15
|
+
function parseDossierContent(content) {
|
|
16
|
+
const frontmatterRegex = /^---dossier\s*\n([\s\S]*?)\n---\s*\n([\s\S]*)$/m;
|
|
17
|
+
const match = content.match(frontmatterRegex);
|
|
18
|
+
if (!match) {
|
|
19
|
+
throw new Error('Invalid dossier format. Expected:\n---dossier\n{...}\n---\n[body]');
|
|
20
|
+
}
|
|
21
|
+
const frontmatterJson = match[1];
|
|
22
|
+
const body = match[2];
|
|
23
|
+
let frontmatter;
|
|
24
|
+
try {
|
|
25
|
+
frontmatter = JSON.parse(frontmatterJson);
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
throw new Error(`Failed to parse frontmatter JSON: ${(0, errors_1.getErrorMessage)(err)}`);
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
frontmatter,
|
|
32
|
+
body,
|
|
33
|
+
raw: content,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Read and parse a dossier file
|
|
38
|
+
*/
|
|
39
|
+
function parseDossierFile(filePath) {
|
|
40
|
+
const content = (0, fs_1.readFileIfExists)(filePath, 'Dossier file not found: {path}');
|
|
41
|
+
return parseDossierContent(content);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Validate required frontmatter fields
|
|
45
|
+
*/
|
|
46
|
+
function validateFrontmatter(frontmatter) {
|
|
47
|
+
const errors = [];
|
|
48
|
+
const required = [
|
|
49
|
+
'version',
|
|
50
|
+
'protocol_version',
|
|
51
|
+
'title',
|
|
52
|
+
'objective',
|
|
53
|
+
'risk_level',
|
|
54
|
+
'risk_factors',
|
|
55
|
+
'destructive_operations',
|
|
56
|
+
];
|
|
57
|
+
for (const field of required) {
|
|
58
|
+
if (!(field in frontmatter)) {
|
|
59
|
+
errors.push(`Missing required field: ${field}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Validate risk_level enum
|
|
63
|
+
const validRiskLevels = ['low', 'medium', 'high', 'critical'];
|
|
64
|
+
if (frontmatter.risk_level && !validRiskLevels.includes(frontmatter.risk_level)) {
|
|
65
|
+
errors.push(`Invalid risk_level: ${frontmatter.risk_level}. Must be one of: ${validRiskLevels.join(', ')}`);
|
|
66
|
+
}
|
|
67
|
+
// Validate status enum
|
|
68
|
+
const validStatuses = ['draft', 'stable', 'deprecated'];
|
|
69
|
+
if (frontmatter.status && !validStatuses.includes(frontmatter.status)) {
|
|
70
|
+
errors.push(`Invalid status: ${frontmatter.status}. Must be one of: ${validStatuses.join(', ')}`);
|
|
71
|
+
}
|
|
72
|
+
return errors;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAUH,kDAuBC;AAKD,4CAGC;AAKD,kDAmCC;AA9ED,2CAAiD;AACjD,mCAA8C;AAE9C;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,OAAe;IACjD,MAAM,gBAAgB,GAAG,iDAAiD,CAAC;IAC3E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAE9C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAEtB,IAAI,WAA+B,CAAC;IACpC,IAAI,CAAC;QACH,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAA,wBAAe,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,OAAO;QACL,WAAW;QACX,IAAI;QACJ,GAAG,EAAE,OAAO;KACb,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,QAAgB;IAC/C,MAAM,OAAO,GAAG,IAAA,qBAAgB,EAAC,QAAQ,EAAE,gCAAgC,CAAW,CAAC;IACvF,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CAAC,WAA+B;IACjE,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAG;QACf,SAAS;QACT,kBAAkB;QAClB,OAAO;QACP,WAAW;QACX,YAAY;QACZ,cAAc;QACd,wBAAwB;KACzB,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC,CAAC,KAAK,IAAI,WAAW,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,2BAA2B;IAC3B,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAC9D,IAAI,WAAW,CAAC,UAAU,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;QAChF,MAAM,CAAC,IAAI,CACT,uBAAuB,WAAW,CAAC,UAAU,qBAAqB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC/F,CAAC;IACJ,CAAC;IAED,uBAAuB;IACvB,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IACxD,IAAI,WAAW,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACtE,MAAM,CAAC,IAAI,CACT,mBAAmB,WAAW,CAAC,MAAM,qBAAqB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrF,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|