@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
@@ -7,6 +7,9 @@ import glob from 'fast-glob';
7
7
  import 'crypto';
8
8
  import { Command } from 'commander';
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';
@@ -2614,20 +2617,14 @@ async function loadMetaSchema(draft) {
2614
2617
  const content = await readFile(metaSchemaPath, "utf-8");
2615
2618
  return JSON.parse(content);
2616
2619
  }
2617
- async function loadVocabularySchemas() {
2620
+ async function loadVocabularySchemas(draft) {
2621
+ if (draft !== "draft-2019-09" && draft !== "draft-2020-12") {
2622
+ return [];
2623
+ }
2618
2624
  const __filename3 = fileURLToPath(import.meta.url);
2619
2625
  const __dirname4 = dirname(__filename3);
2620
- const vocabDir = join(
2621
- __dirname4,
2622
- "..",
2623
- "..",
2624
- "schemas",
2625
- "crucible-ts",
2626
- "meta",
2627
- "draft-2020-12",
2628
- "meta"
2629
- );
2630
- const vocabFiles = [
2626
+ const vocabDir = join(__dirname4, "..", "..", "schemas", "crucible-ts", "meta", draft, "meta");
2627
+ const vocabFiles = draft === "draft-2020-12" ? [
2631
2628
  "core.json",
2632
2629
  "applicator.json",
2633
2630
  "unevaluated.json",
@@ -2635,6 +2632,13 @@ async function loadVocabularySchemas() {
2635
2632
  "meta-data.json",
2636
2633
  "format-annotation.json",
2637
2634
  "content.json"
2635
+ ] : [
2636
+ "core.json",
2637
+ "applicator.json",
2638
+ "validation.json",
2639
+ "meta-data.json",
2640
+ "format.json",
2641
+ "content.json"
2638
2642
  ];
2639
2643
  const schemas = [];
2640
2644
  for (const file of vocabFiles) {
@@ -2689,47 +2693,68 @@ async function loadReferencedSchema(uri) {
2689
2693
  }
2690
2694
  return JSON.parse(content);
2691
2695
  }
2692
- function getAjv() {
2693
- if (!ajvInstance) {
2694
- ajvInstance = new Ajv({
2695
- strict: false,
2696
- allErrors: true,
2697
- verbose: true,
2698
- // Allow schemas with $id to be added without replacing existing ones
2699
- addUsedSchema: false,
2700
- // Enable async schema loading for YAML references
2701
- loadSchema: loadReferencedSchema
2702
- });
2703
- addFormats(ajvInstance, {
2704
- mode: "fast",
2705
- formats: ["date-time", "email", "hostname", "ipv4", "ipv6", "uri", "uri-reference"]
2706
- });
2707
- metaschemaReady = Promise.all([loadVocabularySchemas(), loadMetaSchema("draft-2020-12")]).then(([vocabSchemas, metaSchema]) => {
2708
- if (ajvInstance) {
2709
- for (const vocabSchema of vocabSchemas) {
2710
- try {
2711
- ajvInstance.addMetaSchema(vocabSchema);
2712
- } catch {
2713
- }
2714
- }
2715
- ajvInstance.addMetaSchema(metaSchema);
2716
- }
2717
- }).catch((error) => {
2718
- throw new Error(`Failed to load metaschemas: ${error}`);
2719
- });
2696
+ function detectDialect(schema) {
2697
+ if (schema && typeof schema === "object" && !Array.isArray(schema)) {
2698
+ const maybeSchema = schema;
2699
+ const declared = maybeSchema.$schema;
2700
+ if (typeof declared === "string") {
2701
+ if (declared.includes("draft-04")) return "draft-04";
2702
+ if (declared.includes("draft-06")) return "draft-06";
2703
+ if (declared.includes("draft-07")) return "draft-07";
2704
+ if (declared.includes("draft/2019-09")) return "draft-2019-09";
2705
+ if (declared.includes("draft/2020-12")) return "draft-2020-12";
2706
+ }
2720
2707
  }
2721
- return ajvInstance;
2708
+ return "draft-2020-12";
2709
+ }
2710
+ function createAjv(dialect) {
2711
+ const AjvCtor = dialect === "draft-2020-12" ? Ajv2020 : dialect === "draft-2019-09" ? Ajv2019 : dialect === "draft-04" ? AjvDraft04 : Ajv;
2712
+ const ajv = new AjvCtor({
2713
+ strict: false,
2714
+ allErrors: true,
2715
+ verbose: true,
2716
+ // Allow schemas with $id to be added without replacing existing ones
2717
+ addUsedSchema: false,
2718
+ // draft-04 uses "id"; later drafts use "$id"
2719
+ schemaId: dialect === "draft-04" ? "id" : "$id",
2720
+ // Enable async schema loading for YAML references
2721
+ loadSchema: loadReferencedSchema
2722
+ });
2723
+ addFormats(ajv, {
2724
+ mode: "fast",
2725
+ formats: ["date-time", "email", "hostname", "ipv4", "ipv6", "uri", "uri-reference"]
2726
+ });
2727
+ return ajv;
2728
+ }
2729
+ async function getAjv(dialect) {
2730
+ const existing = ajvInstances.get(dialect);
2731
+ if (existing) {
2732
+ const ready = metaschemaReady.get(dialect);
2733
+ if (ready) await ready;
2734
+ return existing;
2735
+ }
2736
+ const ajv = createAjv(dialect);
2737
+ ajvInstances.set(dialect, ajv);
2738
+ const readyPromise = Promise.all([loadVocabularySchemas(dialect), loadMetaSchema(dialect)]).then(([vocabSchemas, metaSchema]) => {
2739
+ for (const vocabSchema of vocabSchemas) {
2740
+ try {
2741
+ ajv.addMetaSchema(vocabSchema);
2742
+ } catch {
2743
+ }
2744
+ }
2745
+ try {
2746
+ ajv.addMetaSchema(metaSchema);
2747
+ } catch {
2748
+ }
2749
+ }).catch((error) => {
2750
+ throw new Error(`Failed to load metaschemas (${dialect}): ${error}`);
2751
+ });
2752
+ metaschemaReady.set(dialect, readyPromise);
2753
+ await readyPromise;
2754
+ return ajv;
2722
2755
  }
2723
2756
  async function compileSchema(schema, options = {}) {
2724
- const ajv = getAjv();
2725
- if (metaschemaReady) {
2726
- await metaschemaReady;
2727
- }
2728
- const cacheKey = typeof schema === "string" ? schema : JSON.stringify(schema);
2729
- const cached = schemaCache.get(cacheKey);
2730
- if (cached !== void 0) {
2731
- return cached;
2732
- }
2757
+ const baseKey = typeof schema === "string" ? schema : JSON.stringify(schema);
2733
2758
  let parsedSchema;
2734
2759
  if (typeof schema === "string") {
2735
2760
  try {
@@ -2747,18 +2772,27 @@ async function compileSchema(schema, options = {}) {
2747
2772
  } else {
2748
2773
  parsedSchema = schema;
2749
2774
  }
2775
+ const dialect = detectDialect(parsedSchema);
2776
+ const ajv = await getAjv(dialect);
2777
+ const cacheKey = `${dialect}:${baseKey}`;
2778
+ const cached = schemaCache.get(cacheKey);
2779
+ if (cached !== void 0) {
2780
+ return cached;
2781
+ }
2750
2782
  try {
2751
2783
  if (options.aliases && options.aliases.length > 0) {
2752
2784
  for (const alias of options.aliases) {
2753
2785
  if (alias && ajv.getSchema(alias) === void 0) {
2754
2786
  try {
2755
- ajv.addSchema(parsedSchema, alias);
2787
+ if (typeof parsedSchema === "object" && parsedSchema !== null) {
2788
+ ajv.addSchema(parsedSchema, alias);
2789
+ }
2756
2790
  } catch {
2757
2791
  }
2758
2792
  }
2759
2793
  }
2760
2794
  }
2761
- const validator = await ajv.compileAsync(parsedSchema);
2795
+ const validator = typeof parsedSchema === "boolean" ? ajv.compile(parsedSchema) : await ajv.compileAsync(parsedSchema);
2762
2796
  schemaCache.set(cacheKey, validator);
2763
2797
  return validator;
2764
2798
  } catch (error) {
@@ -2828,8 +2862,39 @@ async function validateFile(filePath, validator) {
2828
2862
  }
2829
2863
  async function validateSchema(schema) {
2830
2864
  try {
2831
- const validator = await compileSchema(schema);
2832
- validateData({}, validator);
2865
+ let parsedSchema;
2866
+ if (typeof schema === "string") {
2867
+ try {
2868
+ parsedSchema = JSON.parse(schema);
2869
+ } catch {
2870
+ parsedSchema = parse(schema);
2871
+ }
2872
+ } else if (Buffer.isBuffer(schema)) {
2873
+ const content = schema.toString("utf-8");
2874
+ try {
2875
+ parsedSchema = JSON.parse(content);
2876
+ } catch {
2877
+ parsedSchema = parse(content);
2878
+ }
2879
+ } else {
2880
+ parsedSchema = schema;
2881
+ }
2882
+ const dialect = detectDialect(parsedSchema);
2883
+ const ajv = await getAjv(dialect);
2884
+ const metaValid = ajv.validateSchema(parsedSchema);
2885
+ if (!metaValid && ajv.errors) {
2886
+ const diagnostics = ajv.errors.map(
2887
+ (error) => createDiagnostic(
2888
+ error.instancePath || "",
2889
+ error.message || "Schema meta-validation failed",
2890
+ error.keyword || "unknown",
2891
+ "ERROR",
2892
+ "ajv"
2893
+ )
2894
+ );
2895
+ return { valid: false, diagnostics, source: "ajv" };
2896
+ }
2897
+ await compileSchema(parsedSchema);
2833
2898
  return {
2834
2899
  valid: true,
2835
2900
  diagnostics: [],
@@ -2900,14 +2965,15 @@ async function validateFileBySchemaId(filePath, schemaId, registryOptions) {
2900
2965
  throw error;
2901
2966
  }
2902
2967
  }
2903
- var ajvInstance, metaschemaReady, schemaCache;
2968
+ var ajvInstances, metaschemaReady, schemaCache;
2904
2969
  var init_validator = __esm({
2905
2970
  "src/schema/validator.ts"() {
2906
2971
  init_telemetry();
2907
2972
  init_errors();
2908
2973
  init_registry2();
2909
2974
  init_utils();
2910
- metaschemaReady = null;
2975
+ ajvInstances = /* @__PURE__ */ new Map();
2976
+ metaschemaReady = /* @__PURE__ */ new Map();
2911
2977
  schemaCache = /* @__PURE__ */ new Map();
2912
2978
  }
2913
2979
  });