@fulmenhq/tsfulmen 0.1.13 → 0.2.0

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 (165) hide show
  1. package/CHANGELOG.md +73 -512
  2. package/README.md +111 -28
  3. package/config/crucible-ts/agentic/roles/README.md +76 -0
  4. package/config/crucible-ts/agentic/roles/cicd.yaml +82 -0
  5. package/config/crucible-ts/agentic/roles/dataeng.yaml +104 -0
  6. package/config/crucible-ts/agentic/roles/devlead.yaml +84 -0
  7. package/config/crucible-ts/agentic/roles/devrev.yaml +105 -0
  8. package/config/crucible-ts/agentic/roles/entarch.yaml +101 -0
  9. package/config/crucible-ts/agentic/roles/infoarch.yaml +95 -0
  10. package/config/crucible-ts/agentic/roles/prodmktg.yaml +92 -0
  11. package/config/crucible-ts/agentic/roles/qa.yaml +148 -0
  12. package/config/crucible-ts/agentic/roles/secrev.yaml +101 -0
  13. package/config/crucible-ts/agentic/roles/uxdev.yaml +168 -0
  14. package/config/crucible-ts/branding/ecosystem.yaml +26 -0
  15. package/config/crucible-ts/library/foundry/exit-codes.snapshot.json +26 -0
  16. package/config/crucible-ts/library/foundry/exit-codes.yaml +28 -3
  17. package/config/crucible-ts/library/foundry/patterns.yaml +2 -2
  18. package/config/crucible-ts/library/foundry/signal-resolution-fixtures.yaml +207 -0
  19. package/config/crucible-ts/library/foundry/signals.yaml +21 -0
  20. package/config/crucible-ts/library/foundry/simplified-modes.snapshot.json +9 -1
  21. package/config/crucible-ts/library/{foundry/similarity-fixtures.yaml → similarity/fixtures.yaml} +1 -1
  22. package/config/crucible-ts/library/v1.0.0/module-manifest.yaml +1 -2
  23. package/config/crucible-ts/taxonomy/fixture-catalog.yaml +145 -0
  24. package/config/crucible-ts/taxonomy/languages.yaml +2 -2
  25. package/config/crucible-ts/taxonomy/library/foundry-catalogs/v1.1.0/catalogs.yaml +77 -0
  26. package/config/crucible-ts/taxonomy/library/platform-modules/v1.1.0/modules.yaml +722 -0
  27. package/config/crucible-ts/taxonomy/metrics.yaml +1 -1
  28. package/config/crucible-ts/taxonomy/repository-categories.yaml +134 -1
  29. package/dist/appidentity/index.d.ts +117 -35
  30. package/dist/appidentity/index.js +752 -592
  31. package/dist/appidentity/index.js.map +1 -1
  32. package/dist/config/index.js +118 -6
  33. package/dist/config/index.js.map +1 -1
  34. package/dist/crucible/index.js +118 -6
  35. package/dist/crucible/index.js.map +1 -1
  36. package/dist/errors/index.js +118 -6
  37. package/dist/errors/index.js.map +1 -1
  38. package/dist/foundry/index.d.ts +13 -676
  39. package/dist/foundry/index.js +118 -6
  40. package/dist/foundry/index.js.map +1 -1
  41. package/dist/foundry/similarity/index.d.ts +2 -2
  42. package/dist/fulhash/index.d.ts +64 -12
  43. package/dist/fulhash/index.js +292 -53
  44. package/dist/fulhash/index.js.map +1 -1
  45. package/dist/index.d.ts +2 -2
  46. package/dist/index.js +753 -593
  47. package/dist/index.js.map +1 -1
  48. package/dist/{manager-D27vrdaS.d.ts → manager-CH3fX7zO.d.ts} +1 -1
  49. package/dist/pathfinder/index.js +368 -59
  50. package/dist/pathfinder/index.js.map +1 -1
  51. package/dist/reports/license-inventory.csv +302 -0
  52. package/dist/schema/index.js +118 -6
  53. package/dist/schema/index.js.map +1 -1
  54. package/dist/signals/index.d.ts +675 -0
  55. package/dist/signals/index.js +5790 -0
  56. package/dist/signals/index.js.map +1 -0
  57. package/dist/similarity/index.d.ts +2 -0
  58. package/dist/similarity/index.js +136 -0
  59. package/dist/similarity/index.js.map +1 -0
  60. package/dist/{suggest-Cv7SVQRu.d.ts → suggest-D8LbwtPV.d.ts} +1 -1
  61. package/dist/telemetry/http/index.js +704 -591
  62. package/dist/telemetry/http/index.js.map +1 -1
  63. package/dist/telemetry/index.js +118 -6
  64. package/dist/telemetry/index.js.map +1 -1
  65. package/dist/telemetry/prometheus/index.d.ts +1 -1
  66. package/dist/telemetry/prometheus/index.js +175 -11
  67. package/dist/telemetry/prometheus/index.js.map +1 -1
  68. package/package.json +15 -6
  69. package/schemas/crucible-ts/assessment/v1.0.0/severity-definitions.schema.json +1 -1
  70. package/schemas/crucible-ts/config/fulmen-ecosystem/v1.0.0/fulmen-config-paths.schema.json +1 -1
  71. package/schemas/crucible-ts/config/repository/app-identity/v1.0.0/app-identity.schema.json +3 -3
  72. package/schemas/crucible-ts/config/repository/v1.0.0/lifecycle-phase.json +1 -1
  73. package/schemas/crucible-ts/config/repository-category/codex/v1.0.0/codex-config.schema.json +1 -1
  74. package/schemas/crucible-ts/config/standards/v1.0.0/adr-adoption-status.json +1 -1
  75. package/schemas/crucible-ts/config/standards/v1.0.0/adr-frontmatter.schema.json +3 -3
  76. package/schemas/crucible-ts/config/standards/v1.0.0/adr-lifecycle-status.json +1 -1
  77. package/schemas/crucible-ts/config/sync-keys.schema.yaml +14 -0
  78. package/schemas/crucible-ts/content/ssot-provenance/v1.0.0/ssot-provenance.schema.json +1 -1
  79. package/schemas/crucible-ts/design/README.md +159 -0
  80. package/schemas/crucible-ts/design/core/v1.0.0/component-states.schema.json +204 -0
  81. package/schemas/crucible-ts/design/core/v1.0.0/semantic-colors.schema.json +179 -0
  82. package/schemas/crucible-ts/design/core/v1.0.0/spacing-scale.schema.json +165 -0
  83. package/schemas/crucible-ts/design/core/v1.0.0/typography-roles.schema.json +195 -0
  84. package/schemas/crucible-ts/design/tui/v1.0.0/color-palette.schema.json +303 -0
  85. package/schemas/crucible-ts/design/tui/v1.0.0/component.schema.json +374 -0
  86. package/schemas/crucible-ts/design/tui/v1.0.0/layout.schema.json +272 -0
  87. package/schemas/crucible-ts/design/tui/v1.0.0/theme.schema.json +205 -0
  88. package/schemas/crucible-ts/design/tui/v1.0.0/typography.schema.json +316 -0
  89. package/schemas/crucible-ts/devsecops/lorage-central/activity/v1.0.0/activity.schema.json +1 -1
  90. package/schemas/crucible-ts/devsecops/lorage-central/credentials/v1.0.0/credentials.schema.json +1 -1
  91. package/schemas/crucible-ts/devsecops/lorage-central/policy/v1.0.0/policy.schema.json +1 -1
  92. package/schemas/crucible-ts/devsecops/lorage-central/recipe/v1.0.0/recipe.schema.json +1 -1
  93. package/schemas/crucible-ts/devsecops/lorage-central/runbooks/v1.0.0/runbook.schema.json +1 -1
  94. package/schemas/crucible-ts/devsecops/lorage-central/tenant/v1.0.0/tenant.schema.json +1 -1
  95. package/schemas/crucible-ts/devsecops/secrets/v1.0.0/secrets.schema.json +1 -1
  96. package/schemas/crucible-ts/error-handling/v1.0.0/error-response.schema.json +1 -1
  97. package/schemas/crucible-ts/library/foundry/v1.0.0/country-codes.schema.json +1 -1
  98. package/schemas/crucible-ts/library/foundry/v1.0.0/exit-codes.schema.json +1 -1
  99. package/schemas/crucible-ts/library/foundry/v1.0.0/http-status-groups.schema.json +1 -1
  100. package/schemas/crucible-ts/library/foundry/v1.0.0/mime-types.schema.json +1 -1
  101. package/schemas/crucible-ts/library/foundry/v1.0.0/patterns.schema.json +1 -1
  102. package/schemas/crucible-ts/library/foundry/v1.0.0/signal-resolution-fixtures.schema.json +140 -0
  103. package/schemas/crucible-ts/library/foundry/v1.0.0/signals.schema.json +6 -1
  104. package/schemas/crucible-ts/library/fulencode/v1.0.0/fulencode-config.schema.json +1 -1
  105. package/schemas/crucible-ts/library/fulhash/v1.0.0/checksum-string.schema.json +2 -2
  106. package/schemas/crucible-ts/library/fulhash/v1.0.0/digest.schema.json +61 -1
  107. package/schemas/crucible-ts/library/fulhash/v1.0.0/fixtures.schema.json +1 -1
  108. package/schemas/crucible-ts/library/fulpack/v1.0.0/archive-entry.schema.json +1 -1
  109. package/schemas/crucible-ts/library/fulpack/v1.0.0/archive-info.schema.json +1 -1
  110. package/schemas/crucible-ts/library/fulpack/v1.0.0/archive-manifest.schema.json +2 -2
  111. package/schemas/crucible-ts/library/fulpack/v1.0.0/create-options.schema.json +1 -1
  112. package/schemas/crucible-ts/library/fulpack/v1.0.0/extract-options.schema.json +1 -1
  113. package/schemas/crucible-ts/library/fulpack/v1.0.0/extract-result.schema.json +1 -1
  114. package/schemas/crucible-ts/library/fulpack/v1.0.0/scan-options.schema.json +1 -1
  115. package/schemas/crucible-ts/library/fulpack/v1.0.0/validation-result.schema.json +1 -1
  116. package/schemas/crucible-ts/library/module-manifest/v1.0.0/module-manifest.schema.json +1 -1
  117. package/schemas/crucible-ts/library/{foundry → similarity}/v1.0.0/similarity.schema.json +2 -2
  118. package/schemas/crucible-ts/library/{foundry → similarity}/v2.0.0/similarity.schema.json +2 -2
  119. package/schemas/crucible-ts/observability/metrics/v1.0.0/metrics-event.schema.json +1 -1
  120. package/schemas/crucible-ts/pathfinder/v1.0.0/find-query.schema.json +1 -1
  121. package/schemas/crucible-ts/pathfinder/v1.0.0/finder-config.schema.json +1 -1
  122. package/schemas/crucible-ts/pathfinder/v1.0.0/path-result.schema.json +1 -1
  123. package/schemas/crucible-ts/protocol/http/v1.0.0/error-response.schema.json +1 -1
  124. package/schemas/crucible-ts/protocol/http/v1.0.0/health-response.schema.json +1 -1
  125. package/schemas/crucible-ts/protocol/http/v1.0.0/success-response.schema.json +1 -1
  126. package/schemas/crucible-ts/protocol/http/v1.0.0/version-response.schema.json +1 -1
  127. package/schemas/crucible-ts/server/management/v1.0.0/server-management.schema.json +1 -1
  128. package/schemas/crucible-ts/standards/publishing/v1.0.0/spec-catalog.schema.json +134 -0
  129. package/schemas/crucible-ts/taxonomy/devsecops/auth-methods/v1.0.0/auth-methods-key.schema.json +1 -1
  130. package/schemas/crucible-ts/taxonomy/devsecops/auth-methods/v1.0.0/auth-methods-metadata.schema.json +1 -1
  131. package/schemas/crucible-ts/taxonomy/devsecops/geo/v1.0.0/geo-key.schema.json +1 -1
  132. package/schemas/crucible-ts/taxonomy/devsecops/geo/v1.0.0/geo-metadata.schema.json +1 -1
  133. package/schemas/crucible-ts/taxonomy/devsecops/infra-phases/v1.0.0/infra-phases-key.schema.json +1 -1
  134. package/schemas/crucible-ts/taxonomy/devsecops/infra-phases/v1.0.0/infra-phases-metadata.schema.json +1 -1
  135. package/schemas/crucible-ts/taxonomy/devsecops/infra-providers/v1.0.0/infra-providers-key.schema.json +1 -1
  136. package/schemas/crucible-ts/taxonomy/devsecops/infra-providers/v1.0.0/infra-providers-metadata.schema.json +1 -1
  137. package/schemas/crucible-ts/taxonomy/devsecops/modules/v1.0.0/devsecops-module-entry.schema.json +1 -1
  138. package/schemas/crucible-ts/taxonomy/fixture/v1.0.0/fixture-catalog.schema.json +166 -0
  139. package/schemas/crucible-ts/taxonomy/language/v1.0.0/language-key.schema.json +1 -1
  140. package/schemas/crucible-ts/taxonomy/language/v1.0.0/language-metadata.schema.json +1 -1
  141. package/schemas/crucible-ts/taxonomy/library/foundry-catalogs/v1.1.0/catalog-entry.schema.json +98 -0
  142. package/schemas/crucible-ts/taxonomy/library/fulencode/detection-confidence/v1.0.0/levels.schema.json +1 -1
  143. package/schemas/crucible-ts/taxonomy/library/fulencode/encoding-families/v1.0.0/families.schema.json +1 -1
  144. package/schemas/crucible-ts/taxonomy/library/fulencode/normalization-profiles/v1.0.0/profiles.schema.json +1 -1
  145. package/schemas/crucible-ts/taxonomy/library/fulhash/algorithms/v1.0.0/algorithms.yaml +16 -0
  146. package/schemas/crucible-ts/taxonomy/library/modules/v1.0.0/module-entry.schema.json +1 -1
  147. package/schemas/crucible-ts/taxonomy/library/modules/v1.1.0/module-entry.schema.json +436 -0
  148. package/schemas/crucible-ts/taxonomy/repository-category/v1.0.0/category-key.schema.json +16 -8
  149. package/schemas/crucible-ts/taxonomy/repository-category/v1.0.0/category-metadata.schema.json +1 -1
  150. package/schemas/crucible-ts/upstream/3leaps/PROVENANCE.md +43 -0
  151. package/schemas/crucible-ts/upstream/3leaps/agentic/v0/role-prompt.schema.json +183 -0
  152. package/schemas/crucible-ts/upstream/3leaps/ailink/v0/prompt.schema.json +204 -0
  153. package/schemas/crucible-ts/upstream/3leaps/ailink/v0/search-response.schema.json +152 -0
  154. package/schemas/crucible-ts/upstream/README.md +50 -0
  155. package/schemas/crucible-ts/web/branding/v1.0.0/site-branding.schema.json +1 -1
  156. package/schemas/crucible-ts/web/styling/v1.0.0/site-styling.schema.json +1 -1
  157. package/schemas/crucible-ts/config/goneat/README.md +0 -60
  158. package/schemas/crucible-ts/config/goneat/v1.0.0/dates.yaml +0 -234
  159. package/schemas/crucible-ts/config/goneat/v1.0.0/goneat-config.yaml +0 -344
  160. package/schemas/crucible-ts/config/goneat/v1.0.0/lifecycle-phase.json +0 -20
  161. package/schemas/crucible-ts/config/goneat/v1.0.0/release-phase.json +0 -17
  162. package/schemas/crucible-ts/config/goneat/v1.0.0/security-policy.yaml +0 -178
  163. package/schemas/crucible-ts/config/goneat/v1.0.0/version-policy.schema.yaml +0 -205
  164. package/schemas/crucible-ts/tooling/goneat-tools/v1.0.0/README.md +0 -177
  165. package/schemas/crucible-ts/tooling/goneat-tools/v1.0.0/goneat-tools-config.schema.yaml +0 -146
@@ -0,0 +1,2 @@
1
+ export { SimilarityError, VERSION } from '../foundry/similarity/index.js';
2
+ export { M as MetricType, g as NormalizationPreset, N as NormalizeOptions, a as SuggestOptions, S as Suggestion, c as casefold, d as distance, e as equalsIgnoreCase, n as normalize, s as score, b as stripAccents, f as suggest } from '../suggest-D8LbwtPV.js';
@@ -0,0 +1,136 @@
1
+ import { substringSimilarity, jaro_winkler, damerau_levenshtein, osa_distance, levenshtein, normalize as normalize$1, score as score$1, suggest as suggest$1 } from '@3leaps/string-metrics-wasm';
2
+
3
+ // src/foundry/similarity/distance.ts
4
+ function distance(a, b, metric = "levenshtein") {
5
+ switch (metric) {
6
+ case "levenshtein":
7
+ return levenshtein(a, b);
8
+ case "damerau_osa":
9
+ return osa_distance(a, b);
10
+ case "damerau_unrestricted":
11
+ return damerau_levenshtein(a, b);
12
+ case "jaro_winkler":
13
+ return jaro_winkler(a, b);
14
+ case "substring":
15
+ return substringSimilarity(a, b).score;
16
+ default:
17
+ throw new Error(
18
+ `Invalid metric '${metric}': must be one of: levenshtein, damerau_osa, damerau_unrestricted, jaro_winkler, substring`
19
+ );
20
+ }
21
+ }
22
+
23
+ // src/foundry/errors.ts
24
+ var FoundryCatalogError = class _FoundryCatalogError extends Error {
25
+ constructor(message, catalog, cause) {
26
+ super(message);
27
+ this.catalog = catalog;
28
+ this.cause = cause;
29
+ this.name = "FoundryCatalogError";
30
+ if (Error.captureStackTrace) {
31
+ Error.captureStackTrace(this, _FoundryCatalogError);
32
+ }
33
+ }
34
+ static invalidSchema(catalog, details, cause) {
35
+ return new _FoundryCatalogError(
36
+ `Invalid schema in ${catalog} catalog: ${details}`,
37
+ catalog,
38
+ cause
39
+ );
40
+ }
41
+ static missingCatalog(catalog) {
42
+ return new _FoundryCatalogError(`Catalog ${catalog} not found or could not be loaded`, catalog);
43
+ }
44
+ static invalidPattern(patternId, details) {
45
+ return new _FoundryCatalogError(`Invalid pattern ${patternId}: ${details}`, "patterns");
46
+ }
47
+ static compilationError(patternId, details, cause) {
48
+ return new _FoundryCatalogError(
49
+ `Failed to compile pattern ${patternId}: ${details}`,
50
+ "patterns",
51
+ cause
52
+ );
53
+ }
54
+ };
55
+
56
+ // src/foundry/similarity/errors.ts
57
+ var SimilarityError = class extends FoundryCatalogError {
58
+ constructor(message, cause) {
59
+ super(message, "similarity", cause);
60
+ this.name = "SimilarityError";
61
+ }
62
+ };
63
+ function toNormalizationLocale(locale) {
64
+ if (!locale) {
65
+ return void 0;
66
+ }
67
+ if (locale === "tr" || locale === "az" || locale === "lt") {
68
+ return locale;
69
+ }
70
+ return void 0;
71
+ }
72
+ function normalize(value, preset = "default", locale) {
73
+ if (typeof preset === "object") {
74
+ const targetPreset = preset.stripAccents ? "aggressive" : "default";
75
+ const targetLocale = toNormalizationLocale(preset.locale ?? locale);
76
+ return normalize$1(value, targetPreset, targetLocale);
77
+ }
78
+ return normalize$1(value, preset, toNormalizationLocale(locale));
79
+ }
80
+ function casefold(value, locale) {
81
+ if (locale === "tr") {
82
+ return value.toLocaleLowerCase("tr-TR");
83
+ }
84
+ return value.toLowerCase();
85
+ }
86
+ function stripAccents(value) {
87
+ return value.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
88
+ }
89
+ function equalsIgnoreCase(a, b, options) {
90
+ return normalize(a, options) === normalize(b, options);
91
+ }
92
+ function score(a, b, metric = "levenshtein") {
93
+ if (metric === "substring") {
94
+ return substringSimilarity(a, b).score;
95
+ }
96
+ return score$1(a, b, metric);
97
+ }
98
+ var DEFAULT_MIN_SCORE = 0.6;
99
+ var DEFAULT_MAX_SUGGESTIONS = 3;
100
+ var DEFAULT_METRIC = "levenshtein";
101
+ var DEFAULT_NORMALIZE_PRESET = "default";
102
+ function suggest(input, candidates, options) {
103
+ const metric = options?.metric ?? DEFAULT_METRIC;
104
+ const minScore = options?.minScore ?? DEFAULT_MIN_SCORE;
105
+ const maxSuggestions = options?.maxSuggestions ?? DEFAULT_MAX_SUGGESTIONS;
106
+ let normalizePreset = options?.normalizePreset ?? DEFAULT_NORMALIZE_PRESET;
107
+ if (options?.normalize === false) {
108
+ normalizePreset = "none";
109
+ } else if (options?.normalize === true && !options?.normalizePreset) {
110
+ normalizePreset = "default";
111
+ }
112
+ const wasmOptions = {
113
+ metric,
114
+ normalizePreset,
115
+ minScore,
116
+ maxSuggestions,
117
+ preferPrefix: options?.preferPrefix,
118
+ jaroPrefixScale: options?.jaroPrefixScale,
119
+ jaroMaxPrefix: options?.jaroMaxPrefix
120
+ };
121
+ const results = suggest$1(input, candidates, wasmOptions);
122
+ return results.map((r) => ({
123
+ value: r.value,
124
+ score: r.score,
125
+ matchedRange: r.matchedRange,
126
+ reason: r.reason,
127
+ normalizedValue: r.normalizedValue
128
+ }));
129
+ }
130
+
131
+ // src/foundry/similarity/index.ts
132
+ var VERSION = "2.0.0";
133
+
134
+ export { SimilarityError, VERSION, casefold, distance, equalsIgnoreCase, normalize, score, stripAccents, suggest };
135
+ //# sourceMappingURL=index.js.map
136
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/foundry/similarity/distance.ts","../../src/foundry/errors.ts","../../src/foundry/similarity/errors.ts","../../src/foundry/similarity/normalization.ts","../../src/foundry/similarity/score.ts","../../src/foundry/similarity/suggest.ts","../../src/foundry/similarity/index.ts"],"names":["wasmNormalize","substringSimilarity","wasmScore","wasmSuggest"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Distance calculation with multiple metric support.\n *\n * Implements Crucible Foundry Similarity Standard v2.0.0 with WASM-backed metrics.\n *\n * @module foundry/similarity/distance\n */\n\nimport {\n damerau_levenshtein,\n jaro_winkler,\n levenshtein,\n osa_distance,\n substringSimilarity,\n} from \"@3leaps/string-metrics-wasm\";\nimport type { MetricType } from \"./types.js\";\n\n/**\n * Calculate edit distance between two strings using specified metric.\n *\n * @param a - First string\n * @param b - Second string\n * @param metric - Distance metric (default: \"levenshtein\")\n * @returns Edit distance as non-negative integer (or similarity score for jaro_winkler/substring)\n *\n * @example\n * distance(\"kitten\", \"sitting\") // 3\n * distance(\"abcd\", \"abdc\", \"damerau_osa\") // 1\n * distance(\"CA\", \"ABC\", \"damerau_unrestricted\") // 2\n * distance(\"hello world\", \"world\", \"substring\") // 0.625 (as score, not distance)\n */\nexport function distance(a: string, b: string, metric: MetricType = \"levenshtein\"): number {\n switch (metric) {\n case \"levenshtein\":\n return levenshtein(a, b);\n case \"damerau_osa\":\n return osa_distance(a, b);\n case \"damerau_unrestricted\":\n return damerau_levenshtein(a, b);\n case \"jaro_winkler\":\n return jaro_winkler(a, b);\n case \"substring\":\n // Returns similarity score (not distance) with longest common substring\n return substringSimilarity(a, b).score;\n default:\n throw new Error(\n `Invalid metric '${metric}': must be one of: levenshtein, damerau_osa, damerau_unrestricted, jaro_winkler, substring`,\n );\n }\n}\n","/**\n * Foundry module - Error handling\n *\n * Custom error classes for Foundry catalog operations with fail-fast validation.\n */\n\nexport class FoundryCatalogError extends Error {\n constructor(\n message: string,\n public readonly catalog?: string,\n public readonly cause?: Error,\n ) {\n super(message);\n this.name = \"FoundryCatalogError\";\n\n // Maintain proper stack trace for V8\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, FoundryCatalogError);\n }\n }\n\n static invalidSchema(catalog: string, details: string, cause?: Error): FoundryCatalogError {\n return new FoundryCatalogError(\n `Invalid schema in ${catalog} catalog: ${details}`,\n catalog,\n cause,\n );\n }\n\n static missingCatalog(catalog: string): FoundryCatalogError {\n return new FoundryCatalogError(`Catalog ${catalog} not found or could not be loaded`, catalog);\n }\n\n static invalidPattern(patternId: string, details: string): FoundryCatalogError {\n return new FoundryCatalogError(`Invalid pattern ${patternId}: ${details}`, \"patterns\");\n }\n\n static compilationError(patternId: string, details: string, cause?: Error): FoundryCatalogError {\n return new FoundryCatalogError(\n `Failed to compile pattern ${patternId}: ${details}`,\n \"patterns\",\n cause,\n );\n }\n}\n","import { FoundryCatalogError } from \"../errors.js\";\n\nexport class SimilarityError extends FoundryCatalogError {\n constructor(message: string, cause?: Error) {\n super(message, \"similarity\", cause);\n this.name = \"SimilarityError\";\n }\n}\n","/**\n * Unicode-aware text normalization utilities.\n *\n * Implements Crucible Foundry Similarity Standard v2.0.0 with normalization presets.\n *\n * @module foundry/similarity/normalization\n */\n\nimport {\n type NormalizationLocale,\n type NormalizationPreset as WasmNormalizationPreset,\n normalize as wasmNormalize,\n} from \"@3leaps/string-metrics-wasm\";\nimport type { NormalizationPreset, NormalizeOptions } from \"./types.js\";\n\nfunction toNormalizationLocale(locale?: string): NormalizationLocale | undefined {\n if (!locale) {\n return undefined;\n }\n\n if (locale === \"tr\" || locale === \"az\" || locale === \"lt\") {\n return locale;\n }\n\n return undefined;\n}\n\n/**\n * Apply normalization preset to text.\n *\n * @param value - Text to normalize\n * @param preset - Normalization preset (\"none\" | \"minimal\" | \"default\" | \"aggressive\")\n * @param locale - Optional locale for locale-aware casefolding (e.g., \"tr\" for Turkish)\n * @returns Normalized text\n *\n * @example\n * normalize(\" Café-Zürich! \", \"aggressive\") // \"cafezurich\"\n * normalize(\" Hello \", \"minimal\") // \"Hello\"\n * normalize(\"İstanbul\", \"default\", \"tr\") // \"istanbul\"\n */\nexport function normalize(\n value: string,\n preset: NormalizationPreset | NormalizeOptions = \"default\",\n locale?: string,\n): string {\n // Handle legacy NormalizeOptions interface for backward compatibility\n if (typeof preset === \"object\") {\n // Map old options to preset and extract locale\n const targetPreset = preset.stripAccents ? \"aggressive\" : \"default\";\n const targetLocale = toNormalizationLocale(preset.locale ?? locale);\n return wasmNormalize(value, targetPreset, targetLocale);\n }\n\n return wasmNormalize(value, preset as WasmNormalizationPreset, toNormalizationLocale(locale));\n}\n\n/**\n * Unicode-aware case folding.\n *\n * @param value - Text to casefold\n * @param locale - Optional locale (e.g., \"tr\" for Turkish)\n * @returns Lowercase text\n */\nexport function casefold(value: string, locale?: string): string {\n if (locale === \"tr\") {\n return value.toLocaleLowerCase(\"tr-TR\");\n }\n return value.toLowerCase();\n}\n\n/**\n * Strip diacritical marks from text.\n *\n * @param value - Text to process\n * @returns Text with accents removed\n */\nexport function stripAccents(value: string): string {\n return value.normalize(\"NFD\").replace(/[\\u0300-\\u036f]/g, \"\");\n}\n\n/**\n * Compare strings ignoring case and optionally accents.\n *\n * @param a - First string\n * @param b - Second string\n * @param options - Normalization options\n * @returns True if strings are equal after normalization\n */\nexport function equalsIgnoreCase(a: string, b: string, options?: NormalizeOptions): boolean {\n return normalize(a, options) === normalize(b, options);\n}\n","/**\n * Normalized similarity score with metric selection.\n *\n * Implements Crucible Foundry Similarity Standard v2.0.0.\n *\n * @module foundry/similarity/score\n */\n\nimport {\n type SimilarityMetric,\n substringSimilarity,\n score as wasmScore,\n} from \"@3leaps/string-metrics-wasm\";\nimport type { MetricType } from \"./types.js\";\n\n/**\n * Calculate normalized similarity score between two strings.\n *\n * Returns a value between 0.0 (completely different) and 1.0 (identical).\n * For distance-based metrics: 1 - distance / max(len(a), len(b))\n * For jaro_winkler and substring: direct similarity score\n *\n * @param a - First string\n * @param b - Second string\n * @param metric - Similarity metric (default: \"levenshtein\")\n * @returns Similarity score in range [0.0, 1.0]\n *\n * @example\n * score(\"kitten\", \"sitting\") // 0.5714...\n * score(\"hello\", \"hallo\", \"jaro_winkler\") // 0.88\n * score(\"hello world\", \"world\", \"substring\") // 0.625\n */\nexport function score(a: string, b: string, metric: MetricType = \"levenshtein\"): number {\n // Special case: substring uses different API to get proper longest common substring\n if (metric === \"substring\") {\n return substringSimilarity(a, b).score;\n }\n\n // All other metrics supported directly by WASM score function\n return wasmScore(a, b, metric as SimilarityMetric);\n}\n","/**\n * Suggestion API with fuzzy matching and configurable metrics.\n *\n * Implements Crucible Foundry Similarity Standard v2.0.0.\n *\n * @module foundry/similarity/suggest\n */\n\nimport { type SuggestMetric, suggest as wasmSuggest } from \"@3leaps/string-metrics-wasm\";\nimport type { Suggestion, SuggestOptions } from \"./types.js\";\n\nconst DEFAULT_MIN_SCORE = 0.6;\nconst DEFAULT_MAX_SUGGESTIONS = 3;\nconst DEFAULT_METRIC = \"levenshtein\";\nconst DEFAULT_NORMALIZE_PRESET = \"default\";\n\n/**\n * Generate ranked suggestions from candidate list based on similarity.\n *\n * @param input - Input string to match against\n * @param candidates - List of candidate strings\n * @param options - Suggestion options (metric, thresholds, normalization)\n * @returns Array of suggestions sorted by score (descending)\n *\n * @example\n * suggest(\"docscrib\", [\"docscribe\", \"crucible\"], { metric: \"levenshtein\" })\n * // [{ value: \"docscribe\", score: 0.889, ... }]\n */\nexport function suggest(\n input: string,\n candidates: readonly string[],\n options?: SuggestOptions,\n): Suggestion[] {\n const metric = options?.metric ?? DEFAULT_METRIC;\n const minScore = options?.minScore ?? DEFAULT_MIN_SCORE;\n const maxSuggestions = options?.maxSuggestions ?? DEFAULT_MAX_SUGGESTIONS;\n\n // Handle legacy 'normalize' boolean option\n let normalizePreset = options?.normalizePreset ?? DEFAULT_NORMALIZE_PRESET;\n if (options?.normalize === false) {\n normalizePreset = \"none\";\n } else if (options?.normalize === true && !options?.normalizePreset) {\n normalizePreset = \"default\";\n }\n\n // Pass metric name directly to WASM library (it handles \"substring\" correctly)\n const wasmOptions = {\n metric: metric as SuggestMetric,\n normalizePreset,\n minScore,\n maxSuggestions,\n preferPrefix: options?.preferPrefix,\n jaroPrefixScale: options?.jaroPrefixScale,\n jaroMaxPrefix: options?.jaroMaxPrefix,\n };\n\n const results = wasmSuggest(input, candidates as string[], wasmOptions);\n\n // Map WASM results to our Suggestion interface\n return results.map((r) => ({\n value: r.value,\n score: r.score,\n matchedRange: r.matchedRange as [number, number] | undefined,\n reason: r.reason,\n normalizedValue: r.normalizedValue,\n }));\n}\n","/**\n * Foundry similarity module - Text similarity and normalization utilities\n *\n * Implements the Crucible Foundry Text Similarity & Normalization Standard v2.0.0 (2025.10.3).\n *\n * @module foundry/similarity\n */\n\nexport const VERSION = \"2.0.0\";\n\nexport { distance } from \"./distance.js\";\nexport { SimilarityError } from \"./errors.js\";\nexport {\n casefold,\n equalsIgnoreCase,\n normalize,\n stripAccents,\n} from \"./normalization.js\";\nexport { score } from \"./score.js\";\nexport { suggest } from \"./suggest.js\";\n\nexport type {\n MetricType,\n NormalizationPreset,\n NormalizeOptions,\n Suggestion,\n SuggestOptions,\n} from \"./types.js\";\n"]}
@@ -165,4 +165,4 @@ declare function score(a: string, b: string, metric?: MetricType): number;
165
165
  */
166
166
  declare function suggest(input: string, candidates: readonly string[], options?: SuggestOptions): Suggestion[];
167
167
 
168
- export { FoundryCatalogError as F, type MetricType as M, type NormalizationPreset as N, type Suggestion as S, score as a, suggest as b, casefold as c, distance as d, equalsIgnoreCase as e, type NormalizeOptions as f, type SuggestOptions as g, normalize as n, stripAccents as s };
168
+ export { FoundryCatalogError as F, type MetricType as M, type NormalizeOptions as N, type Suggestion as S, type SuggestOptions as a, stripAccents as b, casefold as c, distance as d, equalsIgnoreCase as e, suggest as f, type NormalizationPreset as g, normalize as n, score as s };