@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
|
@@ -5,6 +5,9 @@ import { dirname, join, relative, extname } from 'path';
|
|
|
5
5
|
import { fileURLToPath } from 'url';
|
|
6
6
|
import glob from 'fast-glob';
|
|
7
7
|
import Ajv from 'ajv';
|
|
8
|
+
import Ajv2019 from 'ajv/dist/2019';
|
|
9
|
+
import Ajv2020 from 'ajv/dist/2020';
|
|
10
|
+
import AjvDraft04 from 'ajv-draft-04';
|
|
8
11
|
import addFormats from 'ajv-formats';
|
|
9
12
|
import { Readable } from 'stream';
|
|
10
13
|
import picomatch from 'picomatch';
|
|
@@ -1485,20 +1488,14 @@ async function loadMetaSchema(draft) {
|
|
|
1485
1488
|
const content = await readFile(metaSchemaPath, "utf-8");
|
|
1486
1489
|
return JSON.parse(content);
|
|
1487
1490
|
}
|
|
1488
|
-
async function loadVocabularySchemas() {
|
|
1491
|
+
async function loadVocabularySchemas(draft) {
|
|
1492
|
+
if (draft !== "draft-2019-09" && draft !== "draft-2020-12") {
|
|
1493
|
+
return [];
|
|
1494
|
+
}
|
|
1489
1495
|
const __filename3 = fileURLToPath(import.meta.url);
|
|
1490
1496
|
const __dirname4 = dirname(__filename3);
|
|
1491
|
-
const vocabDir = join(
|
|
1492
|
-
|
|
1493
|
-
"..",
|
|
1494
|
-
"..",
|
|
1495
|
-
"schemas",
|
|
1496
|
-
"crucible-ts",
|
|
1497
|
-
"meta",
|
|
1498
|
-
"draft-2020-12",
|
|
1499
|
-
"meta"
|
|
1500
|
-
);
|
|
1501
|
-
const vocabFiles = [
|
|
1497
|
+
const vocabDir = join(__dirname4, "..", "..", "schemas", "crucible-ts", "meta", draft, "meta");
|
|
1498
|
+
const vocabFiles = draft === "draft-2020-12" ? [
|
|
1502
1499
|
"core.json",
|
|
1503
1500
|
"applicator.json",
|
|
1504
1501
|
"unevaluated.json",
|
|
@@ -1506,6 +1503,13 @@ async function loadVocabularySchemas() {
|
|
|
1506
1503
|
"meta-data.json",
|
|
1507
1504
|
"format-annotation.json",
|
|
1508
1505
|
"content.json"
|
|
1506
|
+
] : [
|
|
1507
|
+
"core.json",
|
|
1508
|
+
"applicator.json",
|
|
1509
|
+
"validation.json",
|
|
1510
|
+
"meta-data.json",
|
|
1511
|
+
"format.json",
|
|
1512
|
+
"content.json"
|
|
1509
1513
|
];
|
|
1510
1514
|
const schemas = [];
|
|
1511
1515
|
for (const file of vocabFiles) {
|
|
@@ -1560,47 +1564,68 @@ async function loadReferencedSchema(uri) {
|
|
|
1560
1564
|
}
|
|
1561
1565
|
return JSON.parse(content);
|
|
1562
1566
|
}
|
|
1563
|
-
function
|
|
1564
|
-
if (!
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
}
|
|
1574
|
-
addFormats(ajvInstance, {
|
|
1575
|
-
mode: "fast",
|
|
1576
|
-
formats: ["date-time", "email", "hostname", "ipv4", "ipv6", "uri", "uri-reference"]
|
|
1577
|
-
});
|
|
1578
|
-
metaschemaReady = Promise.all([loadVocabularySchemas(), loadMetaSchema("draft-2020-12")]).then(([vocabSchemas, metaSchema]) => {
|
|
1579
|
-
if (ajvInstance) {
|
|
1580
|
-
for (const vocabSchema of vocabSchemas) {
|
|
1581
|
-
try {
|
|
1582
|
-
ajvInstance.addMetaSchema(vocabSchema);
|
|
1583
|
-
} catch {
|
|
1584
|
-
}
|
|
1585
|
-
}
|
|
1586
|
-
ajvInstance.addMetaSchema(metaSchema);
|
|
1587
|
-
}
|
|
1588
|
-
}).catch((error) => {
|
|
1589
|
-
throw new Error(`Failed to load metaschemas: ${error}`);
|
|
1590
|
-
});
|
|
1567
|
+
function detectDialect(schema) {
|
|
1568
|
+
if (schema && typeof schema === "object" && !Array.isArray(schema)) {
|
|
1569
|
+
const maybeSchema = schema;
|
|
1570
|
+
const declared = maybeSchema.$schema;
|
|
1571
|
+
if (typeof declared === "string") {
|
|
1572
|
+
if (declared.includes("draft-04")) return "draft-04";
|
|
1573
|
+
if (declared.includes("draft-06")) return "draft-06";
|
|
1574
|
+
if (declared.includes("draft-07")) return "draft-07";
|
|
1575
|
+
if (declared.includes("draft/2019-09")) return "draft-2019-09";
|
|
1576
|
+
if (declared.includes("draft/2020-12")) return "draft-2020-12";
|
|
1577
|
+
}
|
|
1591
1578
|
}
|
|
1592
|
-
return
|
|
1579
|
+
return "draft-2020-12";
|
|
1580
|
+
}
|
|
1581
|
+
function createAjv(dialect) {
|
|
1582
|
+
const AjvCtor = dialect === "draft-2020-12" ? Ajv2020 : dialect === "draft-2019-09" ? Ajv2019 : dialect === "draft-04" ? AjvDraft04 : Ajv;
|
|
1583
|
+
const ajv = new AjvCtor({
|
|
1584
|
+
strict: false,
|
|
1585
|
+
allErrors: true,
|
|
1586
|
+
verbose: true,
|
|
1587
|
+
// Allow schemas with $id to be added without replacing existing ones
|
|
1588
|
+
addUsedSchema: false,
|
|
1589
|
+
// draft-04 uses "id"; later drafts use "$id"
|
|
1590
|
+
schemaId: dialect === "draft-04" ? "id" : "$id",
|
|
1591
|
+
// Enable async schema loading for YAML references
|
|
1592
|
+
loadSchema: loadReferencedSchema
|
|
1593
|
+
});
|
|
1594
|
+
addFormats(ajv, {
|
|
1595
|
+
mode: "fast",
|
|
1596
|
+
formats: ["date-time", "email", "hostname", "ipv4", "ipv6", "uri", "uri-reference"]
|
|
1597
|
+
});
|
|
1598
|
+
return ajv;
|
|
1599
|
+
}
|
|
1600
|
+
async function getAjv(dialect) {
|
|
1601
|
+
const existing = ajvInstances.get(dialect);
|
|
1602
|
+
if (existing) {
|
|
1603
|
+
const ready = metaschemaReady.get(dialect);
|
|
1604
|
+
if (ready) await ready;
|
|
1605
|
+
return existing;
|
|
1606
|
+
}
|
|
1607
|
+
const ajv = createAjv(dialect);
|
|
1608
|
+
ajvInstances.set(dialect, ajv);
|
|
1609
|
+
const readyPromise = Promise.all([loadVocabularySchemas(dialect), loadMetaSchema(dialect)]).then(([vocabSchemas, metaSchema]) => {
|
|
1610
|
+
for (const vocabSchema of vocabSchemas) {
|
|
1611
|
+
try {
|
|
1612
|
+
ajv.addMetaSchema(vocabSchema);
|
|
1613
|
+
} catch {
|
|
1614
|
+
}
|
|
1615
|
+
}
|
|
1616
|
+
try {
|
|
1617
|
+
ajv.addMetaSchema(metaSchema);
|
|
1618
|
+
} catch {
|
|
1619
|
+
}
|
|
1620
|
+
}).catch((error) => {
|
|
1621
|
+
throw new Error(`Failed to load metaschemas (${dialect}): ${error}`);
|
|
1622
|
+
});
|
|
1623
|
+
metaschemaReady.set(dialect, readyPromise);
|
|
1624
|
+
await readyPromise;
|
|
1625
|
+
return ajv;
|
|
1593
1626
|
}
|
|
1594
1627
|
async function compileSchema(schema, options = {}) {
|
|
1595
|
-
const
|
|
1596
|
-
if (metaschemaReady) {
|
|
1597
|
-
await metaschemaReady;
|
|
1598
|
-
}
|
|
1599
|
-
const cacheKey = typeof schema === "string" ? schema : JSON.stringify(schema);
|
|
1600
|
-
const cached = schemaCache.get(cacheKey);
|
|
1601
|
-
if (cached !== void 0) {
|
|
1602
|
-
return cached;
|
|
1603
|
-
}
|
|
1628
|
+
const baseKey = typeof schema === "string" ? schema : JSON.stringify(schema);
|
|
1604
1629
|
let parsedSchema;
|
|
1605
1630
|
if (typeof schema === "string") {
|
|
1606
1631
|
try {
|
|
@@ -1618,18 +1643,27 @@ async function compileSchema(schema, options = {}) {
|
|
|
1618
1643
|
} else {
|
|
1619
1644
|
parsedSchema = schema;
|
|
1620
1645
|
}
|
|
1646
|
+
const dialect = detectDialect(parsedSchema);
|
|
1647
|
+
const ajv = await getAjv(dialect);
|
|
1648
|
+
const cacheKey = `${dialect}:${baseKey}`;
|
|
1649
|
+
const cached = schemaCache.get(cacheKey);
|
|
1650
|
+
if (cached !== void 0) {
|
|
1651
|
+
return cached;
|
|
1652
|
+
}
|
|
1621
1653
|
try {
|
|
1622
1654
|
if (options.aliases && options.aliases.length > 0) {
|
|
1623
1655
|
for (const alias of options.aliases) {
|
|
1624
1656
|
if (alias && ajv.getSchema(alias) === void 0) {
|
|
1625
1657
|
try {
|
|
1626
|
-
|
|
1658
|
+
if (typeof parsedSchema === "object" && parsedSchema !== null) {
|
|
1659
|
+
ajv.addSchema(parsedSchema, alias);
|
|
1660
|
+
}
|
|
1627
1661
|
} catch {
|
|
1628
1662
|
}
|
|
1629
1663
|
}
|
|
1630
1664
|
}
|
|
1631
1665
|
}
|
|
1632
|
-
const validator = await ajv.compileAsync(parsedSchema);
|
|
1666
|
+
const validator = typeof parsedSchema === "boolean" ? ajv.compile(parsedSchema) : await ajv.compileAsync(parsedSchema);
|
|
1633
1667
|
schemaCache.set(cacheKey, validator);
|
|
1634
1668
|
return validator;
|
|
1635
1669
|
} catch (error) {
|
|
@@ -1699,8 +1733,39 @@ async function validateFile(filePath, validator) {
|
|
|
1699
1733
|
}
|
|
1700
1734
|
async function validateSchema(schema) {
|
|
1701
1735
|
try {
|
|
1702
|
-
|
|
1703
|
-
|
|
1736
|
+
let parsedSchema;
|
|
1737
|
+
if (typeof schema === "string") {
|
|
1738
|
+
try {
|
|
1739
|
+
parsedSchema = JSON.parse(schema);
|
|
1740
|
+
} catch {
|
|
1741
|
+
parsedSchema = parse(schema);
|
|
1742
|
+
}
|
|
1743
|
+
} else if (Buffer.isBuffer(schema)) {
|
|
1744
|
+
const content = schema.toString("utf-8");
|
|
1745
|
+
try {
|
|
1746
|
+
parsedSchema = JSON.parse(content);
|
|
1747
|
+
} catch {
|
|
1748
|
+
parsedSchema = parse(content);
|
|
1749
|
+
}
|
|
1750
|
+
} else {
|
|
1751
|
+
parsedSchema = schema;
|
|
1752
|
+
}
|
|
1753
|
+
const dialect = detectDialect(parsedSchema);
|
|
1754
|
+
const ajv = await getAjv(dialect);
|
|
1755
|
+
const metaValid = ajv.validateSchema(parsedSchema);
|
|
1756
|
+
if (!metaValid && ajv.errors) {
|
|
1757
|
+
const diagnostics = ajv.errors.map(
|
|
1758
|
+
(error) => createDiagnostic(
|
|
1759
|
+
error.instancePath || "",
|
|
1760
|
+
error.message || "Schema meta-validation failed",
|
|
1761
|
+
error.keyword || "unknown",
|
|
1762
|
+
"ERROR",
|
|
1763
|
+
"ajv"
|
|
1764
|
+
)
|
|
1765
|
+
);
|
|
1766
|
+
return { valid: false, diagnostics, source: "ajv" };
|
|
1767
|
+
}
|
|
1768
|
+
await compileSchema(parsedSchema);
|
|
1704
1769
|
return {
|
|
1705
1770
|
valid: true,
|
|
1706
1771
|
diagnostics: [],
|
|
@@ -1771,14 +1836,15 @@ async function validateFileBySchemaId(filePath, schemaId, registryOptions) {
|
|
|
1771
1836
|
throw error;
|
|
1772
1837
|
}
|
|
1773
1838
|
}
|
|
1774
|
-
var
|
|
1839
|
+
var ajvInstances, metaschemaReady, schemaCache;
|
|
1775
1840
|
var init_validator = __esm({
|
|
1776
1841
|
"src/schema/validator.ts"() {
|
|
1777
1842
|
init_telemetry();
|
|
1778
1843
|
init_errors();
|
|
1779
1844
|
init_registry();
|
|
1780
1845
|
init_utils();
|
|
1781
|
-
|
|
1846
|
+
ajvInstances = /* @__PURE__ */ new Map();
|
|
1847
|
+
metaschemaReady = /* @__PURE__ */ new Map();
|
|
1782
1848
|
schemaCache = /* @__PURE__ */ new Map();
|
|
1783
1849
|
}
|
|
1784
1850
|
});
|