@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/foundry/index.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
2693
|
-
if (!
|
|
2694
|
-
|
|
2695
|
-
|
|
2696
|
-
|
|
2697
|
-
|
|
2698
|
-
|
|
2699
|
-
|
|
2700
|
-
|
|
2701
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
2832
|
-
|
|
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
|
|
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
|
-
|
|
2975
|
+
ajvInstances = /* @__PURE__ */ new Map();
|
|
2976
|
+
metaschemaReady = /* @__PURE__ */ new Map();
|
|
2911
2977
|
schemaCache = /* @__PURE__ */ new Map();
|
|
2912
2978
|
}
|
|
2913
2979
|
});
|