@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.
- package/CHANGELOG.md +42 -0
- package/README.md +60 -7
- package/config/crucible-ts/agentic/roles/README.md +3 -3
- package/config/crucible-ts/library/fulencode/fixtures/README.md +18 -0
- package/config/crucible-ts/library/fulencode/fixtures/bom/bom.yaml +14 -0
- package/config/crucible-ts/library/fulencode/fixtures/detection/detection.yaml +12 -0
- package/config/crucible-ts/library/fulencode/fixtures/invalid-encodings/base64.yaml +10 -0
- package/config/crucible-ts/library/fulencode/fixtures/normalization/text-safe.yaml +10 -0
- package/config/crucible-ts/library/fulencode/fixtures/telemetry/telemetry-test-cases.yaml +24 -0
- package/config/crucible-ts/library/fulencode/fixtures/valid-encodings/base64.yaml +11 -0
- package/config/crucible-ts/taxonomy/library/platform-modules/v1.0.0/modules.yaml +2 -2
- package/config/crucible-ts/taxonomy/metrics.yaml +79 -1
- package/dist/appidentity/index.d.ts +1 -1
- package/dist/appidentity/index.js +122 -56
- package/dist/appidentity/index.js.map +1 -1
- package/dist/config/index.js +122 -56
- package/dist/config/index.js.map +1 -1
- package/dist/crucible/index.js +122 -56
- package/dist/crucible/index.js.map +1 -1
- package/dist/errors/index.d.ts +1 -1
- package/dist/errors/index.js +122 -56
- package/dist/errors/index.js.map +1 -1
- package/dist/foundry/index.js +122 -56
- package/dist/foundry/index.js.map +1 -1
- package/dist/fulencode/index.d.ts +102 -0
- package/dist/fulencode/index.js +806 -0
- package/dist/fulencode/index.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +123 -57
- package/dist/index.js.map +1 -1
- package/dist/pathfinder/index.d.ts +1 -1
- package/dist/pathfinder/index.js +122 -56
- package/dist/pathfinder/index.js.map +1 -1
- package/dist/reports/license-inventory.csv +7 -6
- package/dist/schema/index.d.ts +2 -2
- package/dist/schema/index.js +122 -56
- package/dist/schema/index.js.map +1 -1
- package/dist/signals/index.js +122 -56
- package/dist/signals/index.js.map +1 -1
- package/dist/telemetry/http/index.js +122 -56
- package/dist/telemetry/http/index.js.map +1 -1
- package/dist/telemetry/index.d.ts +1 -1
- package/dist/telemetry/index.js +122 -56
- package/dist/telemetry/index.js.map +1 -1
- package/dist/telemetry/prometheus/index.d.ts +1 -1
- package/dist/telemetry/prometheus/index.js +122 -56
- package/dist/telemetry/prometheus/index.js.map +1 -1
- package/dist/{types-BJswWpQC.d.ts → types-DdoeE7F5.d.ts} +1 -1
- package/package.json +7 -2
- package/schemas/crucible-ts/library/fulencode/v1.0.0/README.md +37 -0
- package/schemas/crucible-ts/library/fulencode/v1.0.0/bom-result.schema.json +48 -0
- package/schemas/crucible-ts/library/fulencode/v1.0.0/decode-options.schema.json +60 -0
- package/schemas/crucible-ts/library/fulencode/v1.0.0/decoding-result.schema.json +70 -0
- package/schemas/crucible-ts/library/fulencode/v1.0.0/detect-options.schema.json +25 -0
- package/schemas/crucible-ts/library/fulencode/v1.0.0/detection-result.schema.json +57 -0
- package/schemas/crucible-ts/library/fulencode/v1.0.0/encode-options.schema.json +71 -0
- package/schemas/crucible-ts/library/fulencode/v1.0.0/encoding-result.schema.json +57 -0
- package/schemas/crucible-ts/library/fulencode/v1.0.0/fulencode-config.schema.json +8 -4
- package/schemas/crucible-ts/library/fulencode/v1.0.0/fulencode-error.schema.json +66 -0
- package/schemas/crucible-ts/library/fulencode/v1.0.0/normalization-result.schema.json +73 -0
- package/schemas/crucible-ts/library/fulencode/v1.0.0/normalize-options.schema.json +44 -0
- package/schemas/crucible-ts/meta/README.md +38 -2
- package/schemas/crucible-ts/meta/draft-04/schema.json +222 -0
- package/schemas/crucible-ts/meta/draft-06/schema.json +218 -0
- package/schemas/crucible-ts/meta/draft-2019-09/meta/applicator.json +93 -0
- package/schemas/crucible-ts/meta/draft-2019-09/meta/content.json +21 -0
- package/schemas/crucible-ts/meta/draft-2019-09/meta/core.json +58 -0
- package/schemas/crucible-ts/meta/draft-2019-09/meta/format.json +15 -0
- package/schemas/crucible-ts/meta/draft-2019-09/meta/meta-data.json +35 -0
- package/schemas/crucible-ts/meta/draft-2019-09/meta/validation.json +119 -0
- package/schemas/crucible-ts/meta/draft-2019-09/offline.schema.json +148 -0
- package/schemas/crucible-ts/meta/draft-2019-09/schema.json +62 -0
- package/schemas/crucible-ts/meta/fixtures/draft-04-sample.json +16 -0
- package/schemas/crucible-ts/meta/fixtures/draft-06-sample.json +16 -0
- package/schemas/crucible-ts/meta/fixtures/draft-07-sample.json +34 -0
- package/schemas/crucible-ts/meta/fixtures/draft-2019-09-sample.json +21 -0
- package/schemas/crucible-ts/meta/fixtures/draft-2020-12-sample.json +21 -0
- package/schemas/crucible-ts/taxonomy/library/fulencode/normalization-profiles/v1.0.0/profiles.yaml +16 -0
- package/schemas/crucible-ts/upstream/3leaps/crucible/PROVENANCE.md +64 -0
- package/schemas/crucible-ts/upstream/3leaps/crucible/config/classifiers/dimensions/access-tier.dimension.json +103 -0
- package/schemas/crucible-ts/upstream/3leaps/crucible/config/classifiers/dimensions/retention-lifecycle.dimension.json +103 -0
- package/schemas/crucible-ts/upstream/3leaps/crucible/config/classifiers/dimensions/schema-stability.dimension.json +100 -0
- package/schemas/crucible-ts/upstream/3leaps/crucible/config/classifiers/dimensions/sensitivity.dimension.json +130 -0
- package/schemas/crucible-ts/upstream/3leaps/crucible/config/classifiers/dimensions/velocity-mode.dimension.json +79 -0
- package/schemas/crucible-ts/upstream/3leaps/crucible/config/classifiers/dimensions/volatility.dimension.json +72 -0
- package/schemas/crucible-ts/upstream/3leaps/crucible/config/classifiers/dimensions/volume-tier.dimension.json +66 -0
- package/schemas/crucible-ts/upstream/3leaps/crucible/docs/catalog/classifiers/README.md +29 -0
- package/schemas/crucible-ts/upstream/3leaps/crucible/docs/standards/access-tier-classification.md +163 -0
- package/schemas/crucible-ts/upstream/3leaps/crucible/docs/standards/classifiers-framework.md +157 -0
- package/schemas/crucible-ts/upstream/3leaps/crucible/docs/standards/data-sensitivity-classification.md +259 -0
- package/schemas/crucible-ts/upstream/3leaps/crucible/docs/standards/retention-lifecycle-classification.md +200 -0
- package/schemas/crucible-ts/upstream/3leaps/crucible/docs/standards/schema-stability-classification.md +205 -0
- package/schemas/crucible-ts/upstream/3leaps/crucible/docs/standards/velocity-mode-classification.md +222 -0
- package/schemas/crucible-ts/upstream/3leaps/crucible/docs/standards/volatility-classification.md +209 -0
- package/schemas/crucible-ts/upstream/3leaps/crucible/docs/standards/volume-tier-classification.md +200 -0
- package/schemas/crucible-ts/upstream/3leaps/crucible/schemas/ailink/v0/README.md +48 -0
- package/schemas/crucible-ts/upstream/3leaps/{ailink → crucible/schemas/ailink}/v0/prompt.schema.json +4 -18
- package/schemas/crucible-ts/upstream/3leaps/{ailink → crucible/schemas/ailink}/v0/search-response.schema.json +7 -37
- package/schemas/crucible-ts/upstream/3leaps/crucible/schemas/classifiers/v0/dimension-definition.schema.json +247 -0
- package/schemas/crucible-ts/upstream/3leaps/crucible/schemas/classifiers/v0/sensitivity-level.schema.json +67 -0
- package/schemas/crucible-ts/upstream/3leaps/crucible/schemas/foundation/v0/error-response.schema.json +59 -0
- package/schemas/crucible-ts/upstream/3leaps/crucible/schemas/foundation/v0/lifecycle-phases.data.json +102 -0
- package/schemas/crucible-ts/upstream/3leaps/crucible/schemas/foundation/v0/lifecycle-phases.schema.json +101 -0
- package/schemas/crucible-ts/upstream/3leaps/crucible/schemas/foundation/v0/release-phase.schema.json +18 -0
- package/schemas/crucible-ts/upstream/3leaps/crucible/schemas/foundation/v0/types.schema.json +177 -0
- package/schemas/crucible-ts/upstream/3leaps/PROVENANCE.md +0 -43
- /package/schemas/crucible-ts/upstream/3leaps/{agentic → crucible/schemas/agentic}/v0/role-prompt.schema.json +0 -0
package/dist/signals/index.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
4489
|
-
if (!
|
|
4490
|
-
|
|
4491
|
-
|
|
4492
|
-
|
|
4493
|
-
|
|
4494
|
-
|
|
4495
|
-
|
|
4496
|
-
|
|
4497
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
4628
|
-
|
|
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
|
|
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
|
-
|
|
4771
|
+
ajvInstances = /* @__PURE__ */ new Map();
|
|
4772
|
+
metaschemaReady = /* @__PURE__ */ new Map();
|
|
4707
4773
|
schemaCache = /* @__PURE__ */ new Map();
|
|
4708
4774
|
}
|
|
4709
4775
|
});
|