@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.
Files changed (114) hide show
  1. package/dist/checksum.d.ts +15 -0
  2. package/dist/checksum.d.ts.map +1 -0
  3. package/dist/checksum.js +45 -0
  4. package/dist/checksum.js.map +1 -0
  5. package/dist/formatter/formatter.d.ts +3 -0
  6. package/dist/formatter/formatter.d.ts.map +1 -0
  7. package/dist/formatter/formatter.js +120 -0
  8. package/dist/formatter/formatter.js.map +1 -0
  9. package/dist/formatter/index.d.ts +5 -0
  10. package/dist/formatter/index.d.ts.map +1 -0
  11. package/dist/formatter/index.js +32 -0
  12. package/dist/formatter/index.js.map +1 -0
  13. package/dist/formatter/types.d.ts +11 -0
  14. package/dist/formatter/types.d.ts.map +1 -0
  15. package/dist/formatter/types.js +9 -0
  16. package/dist/formatter/types.js.map +1 -0
  17. package/dist/index.d.ts +23 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +77 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/linter/config.d.ts +4 -0
  22. package/dist/linter/config.d.ts.map +1 -0
  23. package/dist/linter/config.js +42 -0
  24. package/dist/linter/config.js.map +1 -0
  25. package/dist/linter/index.d.ts +8 -0
  26. package/dist/linter/index.d.ts.map +1 -0
  27. package/dist/linter/index.js +69 -0
  28. package/dist/linter/index.js.map +1 -0
  29. package/dist/linter/registry.d.ts +10 -0
  30. package/dist/linter/registry.d.ts.map +1 -0
  31. package/dist/linter/registry.js +37 -0
  32. package/dist/linter/registry.js.map +1 -0
  33. package/dist/linter/rules/checksum-valid.d.ts +3 -0
  34. package/dist/linter/rules/checksum-valid.d.ts.map +1 -0
  35. package/dist/linter/rules/checksum-valid.js +46 -0
  36. package/dist/linter/rules/checksum-valid.js.map +1 -0
  37. package/dist/linter/rules/index.d.ts +11 -0
  38. package/dist/linter/rules/index.d.ts.map +1 -0
  39. package/dist/linter/rules/index.js +27 -0
  40. package/dist/linter/rules/index.js.map +1 -0
  41. package/dist/linter/rules/objective-quality.d.ts +3 -0
  42. package/dist/linter/rules/objective-quality.d.ts.map +1 -0
  43. package/dist/linter/rules/objective-quality.js +44 -0
  44. package/dist/linter/rules/objective-quality.js.map +1 -0
  45. package/dist/linter/rules/required-sections.d.ts +3 -0
  46. package/dist/linter/rules/required-sections.d.ts.map +1 -0
  47. package/dist/linter/rules/required-sections.js +32 -0
  48. package/dist/linter/rules/required-sections.js.map +1 -0
  49. package/dist/linter/rules/risk-level-consistency.d.ts +3 -0
  50. package/dist/linter/rules/risk-level-consistency.d.ts.map +1 -0
  51. package/dist/linter/rules/risk-level-consistency.js +24 -0
  52. package/dist/linter/rules/risk-level-consistency.js.map +1 -0
  53. package/dist/linter/rules/schema-valid.d.ts +3 -0
  54. package/dist/linter/rules/schema-valid.d.ts.map +1 -0
  55. package/dist/linter/rules/schema-valid.js +63 -0
  56. package/dist/linter/rules/schema-valid.js.map +1 -0
  57. package/dist/linter/rules/semver-version.d.ts +3 -0
  58. package/dist/linter/rules/semver-version.d.ts.map +1 -0
  59. package/dist/linter/rules/semver-version.js +34 -0
  60. package/dist/linter/rules/semver-version.js.map +1 -0
  61. package/dist/linter/rules/tools-check-command.d.ts +3 -0
  62. package/dist/linter/rules/tools-check-command.d.ts.map +1 -0
  63. package/dist/linter/rules/tools-check-command.js +27 -0
  64. package/dist/linter/rules/tools-check-command.js.map +1 -0
  65. package/dist/linter/types.d.ts +31 -0
  66. package/dist/linter/types.d.ts.map +1 -0
  67. package/dist/linter/types.js +3 -0
  68. package/dist/linter/types.js.map +1 -0
  69. package/dist/parser.d.ts +18 -0
  70. package/dist/parser.d.ts.map +1 -0
  71. package/dist/parser.js +74 -0
  72. package/dist/parser.js.map +1 -0
  73. package/dist/schema/dossier-schema.json +745 -0
  74. package/dist/signature.d.ts +33 -0
  75. package/dist/signature.d.ts.map +1 -0
  76. package/dist/signature.js +111 -0
  77. package/dist/signature.js.map +1 -0
  78. package/dist/signers/ed25519.d.ts +17 -0
  79. package/dist/signers/ed25519.d.ts.map +1 -0
  80. package/dist/signers/ed25519.js +66 -0
  81. package/dist/signers/ed25519.js.map +1 -0
  82. package/dist/signers/index.d.ts +39 -0
  83. package/dist/signers/index.d.ts.map +1 -0
  84. package/dist/signers/index.js +18 -0
  85. package/dist/signers/index.js.map +1 -0
  86. package/dist/signers/kms.d.ts +20 -0
  87. package/dist/signers/kms.d.ts.map +1 -0
  88. package/dist/signers/kms.js +108 -0
  89. package/dist/signers/kms.js.map +1 -0
  90. package/dist/signers/registry.d.ts +29 -0
  91. package/dist/signers/registry.d.ts.map +1 -0
  92. package/dist/signers/registry.js +67 -0
  93. package/dist/signers/registry.js.map +1 -0
  94. package/dist/types.d.ts +79 -0
  95. package/dist/types.d.ts.map +1 -0
  96. package/dist/types.js +6 -0
  97. package/dist/types.js.map +1 -0
  98. package/dist/utils/crypto.d.ts +16 -0
  99. package/dist/utils/crypto.d.ts.map +1 -0
  100. package/dist/utils/crypto.js +25 -0
  101. package/dist/utils/crypto.js.map +1 -0
  102. package/dist/utils/errors.d.ts +18 -0
  103. package/dist/utils/errors.d.ts.map +1 -0
  104. package/dist/utils/errors.js +32 -0
  105. package/dist/utils/errors.js.map +1 -0
  106. package/dist/utils/fs.d.ts +12 -0
  107. package/dist/utils/fs.d.ts.map +1 -0
  108. package/dist/utils/fs.js +24 -0
  109. package/dist/utils/fs.js.map +1 -0
  110. package/dist/utils/verification.d.ts +11 -0
  111. package/dist/utils/verification.d.ts.map +1 -0
  112. package/dist/utils/verification.js +35 -0
  113. package/dist/utils/verification.js.map +1 -0
  114. 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,3 @@
1
+ import type { LintRule } from '../types';
2
+ export declare const objectiveQualityRule: LintRule;
3
+ //# sourceMappingURL=objective-quality.d.ts.map
@@ -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,3 @@
1
+ import type { LintRule } from '../types';
2
+ export declare const requiredSectionsRule: LintRule;
3
+ //# sourceMappingURL=required-sections.d.ts.map
@@ -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,3 @@
1
+ import type { LintRule } from '../types';
2
+ export declare const riskLevelConsistencyRule: LintRule;
3
+ //# sourceMappingURL=risk-level-consistency.d.ts.map
@@ -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,3 @@
1
+ import type { LintRule } from '../types';
2
+ export declare const schemaValidRule: LintRule;
3
+ //# sourceMappingURL=schema-valid.d.ts.map
@@ -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,3 @@
1
+ import type { LintRule } from '../types';
2
+ export declare const semverVersionRule: LintRule;
3
+ //# sourceMappingURL=semver-version.d.ts.map
@@ -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,3 @@
1
+ import type { LintRule } from '../types';
2
+ export declare const toolsCheckCommandRule: LintRule;
3
+ //# sourceMappingURL=tools-check-command.d.ts.map
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/linter/types.ts"],"names":[],"mappings":""}
@@ -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"}