apcore-toolkit 0.3.1 → 0.4.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.4.0] - 2026-03-25
4
+
5
+ ### Added
6
+
7
+ - **`DisplayResolver`** — sparse `binding.yaml` overlay that resolves surface-facing alias, description, guidance, tags, and documentation into `metadata["display"]` for CLI, MCP, and A2A consumers. Ported from Python with full feature parity.
8
+ - Resolution chain: surface-specific override > `display` default > binding-level field > scanner value.
9
+ - MCP alias auto-sanitization and 64-char limit enforcement.
10
+ - CLI alias validation with fallback on pattern mismatch.
11
+ - `suggested_alias` fallback from `ScannedModule.metadata`.
12
+ - Match-count logging via `console.info`/`console.warn`.
13
+ - Supports single YAML files, directories of `*.binding.yaml` files, and pre-parsed data.
14
+
3
15
  ## [0.3.1] - 2026-03-22
4
16
 
5
17
  ### Changed
package/README.md CHANGED
@@ -151,6 +151,7 @@ const dicts = modulesToDicts(modules); // batch conversion
151
151
  | `runVerifierChain()` | Run verifier chain, short-circuit on first failure |
152
152
  | `Enhancer` | Pluggable interface for metadata enhancement |
153
153
  | `AIEnhancer` | SLM-based metadata enhancement for scanned modules |
154
+ | `DisplayResolver` | Sparse binding.yaml overlay — resolves alias, description, guidance, tags into `metadata["display"]` |
154
155
  | `VERSION` | Package version string |
155
156
 
156
157
  ## Documentation
@@ -0,0 +1,69 @@
1
+ /**
2
+ * DisplayResolver — sparse binding.yaml display overlay.
3
+ *
4
+ * Resolves surface-facing presentation fields (alias, description, guidance)
5
+ * for each ScannedModule by merging:
6
+ * surface-specific override > display default > binding-level > scanner value
7
+ *
8
+ * The resolved fields are stored in ScannedModule.metadata["display"] and
9
+ * travel through RegistryWriter into FunctionModule.metadata["display"],
10
+ * where CLI/MCP/A2A surfaces read them at render time.
11
+ */
12
+ import type { ScannedModule } from './types.js';
13
+ /** Surface-specific resolved display fields. */
14
+ export interface SurfaceDisplay {
15
+ alias: string;
16
+ description: string;
17
+ guidance: string | null;
18
+ }
19
+ /** Full resolved display metadata. */
20
+ export interface DisplayMetadata {
21
+ alias: string;
22
+ description: string;
23
+ documentation: string | null;
24
+ guidance: string | null;
25
+ tags: string[];
26
+ cli: SurfaceDisplay;
27
+ mcp: SurfaceDisplay;
28
+ a2a: SurfaceDisplay;
29
+ }
30
+ /** Options for {@link DisplayResolver.resolve}. */
31
+ export interface DisplayResolveOptions {
32
+ /**
33
+ * Path to a single `.binding.yaml` file or a directory containing
34
+ * `*.binding.yaml` files. Ignored when `bindingData` is provided.
35
+ */
36
+ bindingPath?: string;
37
+ /**
38
+ * Pre-parsed binding YAML content as an object (`{ bindings: [...] }`)
39
+ * or a `moduleId → entry` map. Takes precedence over `bindingPath`.
40
+ */
41
+ bindingData?: Record<string, unknown>;
42
+ }
43
+ /**
44
+ * Resolves display overlay fields for a list of ScannedModules.
45
+ *
46
+ * @example
47
+ * ```ts
48
+ * const resolver = new DisplayResolver();
49
+ * const resolved = resolver.resolve(scannedModules, {
50
+ * bindingPath: './bindings/',
51
+ * });
52
+ * ```
53
+ */
54
+ export declare class DisplayResolver {
55
+ /**
56
+ * Apply display overlay to a list of ScannedModules.
57
+ *
58
+ * @param modules - ScannedModule instances from a framework scanner.
59
+ * @param options - Optional binding path or pre-parsed binding data.
60
+ * @returns New ScannedModule list with `metadata["display"]` populated.
61
+ */
62
+ resolve(modules: ScannedModule[], options?: DisplayResolveOptions): ScannedModule[];
63
+ private _buildBindingMap;
64
+ private _parseBindingData;
65
+ private _loadBindingFiles;
66
+ private _resolveOne;
67
+ private _validateAliases;
68
+ }
69
+ //# sourceMappingURL=display-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display-resolver.d.ts","sourceRoot":"","sources":["../src/display-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAOhD,gDAAgD;AAChD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,sCAAsC;AACtC,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,cAAc,CAAC;IACpB,GAAG,EAAE,cAAc,CAAC;IACpB,GAAG,EAAE,cAAc,CAAC;CACrB;AAED,mDAAmD;AACnD,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAKD;;;;;;;;;;GAUG;AACH,qBAAa,eAAe;IAC1B;;;;;;OAMG;IACH,OAAO,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,aAAa,EAAE;IA0BnF,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,iBAAiB;IAuBzB,OAAO,CAAC,iBAAiB;IAiCzB,OAAO,CAAC,WAAW;IAsEnB,OAAO,CAAC,gBAAgB;CAiCzB"}
@@ -0,0 +1,195 @@
1
+ /**
2
+ * DisplayResolver — sparse binding.yaml display overlay.
3
+ *
4
+ * Resolves surface-facing presentation fields (alias, description, guidance)
5
+ * for each ScannedModule by merging:
6
+ * surface-specific override > display default > binding-level > scanner value
7
+ *
8
+ * The resolved fields are stored in ScannedModule.metadata["display"] and
9
+ * travel through RegistryWriter into FunctionModule.metadata["display"],
10
+ * where CLI/MCP/A2A surfaces read them at render time.
11
+ */
12
+ import * as fs from 'node:fs';
13
+ import * as path from 'node:path';
14
+ import * as yaml from 'js-yaml';
15
+ import { cloneModule } from './types.js';
16
+ const MCP_ALIAS_MAX = 64;
17
+ const MCP_ALIAS_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_-]*$/;
18
+ const CLI_ALIAS_PATTERN = /^[a-z][a-z0-9_-]*$/;
19
+ /**
20
+ * Resolves display overlay fields for a list of ScannedModules.
21
+ *
22
+ * @example
23
+ * ```ts
24
+ * const resolver = new DisplayResolver();
25
+ * const resolved = resolver.resolve(scannedModules, {
26
+ * bindingPath: './bindings/',
27
+ * });
28
+ * ```
29
+ */
30
+ export class DisplayResolver {
31
+ /**
32
+ * Apply display overlay to a list of ScannedModules.
33
+ *
34
+ * @param modules - ScannedModule instances from a framework scanner.
35
+ * @param options - Optional binding path or pre-parsed binding data.
36
+ * @returns New ScannedModule list with `metadata["display"]` populated.
37
+ */
38
+ resolve(modules, options) {
39
+ const bindingPath = options?.bindingPath ?? null;
40
+ const bindingData = options?.bindingData ?? null;
41
+ const bindingMap = this._buildBindingMap(bindingPath, bindingData);
42
+ if (Object.keys(bindingMap).length > 0) {
43
+ const matched = modules.filter((mod) => mod.moduleId in bindingMap).length;
44
+ console.info(`DisplayResolver: ${matched}/${modules.length} modules matched binding entries.`);
45
+ if (matched === 0) {
46
+ console.warn(`DisplayResolver: binding map loaded ${Object.keys(bindingMap).length} entries but none matched ` +
47
+ 'any scanned module_id — check binding.yaml module_id values.');
48
+ }
49
+ }
50
+ return modules.map((mod) => this._resolveOne(mod, bindingMap));
51
+ }
52
+ // ------------------------------------------------------------------
53
+ // Internal helpers
54
+ // ------------------------------------------------------------------
55
+ _buildBindingMap(bindingPath, bindingData) {
56
+ if (bindingData != null) {
57
+ return this._parseBindingData(bindingData);
58
+ }
59
+ if (bindingPath != null) {
60
+ return this._loadBindingFiles(bindingPath);
61
+ }
62
+ return {};
63
+ }
64
+ _parseBindingData(data) {
65
+ // Accept either { bindings: [...] } or a direct moduleId → entry map
66
+ if ('bindings' in data) {
67
+ const bindings = data['bindings'] ?? [];
68
+ const result = {};
69
+ for (const entry of bindings) {
70
+ const id = entry['module_id'];
71
+ if (id != null) {
72
+ result[id] = entry;
73
+ }
74
+ }
75
+ return result;
76
+ }
77
+ // Already a map
78
+ const result = {};
79
+ for (const [k, v] of Object.entries(data)) {
80
+ if (v != null && typeof v === 'object' && !Array.isArray(v)) {
81
+ result[k] = v;
82
+ }
83
+ }
84
+ return result;
85
+ }
86
+ _loadBindingFiles(bindingPath) {
87
+ const result = {};
88
+ let files = [];
89
+ try {
90
+ const stat = fs.statSync(bindingPath);
91
+ if (stat.isFile()) {
92
+ files = [bindingPath];
93
+ }
94
+ else if (stat.isDirectory()) {
95
+ files = fs
96
+ .readdirSync(bindingPath)
97
+ .filter((f) => f.endsWith('.binding.yaml'))
98
+ .sort()
99
+ .map((f) => path.join(bindingPath, f));
100
+ }
101
+ }
102
+ catch {
103
+ console.warn(`DisplayResolver: binding path not found: ${bindingPath}`);
104
+ return {};
105
+ }
106
+ for (const f of files) {
107
+ try {
108
+ const content = fs.readFileSync(f, 'utf-8');
109
+ const data = yaml.load(content) ?? {};
110
+ Object.assign(result, this._parseBindingData(data));
111
+ }
112
+ catch (exc) {
113
+ console.warn(`DisplayResolver: failed to load ${f}: ${exc}`);
114
+ }
115
+ }
116
+ return result;
117
+ }
118
+ _resolveOne(mod, bindingMap) {
119
+ const entry = bindingMap[mod.moduleId] ?? {};
120
+ const displayCfg = entry['display'] ?? {};
121
+ const bindingDesc = entry['description'];
122
+ const bindingDocs = entry['documentation'];
123
+ const suggestedAlias = mod.metadata?.['suggested_alias'] ?? null;
124
+ // -- Resolve cross-surface defaults --
125
+ const defaultAlias = displayCfg['alias'] || suggestedAlias || mod.moduleId;
126
+ const defaultDescription = displayCfg['description'] || bindingDesc || mod.description;
127
+ const defaultDocumentation = displayCfg['documentation'] || bindingDocs || mod.documentation || null;
128
+ const defaultGuidance = displayCfg['guidance'] || null;
129
+ const resolvedTags = displayCfg['tags'] ?? entry['tags'] ?? [...mod.tags];
130
+ // -- Resolve per-surface fields --
131
+ const resolveSurface = (key) => {
132
+ const sc = displayCfg[key] ?? {};
133
+ const aliasExplicit = Boolean(sc['alias']);
134
+ return {
135
+ surface: {
136
+ alias: sc['alias'] || defaultAlias,
137
+ description: sc['description'] || defaultDescription,
138
+ guidance: sc['guidance'] || defaultGuidance,
139
+ },
140
+ aliasExplicit,
141
+ };
142
+ };
143
+ const { surface: cliSurface, aliasExplicit: cliAliasExplicit } = resolveSurface('cli');
144
+ const { surface: mcpSurface } = resolveSurface('mcp');
145
+ const { surface: a2aSurface } = resolveSurface('a2a');
146
+ // Auto-sanitize MCP alias: replace non-[a-zA-Z0-9_-] chars with _,
147
+ // then prepend _ if the result starts with a digit.
148
+ const rawMcpAlias = mcpSurface.alias;
149
+ let sanitized = rawMcpAlias.replace(/[^a-zA-Z0-9_-]/g, '_');
150
+ if (sanitized.length > 0 && /^\d/.test(sanitized)) {
151
+ sanitized = '_' + sanitized;
152
+ }
153
+ mcpSurface.alias = sanitized;
154
+ if (sanitized !== rawMcpAlias) {
155
+ console.debug(`Module '${mod.moduleId}': MCP alias auto-sanitized '${rawMcpAlias}' → '${sanitized}'.`);
156
+ }
157
+ const display = {
158
+ alias: defaultAlias,
159
+ description: defaultDescription,
160
+ documentation: defaultDocumentation,
161
+ guidance: defaultGuidance,
162
+ tags: resolvedTags,
163
+ cli: cliSurface,
164
+ mcp: mcpSurface,
165
+ a2a: a2aSurface,
166
+ };
167
+ // -- Validate aliases --
168
+ this._validateAliases(display, mod.moduleId, cliAliasExplicit);
169
+ const newMetadata = { ...mod.metadata, display };
170
+ return cloneModule(mod, { metadata: newMetadata });
171
+ }
172
+ _validateAliases(display, moduleId, cliAliasExplicit) {
173
+ // MCP: MUST enforce 64-char hard limit (alias was already auto-sanitized)
174
+ const mcpAlias = display.mcp.alias;
175
+ if (mcpAlias.length > MCP_ALIAS_MAX) {
176
+ throw new Error(`Module '${moduleId}': MCP alias '${mcpAlias}' exceeds ` +
177
+ `${MCP_ALIAS_MAX}-character hard limit (OpenAI spec). ` +
178
+ 'Set display.mcp.alias to a shorter value.');
179
+ }
180
+ if (!MCP_ALIAS_PATTERN.test(mcpAlias)) {
181
+ throw new Error(`Module '${moduleId}': MCP alias '${mcpAlias}' does not match ` +
182
+ 'required pattern ^[a-zA-Z_][a-zA-Z0-9_-]*$.');
183
+ }
184
+ // CLI: only validate user-explicitly-set aliases
185
+ if (cliAliasExplicit) {
186
+ const cliAlias = display.cli.alias;
187
+ if (!CLI_ALIAS_PATTERN.test(cliAlias)) {
188
+ console.warn(`Module '${moduleId}': CLI alias '${cliAlias}' does not match shell-safe pattern ` +
189
+ `^[a-z][a-z0-9_-]*$ — falling back to default alias '${display.alias}'.`);
190
+ display.cli.alias = display.alias;
191
+ }
192
+ }
193
+ }
194
+ }
195
+ //# sourceMappingURL=display-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display-resolver.js","sourceRoot":"","sources":["../src/display-resolver.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -9,6 +9,8 @@ export { toMarkdown } from './formatting/index.js';
9
9
  export { flattenParams } from './flatten-params.js';
10
10
  export { AIEnhancer } from './ai-enhancer.js';
11
11
  export type { AIEnhancerOptions, Enhancer } from './ai-enhancer.js';
12
+ export { DisplayResolver } from './display-resolver.js';
13
+ export type { DisplayResolveOptions, DisplayMetadata, SurfaceDisplay, } from './display-resolver.js';
12
14
  export { YAMLWriter } from './output/yaml-writer.js';
13
15
  export { TypeScriptWriter } from './output/typescript-writer.js';
14
16
  export { RegistryWriter } from './output/registry-writer.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EACL,UAAU,EACV,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EACL,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAK/B,eAAO,MAAM,OAAO,EAAE,MAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EACL,UAAU,EACV,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EACV,qBAAqB,EACrB,eAAe,EACf,cAAc,GACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EACL,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAK/B,eAAO,MAAM,OAAO,EAAE,MAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -7,6 +7,7 @@ export { resolveTarget } from './resolve-target.js';
7
7
  export { toMarkdown } from './formatting/index.js';
8
8
  export { flattenParams } from './flatten-params.js';
9
9
  export { AIEnhancer } from './ai-enhancer.js';
10
+ export { DisplayResolver } from './display-resolver.js';
10
11
  export { YAMLWriter } from './output/yaml-writer.js';
11
12
  export { TypeScriptWriter } from './output/typescript-writer.js';
12
13
  export { RegistryWriter } from './output/registry-writer.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EACL,UAAU,EACV,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EACL,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChD,MAAM,IAAI,GAAG,QAAQ,CAAC,iBAAiB,CAAwB,CAAC;AAChE,MAAM,CAAC,MAAM,OAAO,GAAW,IAAI,CAAC,OAAO,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EACL,UAAU,EACV,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAMxD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EACL,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChD,MAAM,IAAI,GAAG,QAAQ,CAAC,iBAAiB,CAAwB,CAAC;AAChE,MAAM,CAAC,MAAM,OAAO,GAAW,IAAI,CAAC,OAAO,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "apcore-toolkit",
3
- "version": "0.3.1",
3
+ "version": "0.4.0",
4
4
  "description": "Shared scanner, schema extraction, and output toolkit for apcore framework adapters",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -50,7 +50,7 @@
50
50
  "clean": "rm -rf dist"
51
51
  },
52
52
  "dependencies": {
53
- "apcore-js": "^0.13.0",
53
+ "apcore-js": ">=0.14.0",
54
54
  "js-yaml": "^4.1.0"
55
55
  },
56
56
  "devDependencies": {