@fulmenhq/tsfulmen 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/README.md +60 -7
  3. package/config/crucible-ts/agentic/roles/README.md +3 -3
  4. package/config/crucible-ts/library/fulencode/fixtures/README.md +18 -0
  5. package/config/crucible-ts/library/fulencode/fixtures/bom/bom.yaml +14 -0
  6. package/config/crucible-ts/library/fulencode/fixtures/detection/detection.yaml +12 -0
  7. package/config/crucible-ts/library/fulencode/fixtures/invalid-encodings/base64.yaml +10 -0
  8. package/config/crucible-ts/library/fulencode/fixtures/normalization/text-safe.yaml +10 -0
  9. package/config/crucible-ts/library/fulencode/fixtures/telemetry/telemetry-test-cases.yaml +24 -0
  10. package/config/crucible-ts/library/fulencode/fixtures/valid-encodings/base64.yaml +11 -0
  11. package/config/crucible-ts/taxonomy/library/platform-modules/v1.0.0/modules.yaml +2 -2
  12. package/config/crucible-ts/taxonomy/metrics.yaml +79 -1
  13. package/dist/appidentity/index.d.ts +1 -1
  14. package/dist/appidentity/index.js +122 -56
  15. package/dist/appidentity/index.js.map +1 -1
  16. package/dist/config/index.js +122 -56
  17. package/dist/config/index.js.map +1 -1
  18. package/dist/crucible/index.js +122 -56
  19. package/dist/crucible/index.js.map +1 -1
  20. package/dist/errors/index.d.ts +1 -1
  21. package/dist/errors/index.js +122 -56
  22. package/dist/errors/index.js.map +1 -1
  23. package/dist/foundry/index.js +122 -56
  24. package/dist/foundry/index.js.map +1 -1
  25. package/dist/fulencode/index.d.ts +102 -0
  26. package/dist/fulencode/index.js +806 -0
  27. package/dist/fulencode/index.js.map +1 -0
  28. package/dist/index.d.ts +2 -2
  29. package/dist/index.js +123 -57
  30. package/dist/index.js.map +1 -1
  31. package/dist/pathfinder/index.d.ts +1 -1
  32. package/dist/pathfinder/index.js +122 -56
  33. package/dist/pathfinder/index.js.map +1 -1
  34. package/dist/reports/license-inventory.csv +7 -6
  35. package/dist/schema/index.d.ts +2 -2
  36. package/dist/schema/index.js +122 -56
  37. package/dist/schema/index.js.map +1 -1
  38. package/dist/signals/index.js +122 -56
  39. package/dist/signals/index.js.map +1 -1
  40. package/dist/telemetry/http/index.js +122 -56
  41. package/dist/telemetry/http/index.js.map +1 -1
  42. package/dist/telemetry/index.d.ts +1 -1
  43. package/dist/telemetry/index.js +122 -56
  44. package/dist/telemetry/index.js.map +1 -1
  45. package/dist/telemetry/prometheus/index.d.ts +1 -1
  46. package/dist/telemetry/prometheus/index.js +122 -56
  47. package/dist/telemetry/prometheus/index.js.map +1 -1
  48. package/dist/{types-BJswWpQC.d.ts → types-DdoeE7F5.d.ts} +1 -1
  49. package/package.json +7 -2
  50. package/schemas/crucible-ts/library/fulencode/v1.0.0/README.md +37 -0
  51. package/schemas/crucible-ts/library/fulencode/v1.0.0/bom-result.schema.json +48 -0
  52. package/schemas/crucible-ts/library/fulencode/v1.0.0/decode-options.schema.json +60 -0
  53. package/schemas/crucible-ts/library/fulencode/v1.0.0/decoding-result.schema.json +70 -0
  54. package/schemas/crucible-ts/library/fulencode/v1.0.0/detect-options.schema.json +25 -0
  55. package/schemas/crucible-ts/library/fulencode/v1.0.0/detection-result.schema.json +57 -0
  56. package/schemas/crucible-ts/library/fulencode/v1.0.0/encode-options.schema.json +71 -0
  57. package/schemas/crucible-ts/library/fulencode/v1.0.0/encoding-result.schema.json +57 -0
  58. package/schemas/crucible-ts/library/fulencode/v1.0.0/fulencode-config.schema.json +8 -4
  59. package/schemas/crucible-ts/library/fulencode/v1.0.0/fulencode-error.schema.json +66 -0
  60. package/schemas/crucible-ts/library/fulencode/v1.0.0/normalization-result.schema.json +73 -0
  61. package/schemas/crucible-ts/library/fulencode/v1.0.0/normalize-options.schema.json +44 -0
  62. package/schemas/crucible-ts/meta/README.md +38 -2
  63. package/schemas/crucible-ts/meta/draft-04/schema.json +222 -0
  64. package/schemas/crucible-ts/meta/draft-06/schema.json +218 -0
  65. package/schemas/crucible-ts/meta/draft-2019-09/meta/applicator.json +93 -0
  66. package/schemas/crucible-ts/meta/draft-2019-09/meta/content.json +21 -0
  67. package/schemas/crucible-ts/meta/draft-2019-09/meta/core.json +58 -0
  68. package/schemas/crucible-ts/meta/draft-2019-09/meta/format.json +15 -0
  69. package/schemas/crucible-ts/meta/draft-2019-09/meta/meta-data.json +35 -0
  70. package/schemas/crucible-ts/meta/draft-2019-09/meta/validation.json +119 -0
  71. package/schemas/crucible-ts/meta/draft-2019-09/offline.schema.json +148 -0
  72. package/schemas/crucible-ts/meta/draft-2019-09/schema.json +62 -0
  73. package/schemas/crucible-ts/meta/fixtures/draft-04-sample.json +16 -0
  74. package/schemas/crucible-ts/meta/fixtures/draft-06-sample.json +16 -0
  75. package/schemas/crucible-ts/meta/fixtures/draft-07-sample.json +34 -0
  76. package/schemas/crucible-ts/meta/fixtures/draft-2019-09-sample.json +21 -0
  77. package/schemas/crucible-ts/meta/fixtures/draft-2020-12-sample.json +21 -0
  78. package/schemas/crucible-ts/taxonomy/library/fulencode/normalization-profiles/v1.0.0/profiles.yaml +16 -0
  79. package/schemas/crucible-ts/upstream/3leaps/crucible/PROVENANCE.md +64 -0
  80. package/schemas/crucible-ts/upstream/3leaps/crucible/config/classifiers/dimensions/access-tier.dimension.json +103 -0
  81. package/schemas/crucible-ts/upstream/3leaps/crucible/config/classifiers/dimensions/retention-lifecycle.dimension.json +103 -0
  82. package/schemas/crucible-ts/upstream/3leaps/crucible/config/classifiers/dimensions/schema-stability.dimension.json +100 -0
  83. package/schemas/crucible-ts/upstream/3leaps/crucible/config/classifiers/dimensions/sensitivity.dimension.json +130 -0
  84. package/schemas/crucible-ts/upstream/3leaps/crucible/config/classifiers/dimensions/velocity-mode.dimension.json +79 -0
  85. package/schemas/crucible-ts/upstream/3leaps/crucible/config/classifiers/dimensions/volatility.dimension.json +72 -0
  86. package/schemas/crucible-ts/upstream/3leaps/crucible/config/classifiers/dimensions/volume-tier.dimension.json +66 -0
  87. package/schemas/crucible-ts/upstream/3leaps/crucible/docs/catalog/classifiers/README.md +29 -0
  88. package/schemas/crucible-ts/upstream/3leaps/crucible/docs/standards/access-tier-classification.md +163 -0
  89. package/schemas/crucible-ts/upstream/3leaps/crucible/docs/standards/classifiers-framework.md +157 -0
  90. package/schemas/crucible-ts/upstream/3leaps/crucible/docs/standards/data-sensitivity-classification.md +259 -0
  91. package/schemas/crucible-ts/upstream/3leaps/crucible/docs/standards/retention-lifecycle-classification.md +200 -0
  92. package/schemas/crucible-ts/upstream/3leaps/crucible/docs/standards/schema-stability-classification.md +205 -0
  93. package/schemas/crucible-ts/upstream/3leaps/crucible/docs/standards/velocity-mode-classification.md +222 -0
  94. package/schemas/crucible-ts/upstream/3leaps/crucible/docs/standards/volatility-classification.md +209 -0
  95. package/schemas/crucible-ts/upstream/3leaps/crucible/docs/standards/volume-tier-classification.md +200 -0
  96. package/schemas/crucible-ts/upstream/3leaps/crucible/schemas/ailink/v0/README.md +48 -0
  97. package/schemas/crucible-ts/upstream/3leaps/{ailink → crucible/schemas/ailink}/v0/prompt.schema.json +4 -18
  98. package/schemas/crucible-ts/upstream/3leaps/{ailink → crucible/schemas/ailink}/v0/search-response.schema.json +7 -37
  99. package/schemas/crucible-ts/upstream/3leaps/crucible/schemas/classifiers/v0/dimension-definition.schema.json +247 -0
  100. package/schemas/crucible-ts/upstream/3leaps/crucible/schemas/classifiers/v0/sensitivity-level.schema.json +67 -0
  101. package/schemas/crucible-ts/upstream/3leaps/crucible/schemas/foundation/v0/error-response.schema.json +59 -0
  102. package/schemas/crucible-ts/upstream/3leaps/crucible/schemas/foundation/v0/lifecycle-phases.data.json +102 -0
  103. package/schemas/crucible-ts/upstream/3leaps/crucible/schemas/foundation/v0/lifecycle-phases.schema.json +101 -0
  104. package/schemas/crucible-ts/upstream/3leaps/crucible/schemas/foundation/v0/release-phase.schema.json +18 -0
  105. package/schemas/crucible-ts/upstream/3leaps/crucible/schemas/foundation/v0/types.schema.json +177 -0
  106. package/schemas/crucible-ts/upstream/3leaps/PROVENANCE.md +0 -43
  107. /package/schemas/crucible-ts/upstream/3leaps/{agentic → crucible/schemas/agentic}/v0/role-prompt.schema.json +0 -0
@@ -5,6 +5,9 @@ import { dirname, join, relative, extname } from 'path';
5
5
  import { fileURLToPath } from 'url';
6
6
  import glob from 'fast-glob';
7
7
  import Ajv from 'ajv';
8
+ import Ajv2019 from 'ajv/dist/2019';
9
+ import Ajv2020 from 'ajv/dist/2020';
10
+ import AjvDraft04 from 'ajv-draft-04';
8
11
  import addFormats from 'ajv-formats';
9
12
  import { Readable } from 'stream';
10
13
  import picomatch from 'picomatch';
@@ -1485,20 +1488,14 @@ async function loadMetaSchema(draft) {
1485
1488
  const content = await readFile(metaSchemaPath, "utf-8");
1486
1489
  return JSON.parse(content);
1487
1490
  }
1488
- async function loadVocabularySchemas() {
1491
+ async function loadVocabularySchemas(draft) {
1492
+ if (draft !== "draft-2019-09" && draft !== "draft-2020-12") {
1493
+ return [];
1494
+ }
1489
1495
  const __filename3 = fileURLToPath(import.meta.url);
1490
1496
  const __dirname4 = dirname(__filename3);
1491
- const vocabDir = join(
1492
- __dirname4,
1493
- "..",
1494
- "..",
1495
- "schemas",
1496
- "crucible-ts",
1497
- "meta",
1498
- "draft-2020-12",
1499
- "meta"
1500
- );
1501
- const vocabFiles = [
1497
+ const vocabDir = join(__dirname4, "..", "..", "schemas", "crucible-ts", "meta", draft, "meta");
1498
+ const vocabFiles = draft === "draft-2020-12" ? [
1502
1499
  "core.json",
1503
1500
  "applicator.json",
1504
1501
  "unevaluated.json",
@@ -1506,6 +1503,13 @@ async function loadVocabularySchemas() {
1506
1503
  "meta-data.json",
1507
1504
  "format-annotation.json",
1508
1505
  "content.json"
1506
+ ] : [
1507
+ "core.json",
1508
+ "applicator.json",
1509
+ "validation.json",
1510
+ "meta-data.json",
1511
+ "format.json",
1512
+ "content.json"
1509
1513
  ];
1510
1514
  const schemas = [];
1511
1515
  for (const file of vocabFiles) {
@@ -1560,47 +1564,68 @@ async function loadReferencedSchema(uri) {
1560
1564
  }
1561
1565
  return JSON.parse(content);
1562
1566
  }
1563
- function getAjv() {
1564
- if (!ajvInstance) {
1565
- ajvInstance = new Ajv({
1566
- strict: false,
1567
- allErrors: true,
1568
- verbose: true,
1569
- // Allow schemas with $id to be added without replacing existing ones
1570
- addUsedSchema: false,
1571
- // Enable async schema loading for YAML references
1572
- loadSchema: loadReferencedSchema
1573
- });
1574
- addFormats(ajvInstance, {
1575
- mode: "fast",
1576
- formats: ["date-time", "email", "hostname", "ipv4", "ipv6", "uri", "uri-reference"]
1577
- });
1578
- metaschemaReady = Promise.all([loadVocabularySchemas(), loadMetaSchema("draft-2020-12")]).then(([vocabSchemas, metaSchema]) => {
1579
- if (ajvInstance) {
1580
- for (const vocabSchema of vocabSchemas) {
1581
- try {
1582
- ajvInstance.addMetaSchema(vocabSchema);
1583
- } catch {
1584
- }
1585
- }
1586
- ajvInstance.addMetaSchema(metaSchema);
1587
- }
1588
- }).catch((error) => {
1589
- throw new Error(`Failed to load metaschemas: ${error}`);
1590
- });
1567
+ function detectDialect(schema) {
1568
+ if (schema && typeof schema === "object" && !Array.isArray(schema)) {
1569
+ const maybeSchema = schema;
1570
+ const declared = maybeSchema.$schema;
1571
+ if (typeof declared === "string") {
1572
+ if (declared.includes("draft-04")) return "draft-04";
1573
+ if (declared.includes("draft-06")) return "draft-06";
1574
+ if (declared.includes("draft-07")) return "draft-07";
1575
+ if (declared.includes("draft/2019-09")) return "draft-2019-09";
1576
+ if (declared.includes("draft/2020-12")) return "draft-2020-12";
1577
+ }
1591
1578
  }
1592
- return ajvInstance;
1579
+ return "draft-2020-12";
1580
+ }
1581
+ function createAjv(dialect) {
1582
+ const AjvCtor = dialect === "draft-2020-12" ? Ajv2020 : dialect === "draft-2019-09" ? Ajv2019 : dialect === "draft-04" ? AjvDraft04 : Ajv;
1583
+ const ajv = new AjvCtor({
1584
+ strict: false,
1585
+ allErrors: true,
1586
+ verbose: true,
1587
+ // Allow schemas with $id to be added without replacing existing ones
1588
+ addUsedSchema: false,
1589
+ // draft-04 uses "id"; later drafts use "$id"
1590
+ schemaId: dialect === "draft-04" ? "id" : "$id",
1591
+ // Enable async schema loading for YAML references
1592
+ loadSchema: loadReferencedSchema
1593
+ });
1594
+ addFormats(ajv, {
1595
+ mode: "fast",
1596
+ formats: ["date-time", "email", "hostname", "ipv4", "ipv6", "uri", "uri-reference"]
1597
+ });
1598
+ return ajv;
1599
+ }
1600
+ async function getAjv(dialect) {
1601
+ const existing = ajvInstances.get(dialect);
1602
+ if (existing) {
1603
+ const ready = metaschemaReady.get(dialect);
1604
+ if (ready) await ready;
1605
+ return existing;
1606
+ }
1607
+ const ajv = createAjv(dialect);
1608
+ ajvInstances.set(dialect, ajv);
1609
+ const readyPromise = Promise.all([loadVocabularySchemas(dialect), loadMetaSchema(dialect)]).then(([vocabSchemas, metaSchema]) => {
1610
+ for (const vocabSchema of vocabSchemas) {
1611
+ try {
1612
+ ajv.addMetaSchema(vocabSchema);
1613
+ } catch {
1614
+ }
1615
+ }
1616
+ try {
1617
+ ajv.addMetaSchema(metaSchema);
1618
+ } catch {
1619
+ }
1620
+ }).catch((error) => {
1621
+ throw new Error(`Failed to load metaschemas (${dialect}): ${error}`);
1622
+ });
1623
+ metaschemaReady.set(dialect, readyPromise);
1624
+ await readyPromise;
1625
+ return ajv;
1593
1626
  }
1594
1627
  async function compileSchema(schema, options = {}) {
1595
- const ajv = getAjv();
1596
- if (metaschemaReady) {
1597
- await metaschemaReady;
1598
- }
1599
- const cacheKey = typeof schema === "string" ? schema : JSON.stringify(schema);
1600
- const cached = schemaCache.get(cacheKey);
1601
- if (cached !== void 0) {
1602
- return cached;
1603
- }
1628
+ const baseKey = typeof schema === "string" ? schema : JSON.stringify(schema);
1604
1629
  let parsedSchema;
1605
1630
  if (typeof schema === "string") {
1606
1631
  try {
@@ -1618,18 +1643,27 @@ async function compileSchema(schema, options = {}) {
1618
1643
  } else {
1619
1644
  parsedSchema = schema;
1620
1645
  }
1646
+ const dialect = detectDialect(parsedSchema);
1647
+ const ajv = await getAjv(dialect);
1648
+ const cacheKey = `${dialect}:${baseKey}`;
1649
+ const cached = schemaCache.get(cacheKey);
1650
+ if (cached !== void 0) {
1651
+ return cached;
1652
+ }
1621
1653
  try {
1622
1654
  if (options.aliases && options.aliases.length > 0) {
1623
1655
  for (const alias of options.aliases) {
1624
1656
  if (alias && ajv.getSchema(alias) === void 0) {
1625
1657
  try {
1626
- ajv.addSchema(parsedSchema, alias);
1658
+ if (typeof parsedSchema === "object" && parsedSchema !== null) {
1659
+ ajv.addSchema(parsedSchema, alias);
1660
+ }
1627
1661
  } catch {
1628
1662
  }
1629
1663
  }
1630
1664
  }
1631
1665
  }
1632
- const validator = await ajv.compileAsync(parsedSchema);
1666
+ const validator = typeof parsedSchema === "boolean" ? ajv.compile(parsedSchema) : await ajv.compileAsync(parsedSchema);
1633
1667
  schemaCache.set(cacheKey, validator);
1634
1668
  return validator;
1635
1669
  } catch (error) {
@@ -1699,8 +1733,39 @@ async function validateFile(filePath, validator) {
1699
1733
  }
1700
1734
  async function validateSchema(schema) {
1701
1735
  try {
1702
- const validator = await compileSchema(schema);
1703
- validateData({}, validator);
1736
+ let parsedSchema;
1737
+ if (typeof schema === "string") {
1738
+ try {
1739
+ parsedSchema = JSON.parse(schema);
1740
+ } catch {
1741
+ parsedSchema = parse(schema);
1742
+ }
1743
+ } else if (Buffer.isBuffer(schema)) {
1744
+ const content = schema.toString("utf-8");
1745
+ try {
1746
+ parsedSchema = JSON.parse(content);
1747
+ } catch {
1748
+ parsedSchema = parse(content);
1749
+ }
1750
+ } else {
1751
+ parsedSchema = schema;
1752
+ }
1753
+ const dialect = detectDialect(parsedSchema);
1754
+ const ajv = await getAjv(dialect);
1755
+ const metaValid = ajv.validateSchema(parsedSchema);
1756
+ if (!metaValid && ajv.errors) {
1757
+ const diagnostics = ajv.errors.map(
1758
+ (error) => createDiagnostic(
1759
+ error.instancePath || "",
1760
+ error.message || "Schema meta-validation failed",
1761
+ error.keyword || "unknown",
1762
+ "ERROR",
1763
+ "ajv"
1764
+ )
1765
+ );
1766
+ return { valid: false, diagnostics, source: "ajv" };
1767
+ }
1768
+ await compileSchema(parsedSchema);
1704
1769
  return {
1705
1770
  valid: true,
1706
1771
  diagnostics: [],
@@ -1771,14 +1836,15 @@ async function validateFileBySchemaId(filePath, schemaId, registryOptions) {
1771
1836
  throw error;
1772
1837
  }
1773
1838
  }
1774
- var ajvInstance, metaschemaReady, schemaCache;
1839
+ var ajvInstances, metaschemaReady, schemaCache;
1775
1840
  var init_validator = __esm({
1776
1841
  "src/schema/validator.ts"() {
1777
1842
  init_telemetry();
1778
1843
  init_errors();
1779
1844
  init_registry();
1780
1845
  init_utils();
1781
- metaschemaReady = null;
1846
+ ajvInstances = /* @__PURE__ */ new Map();
1847
+ metaschemaReady = /* @__PURE__ */ new Map();
1782
1848
  schemaCache = /* @__PURE__ */ new Map();
1783
1849
  }
1784
1850
  });