@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
@@ -1,5 +1,5 @@
1
1
  export { F as FulmenError, a as FulmenErrorData, b as FulmenErrorOptions, L as LEVEL_TO_SEVERITY, S as SEVERITY_LEVELS, k as Severity, m as SeverityLevel, n as SeverityName, f as compareSeverity, e as extractErrorMessage, d as extractStackTrace, g as getDefaultSeverity, i as isFulmenError, c as isFulmenErrorData, h as isSeverityLevel, j as isSeverityName, l as levelToSeverity, s as serializeError, o as severityToLevel } from '../fulmen-error-B_kX8jSC.js';
2
- import { A as AjvError } from '../types-BJswWpQC.js';
2
+ import { A as AjvError } from '../types-DdoeE7F5.js';
3
3
 
4
4
  /**
5
5
  * Correlation ID generation and validation for error tracking
@@ -6,6 +6,9 @@ import { dirname, extname, join, relative } from 'path';
6
6
  import { fileURLToPath } from 'url';
7
7
  import glob from 'fast-glob';
8
8
  import Ajv from 'ajv';
9
+ import Ajv2019 from 'ajv/dist/2019';
10
+ import Ajv2020 from 'ajv/dist/2020';
11
+ import AjvDraft04 from 'ajv-draft-04';
9
12
  import addFormats from 'ajv-formats';
10
13
  import { Readable } from 'stream';
11
14
  import picomatch from 'picomatch';
@@ -1622,20 +1625,14 @@ async function loadMetaSchema(draft) {
1622
1625
  const content = await readFile(metaSchemaPath, "utf-8");
1623
1626
  return JSON.parse(content);
1624
1627
  }
1625
- async function loadVocabularySchemas() {
1628
+ async function loadVocabularySchemas(draft) {
1629
+ if (draft !== "draft-2019-09" && draft !== "draft-2020-12") {
1630
+ return [];
1631
+ }
1626
1632
  const __filename3 = fileURLToPath(import.meta.url);
1627
1633
  const __dirname4 = dirname(__filename3);
1628
- const vocabDir = join(
1629
- __dirname4,
1630
- "..",
1631
- "..",
1632
- "schemas",
1633
- "crucible-ts",
1634
- "meta",
1635
- "draft-2020-12",
1636
- "meta"
1637
- );
1638
- const vocabFiles = [
1634
+ const vocabDir = join(__dirname4, "..", "..", "schemas", "crucible-ts", "meta", draft, "meta");
1635
+ const vocabFiles = draft === "draft-2020-12" ? [
1639
1636
  "core.json",
1640
1637
  "applicator.json",
1641
1638
  "unevaluated.json",
@@ -1643,6 +1640,13 @@ async function loadVocabularySchemas() {
1643
1640
  "meta-data.json",
1644
1641
  "format-annotation.json",
1645
1642
  "content.json"
1643
+ ] : [
1644
+ "core.json",
1645
+ "applicator.json",
1646
+ "validation.json",
1647
+ "meta-data.json",
1648
+ "format.json",
1649
+ "content.json"
1646
1650
  ];
1647
1651
  const schemas = [];
1648
1652
  for (const file of vocabFiles) {
@@ -1697,47 +1701,68 @@ async function loadReferencedSchema(uri) {
1697
1701
  }
1698
1702
  return JSON.parse(content);
1699
1703
  }
1700
- function getAjv() {
1701
- if (!ajvInstance) {
1702
- ajvInstance = new Ajv({
1703
- strict: false,
1704
- allErrors: true,
1705
- verbose: true,
1706
- // Allow schemas with $id to be added without replacing existing ones
1707
- addUsedSchema: false,
1708
- // Enable async schema loading for YAML references
1709
- loadSchema: loadReferencedSchema
1710
- });
1711
- addFormats(ajvInstance, {
1712
- mode: "fast",
1713
- formats: ["date-time", "email", "hostname", "ipv4", "ipv6", "uri", "uri-reference"]
1714
- });
1715
- metaschemaReady = Promise.all([loadVocabularySchemas(), loadMetaSchema("draft-2020-12")]).then(([vocabSchemas, metaSchema]) => {
1716
- if (ajvInstance) {
1717
- for (const vocabSchema of vocabSchemas) {
1718
- try {
1719
- ajvInstance.addMetaSchema(vocabSchema);
1720
- } catch {
1721
- }
1722
- }
1723
- ajvInstance.addMetaSchema(metaSchema);
1724
- }
1725
- }).catch((error) => {
1726
- throw new Error(`Failed to load metaschemas: ${error}`);
1727
- });
1704
+ function detectDialect(schema) {
1705
+ if (schema && typeof schema === "object" && !Array.isArray(schema)) {
1706
+ const maybeSchema = schema;
1707
+ const declared = maybeSchema.$schema;
1708
+ if (typeof declared === "string") {
1709
+ if (declared.includes("draft-04")) return "draft-04";
1710
+ if (declared.includes("draft-06")) return "draft-06";
1711
+ if (declared.includes("draft-07")) return "draft-07";
1712
+ if (declared.includes("draft/2019-09")) return "draft-2019-09";
1713
+ if (declared.includes("draft/2020-12")) return "draft-2020-12";
1714
+ }
1728
1715
  }
1729
- return ajvInstance;
1716
+ return "draft-2020-12";
1717
+ }
1718
+ function createAjv(dialect) {
1719
+ const AjvCtor = dialect === "draft-2020-12" ? Ajv2020 : dialect === "draft-2019-09" ? Ajv2019 : dialect === "draft-04" ? AjvDraft04 : Ajv;
1720
+ const ajv = new AjvCtor({
1721
+ strict: false,
1722
+ allErrors: true,
1723
+ verbose: true,
1724
+ // Allow schemas with $id to be added without replacing existing ones
1725
+ addUsedSchema: false,
1726
+ // draft-04 uses "id"; later drafts use "$id"
1727
+ schemaId: dialect === "draft-04" ? "id" : "$id",
1728
+ // Enable async schema loading for YAML references
1729
+ loadSchema: loadReferencedSchema
1730
+ });
1731
+ addFormats(ajv, {
1732
+ mode: "fast",
1733
+ formats: ["date-time", "email", "hostname", "ipv4", "ipv6", "uri", "uri-reference"]
1734
+ });
1735
+ return ajv;
1736
+ }
1737
+ async function getAjv(dialect) {
1738
+ const existing = ajvInstances.get(dialect);
1739
+ if (existing) {
1740
+ const ready = metaschemaReady.get(dialect);
1741
+ if (ready) await ready;
1742
+ return existing;
1743
+ }
1744
+ const ajv = createAjv(dialect);
1745
+ ajvInstances.set(dialect, ajv);
1746
+ const readyPromise = Promise.all([loadVocabularySchemas(dialect), loadMetaSchema(dialect)]).then(([vocabSchemas, metaSchema]) => {
1747
+ for (const vocabSchema of vocabSchemas) {
1748
+ try {
1749
+ ajv.addMetaSchema(vocabSchema);
1750
+ } catch {
1751
+ }
1752
+ }
1753
+ try {
1754
+ ajv.addMetaSchema(metaSchema);
1755
+ } catch {
1756
+ }
1757
+ }).catch((error) => {
1758
+ throw new Error(`Failed to load metaschemas (${dialect}): ${error}`);
1759
+ });
1760
+ metaschemaReady.set(dialect, readyPromise);
1761
+ await readyPromise;
1762
+ return ajv;
1730
1763
  }
1731
1764
  async function compileSchema(schema, options = {}) {
1732
- const ajv = getAjv();
1733
- if (metaschemaReady) {
1734
- await metaschemaReady;
1735
- }
1736
- const cacheKey = typeof schema === "string" ? schema : JSON.stringify(schema);
1737
- const cached = schemaCache.get(cacheKey);
1738
- if (cached !== void 0) {
1739
- return cached;
1740
- }
1765
+ const baseKey = typeof schema === "string" ? schema : JSON.stringify(schema);
1741
1766
  let parsedSchema;
1742
1767
  if (typeof schema === "string") {
1743
1768
  try {
@@ -1755,18 +1780,27 @@ async function compileSchema(schema, options = {}) {
1755
1780
  } else {
1756
1781
  parsedSchema = schema;
1757
1782
  }
1783
+ const dialect = detectDialect(parsedSchema);
1784
+ const ajv = await getAjv(dialect);
1785
+ const cacheKey = `${dialect}:${baseKey}`;
1786
+ const cached = schemaCache.get(cacheKey);
1787
+ if (cached !== void 0) {
1788
+ return cached;
1789
+ }
1758
1790
  try {
1759
1791
  if (options.aliases && options.aliases.length > 0) {
1760
1792
  for (const alias of options.aliases) {
1761
1793
  if (alias && ajv.getSchema(alias) === void 0) {
1762
1794
  try {
1763
- ajv.addSchema(parsedSchema, alias);
1795
+ if (typeof parsedSchema === "object" && parsedSchema !== null) {
1796
+ ajv.addSchema(parsedSchema, alias);
1797
+ }
1764
1798
  } catch {
1765
1799
  }
1766
1800
  }
1767
1801
  }
1768
1802
  }
1769
- const validator = await ajv.compileAsync(parsedSchema);
1803
+ const validator = typeof parsedSchema === "boolean" ? ajv.compile(parsedSchema) : await ajv.compileAsync(parsedSchema);
1770
1804
  schemaCache.set(cacheKey, validator);
1771
1805
  return validator;
1772
1806
  } catch (error) {
@@ -1836,8 +1870,39 @@ async function validateFile(filePath, validator) {
1836
1870
  }
1837
1871
  async function validateSchema(schema) {
1838
1872
  try {
1839
- const validator = await compileSchema(schema);
1840
- validateData({}, validator);
1873
+ let parsedSchema;
1874
+ if (typeof schema === "string") {
1875
+ try {
1876
+ parsedSchema = JSON.parse(schema);
1877
+ } catch {
1878
+ parsedSchema = parse(schema);
1879
+ }
1880
+ } else if (Buffer.isBuffer(schema)) {
1881
+ const content = schema.toString("utf-8");
1882
+ try {
1883
+ parsedSchema = JSON.parse(content);
1884
+ } catch {
1885
+ parsedSchema = parse(content);
1886
+ }
1887
+ } else {
1888
+ parsedSchema = schema;
1889
+ }
1890
+ const dialect = detectDialect(parsedSchema);
1891
+ const ajv = await getAjv(dialect);
1892
+ const metaValid = ajv.validateSchema(parsedSchema);
1893
+ if (!metaValid && ajv.errors) {
1894
+ const diagnostics = ajv.errors.map(
1895
+ (error) => createDiagnostic(
1896
+ error.instancePath || "",
1897
+ error.message || "Schema meta-validation failed",
1898
+ error.keyword || "unknown",
1899
+ "ERROR",
1900
+ "ajv"
1901
+ )
1902
+ );
1903
+ return { valid: false, diagnostics, source: "ajv" };
1904
+ }
1905
+ await compileSchema(parsedSchema);
1841
1906
  return {
1842
1907
  valid: true,
1843
1908
  diagnostics: [],
@@ -1908,14 +1973,15 @@ async function validateFileBySchemaId(filePath, schemaId, registryOptions) {
1908
1973
  throw error;
1909
1974
  }
1910
1975
  }
1911
- var ajvInstance, metaschemaReady, schemaCache;
1976
+ var ajvInstances, metaschemaReady, schemaCache;
1912
1977
  var init_validator = __esm({
1913
1978
  "src/schema/validator.ts"() {
1914
1979
  init_telemetry();
1915
1980
  init_errors();
1916
1981
  init_registry();
1917
1982
  init_utils();
1918
- metaschemaReady = null;
1983
+ ajvInstances = /* @__PURE__ */ new Map();
1984
+ metaschemaReady = /* @__PURE__ */ new Map();
1919
1985
  schemaCache = /* @__PURE__ */ new Map();
1920
1986
  }
1921
1987
  });