@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
@@ -10,6 +10,9 @@ import { suggest as suggest$1, substringSimilarity, score as score$1, normalize
10
10
  import 'crypto';
11
11
  import { Command } from 'commander';
12
12
  import Ajv from 'ajv';
13
+ import Ajv2019 from 'ajv/dist/2019';
14
+ import Ajv2020 from 'ajv/dist/2020';
15
+ import AjvDraft04 from 'ajv-draft-04';
13
16
  import addFormats from 'ajv-formats';
14
17
 
15
18
  var __defProp = Object.defineProperty;
@@ -4410,20 +4413,14 @@ async function loadMetaSchema(draft) {
4410
4413
  const content = await readFile(metaSchemaPath, "utf-8");
4411
4414
  return JSON.parse(content);
4412
4415
  }
4413
- async function loadVocabularySchemas() {
4416
+ async function loadVocabularySchemas(draft) {
4417
+ if (draft !== "draft-2019-09" && draft !== "draft-2020-12") {
4418
+ return [];
4419
+ }
4414
4420
  const __filename3 = fileURLToPath(import.meta.url);
4415
4421
  const __dirname4 = dirname(__filename3);
4416
- const vocabDir = join(
4417
- __dirname4,
4418
- "..",
4419
- "..",
4420
- "schemas",
4421
- "crucible-ts",
4422
- "meta",
4423
- "draft-2020-12",
4424
- "meta"
4425
- );
4426
- const vocabFiles = [
4422
+ const vocabDir = join(__dirname4, "..", "..", "schemas", "crucible-ts", "meta", draft, "meta");
4423
+ const vocabFiles = draft === "draft-2020-12" ? [
4427
4424
  "core.json",
4428
4425
  "applicator.json",
4429
4426
  "unevaluated.json",
@@ -4431,6 +4428,13 @@ async function loadVocabularySchemas() {
4431
4428
  "meta-data.json",
4432
4429
  "format-annotation.json",
4433
4430
  "content.json"
4431
+ ] : [
4432
+ "core.json",
4433
+ "applicator.json",
4434
+ "validation.json",
4435
+ "meta-data.json",
4436
+ "format.json",
4437
+ "content.json"
4434
4438
  ];
4435
4439
  const schemas = [];
4436
4440
  for (const file of vocabFiles) {
@@ -4485,47 +4489,68 @@ async function loadReferencedSchema(uri) {
4485
4489
  }
4486
4490
  return JSON.parse(content);
4487
4491
  }
4488
- function getAjv() {
4489
- if (!ajvInstance) {
4490
- ajvInstance = new Ajv({
4491
- strict: false,
4492
- allErrors: true,
4493
- verbose: true,
4494
- // Allow schemas with $id to be added without replacing existing ones
4495
- addUsedSchema: false,
4496
- // Enable async schema loading for YAML references
4497
- loadSchema: loadReferencedSchema
4498
- });
4499
- addFormats(ajvInstance, {
4500
- mode: "fast",
4501
- formats: ["date-time", "email", "hostname", "ipv4", "ipv6", "uri", "uri-reference"]
4502
- });
4503
- metaschemaReady = Promise.all([loadVocabularySchemas(), loadMetaSchema("draft-2020-12")]).then(([vocabSchemas, metaSchema]) => {
4504
- if (ajvInstance) {
4505
- for (const vocabSchema of vocabSchemas) {
4506
- try {
4507
- ajvInstance.addMetaSchema(vocabSchema);
4508
- } catch {
4509
- }
4510
- }
4511
- ajvInstance.addMetaSchema(metaSchema);
4512
- }
4513
- }).catch((error) => {
4514
- throw new Error(`Failed to load metaschemas: ${error}`);
4515
- });
4492
+ function detectDialect(schema) {
4493
+ if (schema && typeof schema === "object" && !Array.isArray(schema)) {
4494
+ const maybeSchema = schema;
4495
+ const declared = maybeSchema.$schema;
4496
+ if (typeof declared === "string") {
4497
+ if (declared.includes("draft-04")) return "draft-04";
4498
+ if (declared.includes("draft-06")) return "draft-06";
4499
+ if (declared.includes("draft-07")) return "draft-07";
4500
+ if (declared.includes("draft/2019-09")) return "draft-2019-09";
4501
+ if (declared.includes("draft/2020-12")) return "draft-2020-12";
4502
+ }
4516
4503
  }
4517
- return ajvInstance;
4504
+ return "draft-2020-12";
4505
+ }
4506
+ function createAjv(dialect) {
4507
+ const AjvCtor = dialect === "draft-2020-12" ? Ajv2020 : dialect === "draft-2019-09" ? Ajv2019 : dialect === "draft-04" ? AjvDraft04 : Ajv;
4508
+ const ajv = new AjvCtor({
4509
+ strict: false,
4510
+ allErrors: true,
4511
+ verbose: true,
4512
+ // Allow schemas with $id to be added without replacing existing ones
4513
+ addUsedSchema: false,
4514
+ // draft-04 uses "id"; later drafts use "$id"
4515
+ schemaId: dialect === "draft-04" ? "id" : "$id",
4516
+ // Enable async schema loading for YAML references
4517
+ loadSchema: loadReferencedSchema
4518
+ });
4519
+ addFormats(ajv, {
4520
+ mode: "fast",
4521
+ formats: ["date-time", "email", "hostname", "ipv4", "ipv6", "uri", "uri-reference"]
4522
+ });
4523
+ return ajv;
4524
+ }
4525
+ async function getAjv(dialect) {
4526
+ const existing = ajvInstances.get(dialect);
4527
+ if (existing) {
4528
+ const ready = metaschemaReady.get(dialect);
4529
+ if (ready) await ready;
4530
+ return existing;
4531
+ }
4532
+ const ajv = createAjv(dialect);
4533
+ ajvInstances.set(dialect, ajv);
4534
+ const readyPromise = Promise.all([loadVocabularySchemas(dialect), loadMetaSchema(dialect)]).then(([vocabSchemas, metaSchema]) => {
4535
+ for (const vocabSchema of vocabSchemas) {
4536
+ try {
4537
+ ajv.addMetaSchema(vocabSchema);
4538
+ } catch {
4539
+ }
4540
+ }
4541
+ try {
4542
+ ajv.addMetaSchema(metaSchema);
4543
+ } catch {
4544
+ }
4545
+ }).catch((error) => {
4546
+ throw new Error(`Failed to load metaschemas (${dialect}): ${error}`);
4547
+ });
4548
+ metaschemaReady.set(dialect, readyPromise);
4549
+ await readyPromise;
4550
+ return ajv;
4518
4551
  }
4519
4552
  async function compileSchema(schema, options = {}) {
4520
- const ajv = getAjv();
4521
- if (metaschemaReady) {
4522
- await metaschemaReady;
4523
- }
4524
- const cacheKey = typeof schema === "string" ? schema : JSON.stringify(schema);
4525
- const cached = schemaCache.get(cacheKey);
4526
- if (cached !== void 0) {
4527
- return cached;
4528
- }
4553
+ const baseKey = typeof schema === "string" ? schema : JSON.stringify(schema);
4529
4554
  let parsedSchema;
4530
4555
  if (typeof schema === "string") {
4531
4556
  try {
@@ -4543,18 +4568,27 @@ async function compileSchema(schema, options = {}) {
4543
4568
  } else {
4544
4569
  parsedSchema = schema;
4545
4570
  }
4571
+ const dialect = detectDialect(parsedSchema);
4572
+ const ajv = await getAjv(dialect);
4573
+ const cacheKey = `${dialect}:${baseKey}`;
4574
+ const cached = schemaCache.get(cacheKey);
4575
+ if (cached !== void 0) {
4576
+ return cached;
4577
+ }
4546
4578
  try {
4547
4579
  if (options.aliases && options.aliases.length > 0) {
4548
4580
  for (const alias of options.aliases) {
4549
4581
  if (alias && ajv.getSchema(alias) === void 0) {
4550
4582
  try {
4551
- ajv.addSchema(parsedSchema, alias);
4583
+ if (typeof parsedSchema === "object" && parsedSchema !== null) {
4584
+ ajv.addSchema(parsedSchema, alias);
4585
+ }
4552
4586
  } catch {
4553
4587
  }
4554
4588
  }
4555
4589
  }
4556
4590
  }
4557
- const validator = await ajv.compileAsync(parsedSchema);
4591
+ const validator = typeof parsedSchema === "boolean" ? ajv.compile(parsedSchema) : await ajv.compileAsync(parsedSchema);
4558
4592
  schemaCache.set(cacheKey, validator);
4559
4593
  return validator;
4560
4594
  } catch (error) {
@@ -4624,8 +4658,39 @@ async function validateFile(filePath, validator) {
4624
4658
  }
4625
4659
  async function validateSchema(schema) {
4626
4660
  try {
4627
- const validator = await compileSchema(schema);
4628
- validateData({}, validator);
4661
+ let parsedSchema;
4662
+ if (typeof schema === "string") {
4663
+ try {
4664
+ parsedSchema = JSON.parse(schema);
4665
+ } catch {
4666
+ parsedSchema = parse(schema);
4667
+ }
4668
+ } else if (Buffer.isBuffer(schema)) {
4669
+ const content = schema.toString("utf-8");
4670
+ try {
4671
+ parsedSchema = JSON.parse(content);
4672
+ } catch {
4673
+ parsedSchema = parse(content);
4674
+ }
4675
+ } else {
4676
+ parsedSchema = schema;
4677
+ }
4678
+ const dialect = detectDialect(parsedSchema);
4679
+ const ajv = await getAjv(dialect);
4680
+ const metaValid = ajv.validateSchema(parsedSchema);
4681
+ if (!metaValid && ajv.errors) {
4682
+ const diagnostics = ajv.errors.map(
4683
+ (error) => createDiagnostic(
4684
+ error.instancePath || "",
4685
+ error.message || "Schema meta-validation failed",
4686
+ error.keyword || "unknown",
4687
+ "ERROR",
4688
+ "ajv"
4689
+ )
4690
+ );
4691
+ return { valid: false, diagnostics, source: "ajv" };
4692
+ }
4693
+ await compileSchema(parsedSchema);
4629
4694
  return {
4630
4695
  valid: true,
4631
4696
  diagnostics: [],
@@ -4696,14 +4761,15 @@ async function validateFileBySchemaId(filePath, schemaId, registryOptions) {
4696
4761
  throw error;
4697
4762
  }
4698
4763
  }
4699
- var ajvInstance, metaschemaReady, schemaCache;
4764
+ var ajvInstances, metaschemaReady, schemaCache;
4700
4765
  var init_validator = __esm({
4701
4766
  "src/schema/validator.ts"() {
4702
4767
  init_telemetry();
4703
4768
  init_errors();
4704
4769
  init_registry2();
4705
4770
  init_utils();
4706
- metaschemaReady = null;
4771
+ ajvInstances = /* @__PURE__ */ new Map();
4772
+ metaschemaReady = /* @__PURE__ */ new Map();
4707
4773
  schemaCache = /* @__PURE__ */ new Map();
4708
4774
  }
4709
4775
  });