@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,7 +1,7 @@
1
1
  import { b as FulmenErrorOptions, F as FulmenError } from '../fulmen-error-B_kX8jSC.js';
2
2
  import { L as Logger } from '../logger-Eycya5Mz.js';
3
3
  import { b as MetricsRegistry } from '../registry-_yEKhTTl.js';
4
- import { C as CompiledValidator, S as SchemaValidationResult } from '../types-BJswWpQC.js';
4
+ import { C as CompiledValidator, S as SchemaValidationResult } from '../types-DdoeE7F5.js';
5
5
 
6
6
  /**
7
7
  * Pathfinder types - Core type definitions for filesystem traversal
@@ -7,6 +7,9 @@ import path3, { dirname, join, relative, extname, resolve } from 'path';
7
7
  import { fileURLToPath } from 'url';
8
8
  import glob from 'fast-glob';
9
9
  import Ajv from 'ajv';
10
+ import Ajv2019 from 'ajv/dist/2019';
11
+ import Ajv2020 from 'ajv/dist/2020';
12
+ import AjvDraft04 from 'ajv-draft-04';
10
13
  import addFormats from 'ajv-formats';
11
14
  import { Readable } from 'stream';
12
15
  import picomatch from 'picomatch';
@@ -1858,20 +1861,14 @@ async function loadMetaSchema(draft) {
1858
1861
  const content = await readFile(metaSchemaPath, "utf-8");
1859
1862
  return JSON.parse(content);
1860
1863
  }
1861
- async function loadVocabularySchemas() {
1864
+ async function loadVocabularySchemas(draft) {
1865
+ if (draft !== "draft-2019-09" && draft !== "draft-2020-12") {
1866
+ return [];
1867
+ }
1862
1868
  const __filename3 = fileURLToPath(import.meta.url);
1863
1869
  const __dirname4 = dirname(__filename3);
1864
- const vocabDir = join(
1865
- __dirname4,
1866
- "..",
1867
- "..",
1868
- "schemas",
1869
- "crucible-ts",
1870
- "meta",
1871
- "draft-2020-12",
1872
- "meta"
1873
- );
1874
- const vocabFiles = [
1870
+ const vocabDir = join(__dirname4, "..", "..", "schemas", "crucible-ts", "meta", draft, "meta");
1871
+ const vocabFiles = draft === "draft-2020-12" ? [
1875
1872
  "core.json",
1876
1873
  "applicator.json",
1877
1874
  "unevaluated.json",
@@ -1879,6 +1876,13 @@ async function loadVocabularySchemas() {
1879
1876
  "meta-data.json",
1880
1877
  "format-annotation.json",
1881
1878
  "content.json"
1879
+ ] : [
1880
+ "core.json",
1881
+ "applicator.json",
1882
+ "validation.json",
1883
+ "meta-data.json",
1884
+ "format.json",
1885
+ "content.json"
1882
1886
  ];
1883
1887
  const schemas = [];
1884
1888
  for (const file of vocabFiles) {
@@ -1933,47 +1937,68 @@ async function loadReferencedSchema(uri) {
1933
1937
  }
1934
1938
  return JSON.parse(content);
1935
1939
  }
1936
- function getAjv() {
1937
- if (!ajvInstance) {
1938
- ajvInstance = new Ajv({
1939
- strict: false,
1940
- allErrors: true,
1941
- verbose: true,
1942
- // Allow schemas with $id to be added without replacing existing ones
1943
- addUsedSchema: false,
1944
- // Enable async schema loading for YAML references
1945
- loadSchema: loadReferencedSchema
1946
- });
1947
- addFormats(ajvInstance, {
1948
- mode: "fast",
1949
- formats: ["date-time", "email", "hostname", "ipv4", "ipv6", "uri", "uri-reference"]
1950
- });
1951
- metaschemaReady = Promise.all([loadVocabularySchemas(), loadMetaSchema("draft-2020-12")]).then(([vocabSchemas, metaSchema]) => {
1952
- if (ajvInstance) {
1953
- for (const vocabSchema of vocabSchemas) {
1954
- try {
1955
- ajvInstance.addMetaSchema(vocabSchema);
1956
- } catch {
1957
- }
1958
- }
1959
- ajvInstance.addMetaSchema(metaSchema);
1940
+ function detectDialect(schema) {
1941
+ if (schema && typeof schema === "object" && !Array.isArray(schema)) {
1942
+ const maybeSchema = schema;
1943
+ const declared = maybeSchema.$schema;
1944
+ if (typeof declared === "string") {
1945
+ if (declared.includes("draft-04")) return "draft-04";
1946
+ if (declared.includes("draft-06")) return "draft-06";
1947
+ if (declared.includes("draft-07")) return "draft-07";
1948
+ if (declared.includes("draft/2019-09")) return "draft-2019-09";
1949
+ if (declared.includes("draft/2020-12")) return "draft-2020-12";
1950
+ }
1951
+ }
1952
+ return "draft-2020-12";
1953
+ }
1954
+ function createAjv(dialect) {
1955
+ const AjvCtor = dialect === "draft-2020-12" ? Ajv2020 : dialect === "draft-2019-09" ? Ajv2019 : dialect === "draft-04" ? AjvDraft04 : Ajv;
1956
+ const ajv = new AjvCtor({
1957
+ strict: false,
1958
+ allErrors: true,
1959
+ verbose: true,
1960
+ // Allow schemas with $id to be added without replacing existing ones
1961
+ addUsedSchema: false,
1962
+ // draft-04 uses "id"; later drafts use "$id"
1963
+ schemaId: dialect === "draft-04" ? "id" : "$id",
1964
+ // Enable async schema loading for YAML references
1965
+ loadSchema: loadReferencedSchema
1966
+ });
1967
+ addFormats(ajv, {
1968
+ mode: "fast",
1969
+ formats: ["date-time", "email", "hostname", "ipv4", "ipv6", "uri", "uri-reference"]
1970
+ });
1971
+ return ajv;
1972
+ }
1973
+ async function getAjv(dialect) {
1974
+ const existing = ajvInstances.get(dialect);
1975
+ if (existing) {
1976
+ const ready = metaschemaReady.get(dialect);
1977
+ if (ready) await ready;
1978
+ return existing;
1979
+ }
1980
+ const ajv = createAjv(dialect);
1981
+ ajvInstances.set(dialect, ajv);
1982
+ const readyPromise = Promise.all([loadVocabularySchemas(dialect), loadMetaSchema(dialect)]).then(([vocabSchemas, metaSchema]) => {
1983
+ for (const vocabSchema of vocabSchemas) {
1984
+ try {
1985
+ ajv.addMetaSchema(vocabSchema);
1986
+ } catch {
1960
1987
  }
1961
- }).catch((error) => {
1962
- throw new Error(`Failed to load metaschemas: ${error}`);
1963
- });
1964
- }
1965
- return ajvInstance;
1988
+ }
1989
+ try {
1990
+ ajv.addMetaSchema(metaSchema);
1991
+ } catch {
1992
+ }
1993
+ }).catch((error) => {
1994
+ throw new Error(`Failed to load metaschemas (${dialect}): ${error}`);
1995
+ });
1996
+ metaschemaReady.set(dialect, readyPromise);
1997
+ await readyPromise;
1998
+ return ajv;
1966
1999
  }
1967
2000
  async function compileSchema(schema, options = {}) {
1968
- const ajv = getAjv();
1969
- if (metaschemaReady) {
1970
- await metaschemaReady;
1971
- }
1972
- const cacheKey = typeof schema === "string" ? schema : JSON.stringify(schema);
1973
- const cached = schemaCache.get(cacheKey);
1974
- if (cached !== void 0) {
1975
- return cached;
1976
- }
2001
+ const baseKey = typeof schema === "string" ? schema : JSON.stringify(schema);
1977
2002
  let parsedSchema;
1978
2003
  if (typeof schema === "string") {
1979
2004
  try {
@@ -1991,18 +2016,27 @@ async function compileSchema(schema, options = {}) {
1991
2016
  } else {
1992
2017
  parsedSchema = schema;
1993
2018
  }
2019
+ const dialect = detectDialect(parsedSchema);
2020
+ const ajv = await getAjv(dialect);
2021
+ const cacheKey = `${dialect}:${baseKey}`;
2022
+ const cached = schemaCache.get(cacheKey);
2023
+ if (cached !== void 0) {
2024
+ return cached;
2025
+ }
1994
2026
  try {
1995
2027
  if (options.aliases && options.aliases.length > 0) {
1996
2028
  for (const alias of options.aliases) {
1997
2029
  if (alias && ajv.getSchema(alias) === void 0) {
1998
2030
  try {
1999
- ajv.addSchema(parsedSchema, alias);
2031
+ if (typeof parsedSchema === "object" && parsedSchema !== null) {
2032
+ ajv.addSchema(parsedSchema, alias);
2033
+ }
2000
2034
  } catch {
2001
2035
  }
2002
2036
  }
2003
2037
  }
2004
2038
  }
2005
- const validator = await ajv.compileAsync(parsedSchema);
2039
+ const validator = typeof parsedSchema === "boolean" ? ajv.compile(parsedSchema) : await ajv.compileAsync(parsedSchema);
2006
2040
  schemaCache.set(cacheKey, validator);
2007
2041
  return validator;
2008
2042
  } catch (error) {
@@ -2072,8 +2106,39 @@ async function validateFile(filePath, validator) {
2072
2106
  }
2073
2107
  async function validateSchema(schema) {
2074
2108
  try {
2075
- const validator = await compileSchema(schema);
2076
- validateData({}, validator);
2109
+ let parsedSchema;
2110
+ if (typeof schema === "string") {
2111
+ try {
2112
+ parsedSchema = JSON.parse(schema);
2113
+ } catch {
2114
+ parsedSchema = parse(schema);
2115
+ }
2116
+ } else if (Buffer.isBuffer(schema)) {
2117
+ const content = schema.toString("utf-8");
2118
+ try {
2119
+ parsedSchema = JSON.parse(content);
2120
+ } catch {
2121
+ parsedSchema = parse(content);
2122
+ }
2123
+ } else {
2124
+ parsedSchema = schema;
2125
+ }
2126
+ const dialect = detectDialect(parsedSchema);
2127
+ const ajv = await getAjv(dialect);
2128
+ const metaValid = ajv.validateSchema(parsedSchema);
2129
+ if (!metaValid && ajv.errors) {
2130
+ const diagnostics = ajv.errors.map(
2131
+ (error) => createDiagnostic(
2132
+ error.instancePath || "",
2133
+ error.message || "Schema meta-validation failed",
2134
+ error.keyword || "unknown",
2135
+ "ERROR",
2136
+ "ajv"
2137
+ )
2138
+ );
2139
+ return { valid: false, diagnostics, source: "ajv" };
2140
+ }
2141
+ await compileSchema(parsedSchema);
2077
2142
  return {
2078
2143
  valid: true,
2079
2144
  diagnostics: [],
@@ -2144,14 +2209,15 @@ async function validateFileBySchemaId(filePath, schemaId, registryOptions) {
2144
2209
  throw error;
2145
2210
  }
2146
2211
  }
2147
- var ajvInstance, metaschemaReady, schemaCache;
2212
+ var ajvInstances, metaschemaReady, schemaCache;
2148
2213
  var init_validator = __esm({
2149
2214
  "src/schema/validator.ts"() {
2150
2215
  init_telemetry();
2151
2216
  init_errors2();
2152
2217
  init_registry();
2153
2218
  init_utils();
2154
- metaschemaReady = null;
2219
+ ajvInstances = /* @__PURE__ */ new Map();
2220
+ metaschemaReady = /* @__PURE__ */ new Map();
2155
2221
  schemaCache = /* @__PURE__ */ new Map();
2156
2222
  }
2157
2223
  });