@skaile/workspaces 0.22.0-beta.1 → 0.22.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 +380 -0
- package/dist/{asset-feeds-QXCSAJRN.js → asset-feeds-Y2CDCM3W.js} +13 -14
- package/dist/asset-feeds-Y2CDCM3W.js.map +1 -0
- package/dist/asset-manager/index.js +7 -7
- package/dist/asset-manager/installer.js +6 -6
- package/dist/asset-manager/src/index.d.ts.map +1 -1
- package/dist/base-assets/connectors/deploy.js +7 -7
- package/dist/base-assets/connectors/devserver.js +7 -7
- package/dist/base-assets/connectors/flow/adapter.js +7 -7
- package/dist/base-assets/connectors/flow/run-flow.js +8 -8
- package/dist/base-assets/connectors/flow.js +7 -7
- package/dist/base-assets/connectors/git/driver.d.ts.map +1 -1
- package/dist/base-assets/connectors/git.js +7 -7
- package/dist/base-assets/connectors/gmail.js +7 -7
- package/dist/base-assets/connectors/googledrive.js +7 -7
- package/dist/base-assets/connectors/local.js +7 -7
- package/dist/base-assets/connectors/mattermost.js +7 -7
- package/dist/base-assets/connectors/memory.js +7 -7
- package/dist/base-assets/connectors/minio.js +7 -7
- package/dist/base-assets/connectors/postgres.js +7 -7
- package/dist/base-assets/connectors/s3.js +7 -7
- package/dist/base-assets/connectors/sharepoint.js +7 -7
- package/dist/base-assets/connectors/sqlite.js +7 -7
- package/dist/base-assets/connectors/static-server.js +7 -7
- package/dist/base-assets/connectors/tunnel.js +7 -7
- package/dist/base-assets/connectors/webdav.js +7 -7
- package/dist/base-assets/connectors/xstate-store.js +7 -7
- package/dist/base-assets/connectors/xstate.js +7 -7
- package/dist/{chunk-PTIHB2TV.js → chunk-2RYQERIT.js} +4 -4
- package/dist/{chunk-PTIHB2TV.js.map → chunk-2RYQERIT.js.map} +1 -1
- package/dist/chunk-32NA4TVC.js +30 -0
- package/dist/chunk-32NA4TVC.js.map +1 -0
- package/dist/{chunk-DKGDOALM.js → chunk-53UNDY6K.js} +5 -5
- package/dist/{chunk-DKGDOALM.js.map → chunk-53UNDY6K.js.map} +1 -1
- package/dist/{chunk-VCYXVP2S.js → chunk-7HSXUKNB.js} +24 -13
- package/dist/chunk-7HSXUKNB.js.map +1 -0
- package/dist/chunk-7QBNJTTQ.js +3 -0
- package/dist/{chunk-W2O5LWYU.js.map → chunk-7QBNJTTQ.js.map} +1 -1
- package/dist/{chunk-UMOENHVH.js → chunk-ETMUGBHF.js} +3 -3
- package/dist/{chunk-UMOENHVH.js.map → chunk-ETMUGBHF.js.map} +1 -1
- package/dist/{chunk-7PTP3SQJ.js → chunk-GTS2FODO.js} +32 -7
- package/dist/chunk-GTS2FODO.js.map +1 -0
- package/dist/{chunk-D7K72XEY.js → chunk-JN2CUVSU.js} +3 -3
- package/dist/{chunk-D7K72XEY.js.map → chunk-JN2CUVSU.js.map} +1 -1
- package/dist/{chunk-3ECS5PFD.js → chunk-K2HDYSAM.js} +4 -4
- package/dist/{chunk-3ECS5PFD.js.map → chunk-K2HDYSAM.js.map} +1 -1
- package/dist/{chunk-4AZKT2BU.js → chunk-K7WPR77X.js} +33 -50
- package/dist/chunk-K7WPR77X.js.map +1 -0
- package/dist/{chunk-JHF66MCK.js → chunk-MNAHNDUI.js} +5 -3
- package/dist/chunk-MNAHNDUI.js.map +1 -0
- package/dist/{chunk-APAOQLPT.js → chunk-NBJ5TOEC.js} +3 -3
- package/dist/{chunk-APAOQLPT.js.map → chunk-NBJ5TOEC.js.map} +1 -1
- package/dist/{chunk-NJLHHZIW.js → chunk-NDD5VMN5.js} +2 -2
- package/dist/{chunk-NJLHHZIW.js.map → chunk-NDD5VMN5.js.map} +1 -1
- package/dist/{chunk-LT4DLEYE.js → chunk-OJN25VJO.js} +24 -8
- package/dist/chunk-OJN25VJO.js.map +1 -0
- package/dist/{chunk-GFNW72LW.js → chunk-PFOXL4SH.js} +4 -4
- package/dist/{chunk-GFNW72LW.js.map → chunk-PFOXL4SH.js.map} +1 -1
- package/dist/{chunk-V3QMSM5I.js → chunk-SKXCTV55.js} +13 -14
- package/dist/chunk-SKXCTV55.js.map +1 -0
- package/dist/{chunk-J3VKAEQP.js → chunk-V5TBKO5Q.js} +64 -14
- package/dist/chunk-V5TBKO5Q.js.map +1 -0
- package/dist/{chunk-I3UEM3FX.js → chunk-VUCPJBAG.js} +9 -4
- package/dist/chunk-VUCPJBAG.js.map +1 -0
- package/dist/{chunk-XIHFJVOD.js → chunk-WH2EB2SF.js} +3 -3
- package/dist/{chunk-XIHFJVOD.js.map → chunk-WH2EB2SF.js.map} +1 -1
- package/dist/{chunk-PBWMV5GM.js → chunk-WQ7DE5UC.js} +18 -4
- package/dist/chunk-WQ7DE5UC.js.map +1 -0
- package/dist/cli/index.js +199 -200
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/src/commands/manage.d.ts +23 -32
- package/dist/cli/src/commands/manage.d.ts.map +1 -1
- package/dist/cli/src/commands/npx.d.ts +5 -3
- package/dist/cli/src/commands/npx.d.ts.map +1 -1
- package/dist/cli/src/commands/source.d.ts +7 -0
- package/dist/cli/src/commands/source.d.ts.map +1 -1
- package/dist/connectors/config.js +6 -6
- package/dist/connectors/index.js +7 -7
- package/dist/core/index.js +5 -5
- package/dist/core/manifest.js +2 -2
- package/dist/core/models.js +1 -1
- package/dist/core/runtime-assets.js +4 -4
- package/dist/core/src/index.d.ts +2 -2
- package/dist/core/src/index.d.ts.map +1 -1
- package/dist/core/src/manifest.d.ts +16 -0
- package/dist/core/src/manifest.d.ts.map +1 -1
- package/dist/core/src/models.d.ts +8 -2
- package/dist/core/src/models.d.ts.map +1 -1
- package/dist/core/src/repo-manager.d.ts +17 -2
- package/dist/core/src/repo-manager.d.ts.map +1 -1
- package/dist/core/src/walker.d.ts +4 -0
- package/dist/core/src/walker.d.ts.map +1 -1
- package/dist/core/src/workspace-config.d.ts +14 -0
- package/dist/core/src/workspace-config.d.ts.map +1 -1
- package/dist/core/workspace-config.js +3 -3
- package/dist/deploy/index.js +138 -42
- package/dist/deploy/index.js.map +1 -1
- package/dist/deploy/src/index.d.ts +4 -3
- package/dist/deploy/src/index.d.ts.map +1 -1
- package/dist/deploy/src/targets/container-runtime.d.ts.map +1 -1
- package/dist/deploy/src/targets/local.d.ts.map +1 -1
- package/dist/deploy/src/targets/nix.d.ts +36 -0
- package/dist/deploy/src/targets/nix.d.ts.map +1 -0
- package/dist/deploy/src/targets/process-handle.d.ts +34 -0
- package/dist/deploy/src/targets/process-handle.d.ts.map +1 -0
- package/dist/discovery/index.js +3 -3
- package/dist/{ensure-sources-SL2S4UEX.js → ensure-sources-REWWBH2K.js} +9 -9
- package/dist/{ensure-sources-SL2S4UEX.js.map → ensure-sources-REWWBH2K.js.map} +1 -1
- package/dist/library/index.js +4 -4
- package/dist/open-library-CT4VVESU.js +13 -0
- package/dist/{open-library-M4DB3D3J.js.map → open-library-CT4VVESU.js.map} +1 -1
- package/dist/plugin-registry/src/context.d.ts +30 -1
- package/dist/plugin-registry/src/context.d.ts.map +1 -1
- package/dist/plugin-registry/src/index.d.ts +1 -1
- package/dist/plugin-registry/src/index.d.ts.map +1 -1
- package/dist/{plugin-store-AJ3FGXIC.js → plugin-store-QS7TC5HY.js} +7 -7
- package/dist/{plugin-store-AJ3FGXIC.js.map → plugin-store-QS7TC5HY.js.map} +1 -1
- package/dist/plugins/src/catalog-source.d.ts +5 -0
- package/dist/plugins/src/catalog-source.d.ts.map +1 -1
- package/dist/runner/index.js +13 -12
- package/dist/runner/src/serve.d.ts +7 -0
- package/dist/runner/src/serve.d.ts.map +1 -1
- package/dist/sdk/asset-manager.js +7 -7
- package/dist/sdk/core.js +5 -5
- package/dist/sdk/index.js +13 -12
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/runner.js +13 -12
- package/dist/sdk/transport/ws/client.js +2 -1
- package/dist/sdk/transport/ws/server.js +2 -1
- package/dist/sdk/transport/ws.js +4 -3
- package/dist/sdk/transport.js +4 -3
- package/dist/{setup-GBSQX7JF.js → setup-F6DGKL7J.js} +7 -7
- package/dist/{setup-GBSQX7JF.js.map → setup-F6DGKL7J.js.map} +1 -1
- package/dist/store-client-JP642EEI.js +14 -0
- package/dist/{store-client-5WBRUC5U.js.map → store-client-JP642EEI.js.map} +1 -1
- package/dist/transport/index.js +4 -3
- package/dist/transport/src/ws/auth.d.ts +34 -0
- package/dist/transport/src/ws/auth.d.ts.map +1 -0
- package/dist/transport/src/ws/client.d.ts +4 -0
- package/dist/transport/src/ws/client.d.ts.map +1 -1
- package/dist/transport/src/ws/index.d.ts +3 -2
- package/dist/transport/src/ws/index.d.ts.map +1 -1
- package/dist/transport/src/ws/server.d.ts +5 -0
- package/dist/transport/src/ws/server.d.ts.map +1 -1
- package/dist/transport/ws/client.js +2 -1
- package/dist/transport/ws/server.js +2 -1
- package/dist/transport/ws.js +4 -3
- package/dist/tui/index.js +13 -12
- package/dist/tui/index.js.map +1 -1
- package/dist/workspace-plugin/index.js +1 -1
- package/package.json +1 -1
- package/dist/asset-feeds-QXCSAJRN.js.map +0 -1
- package/dist/chunk-4AZKT2BU.js.map +0 -1
- package/dist/chunk-7PTP3SQJ.js.map +0 -1
- package/dist/chunk-I3UEM3FX.js.map +0 -1
- package/dist/chunk-J3VKAEQP.js.map +0 -1
- package/dist/chunk-JHF66MCK.js.map +0 -1
- package/dist/chunk-LT4DLEYE.js.map +0 -1
- package/dist/chunk-PBWMV5GM.js.map +0 -1
- package/dist/chunk-V3QMSM5I.js.map +0 -1
- package/dist/chunk-VCYXVP2S.js.map +0 -1
- package/dist/chunk-W2O5LWYU.js +0 -3
- package/dist/open-library-M4DB3D3J.js +0 -13
- package/dist/store-client-5WBRUC5U.js +0 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../discovery/src/asset-kind-registry.ts","../discovery/src/requires-graph.ts","../discovery/src/builtin-providers.ts","../discovery/src/source-config.ts","../discovery/src/hash.ts","../discovery/src/discover-manifest.ts","../discovery/src/discover.ts","../discovery/src/tree-entries.ts","../discovery/src/index.ts"],"names":["path","path2","fs2","path3","fs3","path4","fs4","yaml2","path5","parseManifest","fs5","yaml3","filename","resolvePublisher","deriveName","yaml4","crypto2","validateRequiresSyntax","MANIFEST_FILENAMES","MANIFEST_SUFFIXES"],"mappings":"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","file":"chunk-D7K72XEY.js","sourcesContent":["/**\n * AssetKindRegistry — concrete implementation of IAssetKindRegistry.\n *\n * Frozen-state machine:\n * - Created in \"open\" state, accepting provider registrations\n * - First read operation (or explicit freeze()) transitions to \"frozen\"\n * - No further registrations after freeze\n *\n * Pattern conflict detection:\n * - On register(), checks that the new provider's discoveryPatterns don't\n * overlap with any existing provider's patterns (exact string match).\n * - At resolveKind() time, checks that only one provider's matchesPath()\n * returns true (runtime safety net).\n *\n * Design decisions A3, A4: locked in Phase 1.7 planning.\n */\n\nimport type {\n IAssetKindProvider,\n IAssetKindRegistry,\n AssetKindFileFilter,\n AssetKindRequiresEdge,\n} from \"@skaile/workspaces/plugins\";\nimport {\n AssetKindConflictError,\n AssetKindPatternConflictError,\n AssetKindPathAmbiguityError,\n AssetKindRegistryFrozenError,\n} from \"@skaile/workspaces/plugins\";\nimport type { ManifestValidationResult } from \"@skaile/workspaces/types/manifests\";\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\nexport class AssetKindRegistry implements IAssetKindRegistry {\n private providers = new Map<string, IAssetKindProvider>();\n private patternOwnership = new Map<string, string>(); // pattern -> kind\n private _frozen = false;\n\n get frozen(): boolean {\n return this._frozen;\n }\n\n // -------------------------------------------------------------------------\n // Registration (open state only)\n // -------------------------------------------------------------------------\n\n register(provider: IAssetKindProvider): void {\n if (this._frozen) {\n throw new AssetKindRegistryFrozenError();\n }\n\n // A4: kind conflict\n if (this.providers.has(provider.kind)) {\n throw new AssetKindConflictError(provider.kind);\n }\n\n // A4: pattern conflict — check each discovery pattern against all registered\n for (const pattern of provider.discoveryPatterns) {\n const existingOwner = this.patternOwnership.get(pattern);\n if (existingOwner) {\n throw new AssetKindPatternConflictError(provider.kind, existingOwner, pattern);\n }\n }\n\n // Commit registration\n this.providers.set(provider.kind, provider);\n for (const pattern of provider.discoveryPatterns) {\n this.patternOwnership.set(pattern, provider.kind);\n }\n }\n\n // -------------------------------------------------------------------------\n // Freeze\n // -------------------------------------------------------------------------\n\n freeze(): void {\n this._frozen = true;\n }\n\n // -------------------------------------------------------------------------\n // Read operations (auto-freeze)\n // -------------------------------------------------------------------------\n\n getProvider(kind: string): IAssetKindProvider | undefined {\n this.autoFreeze();\n return this.providers.get(kind);\n }\n\n getAllProviders(): IAssetKindProvider[] {\n this.autoFreeze();\n return [...this.providers.values()];\n }\n\n getAllKinds(): string[] {\n this.autoFreeze();\n return [...this.providers.keys()];\n }\n\n resolveKind(relativePath: string): string | undefined {\n this.autoFreeze();\n\n const matches: string[] = [];\n for (const provider of this.providers.values()) {\n if (provider.matchesPath(relativePath)) {\n matches.push(provider.kind);\n }\n }\n\n if (matches.length === 0) return undefined;\n if (matches.length === 1) return matches[0];\n\n // A4: multiple providers claim the same path — hard error\n throw new AssetKindPathAmbiguityError(relativePath, matches);\n }\n\n // -------------------------------------------------------------------------\n // Convenience delegates\n // -------------------------------------------------------------------------\n\n validateManifest(kind: string, data: unknown): ManifestValidationResult<unknown> {\n this.autoFreeze();\n const provider = this.providers.get(kind);\n if (!provider) {\n return {\n ok: false,\n errors: [\n {\n path: \"kind\",\n message: `No provider registered for kind \"${kind}\"`,\n },\n ],\n };\n }\n return provider.validateManifest(data);\n }\n\n defaultFileFilter(kind: string, manifestPath: string): AssetKindFileFilter | undefined {\n this.autoFreeze();\n const provider = this.providers.get(kind);\n if (!provider) return undefined;\n return provider.defaultFileFilter(manifestPath);\n }\n\n extractRequires(\n kind: string,\n assetRef: string,\n manifest: Record<string, unknown>,\n ): AssetKindRequiresEdge[] {\n this.autoFreeze();\n const provider = this.providers.get(kind);\n if (!provider?.extractRequires) return [];\n return provider.extractRequires(assetRef, manifest);\n }\n\n // -------------------------------------------------------------------------\n // Internal\n // -------------------------------------------------------------------------\n\n private autoFreeze(): void {\n if (!this._frozen) {\n this._frozen = true;\n }\n }\n}\n","/**\n * Requires-graph extraction and cycle detection.\n *\n * Extracts cross-asset dependency edges from typed manifest fields:\n * - agent: skills[], composes[].ref, extends\n * - flow: nodes[].skill\n * - preset: items[].ref, items[].composes[].ref\n * - skill: metadata.artifacts.requires[].id\n *\n * Cycle detection uses Kahn's algorithm (topological sort).\n */\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * A directed dependency edge from one asset ref to another, annotated with the manifest\n * field that declared the dependency.\n *\n * @docLink packages/discovery/concepts#requires-edge\n */\nexport interface RequiresEdge {\n /** Asset ref of the requiring asset. */\n from: string;\n /** Asset ref of the required asset. */\n to: string;\n /** Manifest field that produced this edge. */\n field: string;\n}\n\n/**\n * The complete requires graph for a discovered asset tree: all dependency edges plus\n * the result of cycle detection.\n *\n * @docLink packages/discovery/concepts#requires-graph\n */\nexport interface RequiresGraph {\n edges: RequiresEdge[];\n /** True if the graph contains no cycles. */\n acyclic: boolean;\n /** If cycles exist, one example cycle path. */\n cyclePath?: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Extract requires edges from a single asset's manifest.\n *\n * @param assetRef - The canonical ref of the asset being examined (the `from` side)\n * @param kind - Asset kind, used to select the correct manifest field extractor\n * @param manifest - Parsed manifest object\n * @returns Array of {@link RequiresEdge} declared by this asset\n * @docLink packages/discovery/concepts#extract-requires\n */\nexport function extractRequires(\n assetRef: string,\n kind: string,\n manifest: Record<string, unknown>,\n): RequiresEdge[] {\n const edges: RequiresEdge[] = [];\n\n switch (kind) {\n case \"agent\":\n extractAgentRequires(assetRef, manifest, edges);\n break;\n case \"flow\":\n extractFlowRequires(assetRef, manifest, edges);\n break;\n case \"preset\":\n extractPresetRequires(assetRef, manifest, edges);\n break;\n case \"skill\":\n extractSkillRequires(assetRef, manifest, edges);\n break;\n // connector, mount, prompt, mcp-server, contract, knowledge, persona, ruleset:\n // no cross-asset requires in their manifest schemas.\n }\n\n return edges;\n}\n\n/**\n * Build a complete {@link RequiresGraph} from multiple assets' edges by running cycle detection.\n *\n * @param allEdges - All {@link RequiresEdge} values collected across all assets in the tree\n * @returns A {@link RequiresGraph} with `acyclic` status and optional `cyclePath`\n * @docLink packages/discovery/concepts#build-requires-graph\n */\nexport function buildRequiresGraph(allEdges: RequiresEdge[]): RequiresGraph {\n const { acyclic, cyclePath } = detectCycles(allEdges);\n return { edges: allEdges, acyclic, cyclePath };\n}\n\n/**\n * Detect cycles in a set of requires edges using Kahn's topological sort algorithm.\n *\n * If a cycle is found, DFS is used to recover one example cycle path for diagnostics.\n *\n * @param edges - Directed dependency edges to analyse\n * @returns `{ acyclic: true }` if the graph is a DAG, or `{ acyclic: false, cyclePath }` otherwise\n * @docLink packages/discovery/concepts#detect-cycles\n */\nexport function detectCycles(edges: RequiresEdge[]): { acyclic: boolean; cyclePath?: string[] } {\n if (edges.length === 0) return { acyclic: true };\n\n // Build adjacency + in-degree\n const nodes = new Set<string>();\n const adj = new Map<string, Set<string>>();\n const inDegree = new Map<string, number>();\n\n for (const e of edges) {\n nodes.add(e.from);\n nodes.add(e.to);\n if (!adj.has(e.from)) adj.set(e.from, new Set());\n adj.get(e.from)!.add(e.to);\n inDegree.set(e.to, (inDegree.get(e.to) ?? 0) + 1);\n if (!inDegree.has(e.from)) inDegree.set(e.from, 0);\n }\n\n // Kahn's algorithm\n const queue: string[] = [];\n for (const node of nodes) {\n if ((inDegree.get(node) ?? 0) === 0) queue.push(node);\n }\n\n const sorted: string[] = [];\n while (queue.length > 0) {\n const n = queue.shift()!;\n sorted.push(n);\n for (const neighbor of adj.get(n) ?? []) {\n const deg = inDegree.get(neighbor)! - 1;\n inDegree.set(neighbor, deg);\n if (deg === 0) queue.push(neighbor);\n }\n }\n\n if (sorted.length === nodes.size) {\n return { acyclic: true };\n }\n\n // Find one cycle path via DFS among remaining nodes\n const remaining = new Set([...nodes].filter((n) => !sorted.includes(n)));\n const cyclePath = findCyclePath(remaining, adj);\n return { acyclic: false, cyclePath };\n}\n\n// ---------------------------------------------------------------------------\n// Per-kind extractors\n// ---------------------------------------------------------------------------\n\nfunction extractAgentRequires(\n ref: string,\n m: Record<string, unknown>,\n edges: RequiresEdge[],\n): void {\n // skills: string[]\n if (Array.isArray(m.skills)) {\n for (const s of m.skills) {\n if (typeof s === \"string\") edges.push({ from: ref, to: s, field: \"skills\" });\n }\n }\n // composes: { ref: string, ... }[]\n if (Array.isArray(m.composes)) {\n for (const c of m.composes) {\n if (isObjectWithStringField(c, \"ref\")) {\n edges.push({ from: ref, to: (c as Record<string, string>).ref!, field: \"composes\" });\n }\n }\n }\n // extends: string\n if (typeof m.extends === \"string\") {\n edges.push({ from: ref, to: m.extends, field: \"extends\" });\n }\n}\n\nfunction extractFlowRequires(ref: string, m: Record<string, unknown>, edges: RequiresEdge[]): void {\n if (!Array.isArray(m.nodes)) return;\n for (const node of m.nodes) {\n if (isObjectWithStringField(node, \"skill\")) {\n edges.push({\n from: ref,\n to: (node as Record<string, string>).skill!,\n field: \"nodes[].skill\",\n });\n }\n }\n}\n\nfunction extractPresetRequires(\n ref: string,\n m: Record<string, unknown>,\n edges: RequiresEdge[],\n): void {\n if (!Array.isArray(m.items)) return;\n for (const item of m.items) {\n if (typeof item !== \"object\" || item === null) continue;\n const i = item as Record<string, unknown>;\n\n // items[].ref — skip library:// refs (those reference existing instances, not assets)\n if (typeof i.ref === \"string\" && !i.ref.startsWith(\"library://\")) {\n edges.push({ from: ref, to: i.ref, field: \"items[].ref\" });\n }\n\n // items[].composes[].ref — skip # (cross-item) and library:// refs\n if (Array.isArray(i.composes)) {\n for (const c of i.composes) {\n if (!isObjectWithStringField(c, \"ref\")) continue;\n const cRef = (c as Record<string, string>).ref!;\n if (!cRef.startsWith(\"#\") && !cRef.startsWith(\"library://\")) {\n edges.push({ from: ref, to: cRef, field: \"items[].composes[].ref\" });\n }\n }\n }\n }\n}\n\nfunction extractSkillRequires(\n ref: string,\n m: Record<string, unknown>,\n edges: RequiresEdge[],\n): void {\n const metadata = m.metadata as Record<string, unknown> | undefined;\n if (!metadata) return;\n const artifacts = metadata.artifacts as Record<string, unknown> | undefined;\n if (!artifacts) return;\n if (!Array.isArray(artifacts.requires)) return;\n for (const r of artifacts.requires) {\n if (isObjectWithStringField(r, \"id\")) {\n edges.push({\n from: ref,\n to: (r as Record<string, string>).id!,\n field: \"metadata.artifacts.requires\",\n });\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Cycle finder (DFS)\n// ---------------------------------------------------------------------------\n\nfunction findCyclePath(nodes: Set<string>, adj: Map<string, Set<string>>): string[] {\n const visited = new Set<string>();\n const stack = new Set<string>();\n const path: string[] = [];\n\n for (const start of nodes) {\n if (visited.has(start)) continue;\n const cycle = dfs(start, adj, visited, stack, path, nodes);\n if (cycle) return cycle;\n }\n\n return [...nodes]; // fallback: return all remaining nodes\n}\n\nfunction dfs(\n node: string,\n adj: Map<string, Set<string>>,\n visited: Set<string>,\n stack: Set<string>,\n path: string[],\n scope: Set<string>,\n): string[] | null {\n visited.add(node);\n stack.add(node);\n path.push(node);\n\n for (const neighbor of adj.get(node) ?? []) {\n if (!scope.has(neighbor)) continue;\n if (stack.has(neighbor)) {\n // Found cycle — extract the cycle portion\n const cycleStart = path.indexOf(neighbor);\n return [...path.slice(cycleStart), neighbor];\n }\n if (!visited.has(neighbor)) {\n const result = dfs(neighbor, adj, visited, stack, path, scope);\n if (result) return result;\n }\n }\n\n stack.delete(node);\n path.pop();\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Utility\n// ---------------------------------------------------------------------------\n\nfunction isObjectWithStringField(val: unknown, field: string): boolean {\n return (\n typeof val === \"object\" &&\n val !== null &&\n field in val &&\n typeof (val as Record<string, unknown>)[field] === \"string\"\n );\n}\n","/**\n * Built-in IAssetKindProvider implementations: 8 core kinds + preset (9 total).\n * Flow + knowledge moved to their owning runtime packages in 1.7.3/1.7.4.\n * The standalone `mount` provider was removed in the connectors-unification\n * hard cut — mountable resources are now `connector` assets (CONNECTOR.md).\n *\n * Core kinds: skill, agent, connector, mcp-server, contract,\n * prompt, persona, ruleset\n *\n * Each provider is self-contained: discovery patterns, path matching,\n * manifest validation, file filtering, and requires extraction are all\n * owned by the provider. This is the post-Phase-1.7 architecture where\n * IAssetKindRegistry is the single source of truth for kind-aware logic.\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { IAssetKindProvider, AssetKindFileFilter } from \"@skaile/workspaces/plugins\";\nimport type { ManifestValidationResult } from \"@skaile/workspaces/types/manifests\";\nimport {\n validateSkill,\n validateAgent,\n validateConnector,\n validateContract,\n validatePrompt,\n validateMcpServer,\n validatePersona,\n validateRuleset,\n validatePreset,\n} from \"@skaile/workspaces/types/manifests\";\n\nimport { extractRequires as extractRequiresFromManifest } from \"./requires-graph.js\";\n\n// ---------------------------------------------------------------------------\n// Helper: path matching from filename\n// ---------------------------------------------------------------------------\n\nfunction matchesSuffix(relativePath: string, suffix: string): boolean {\n return relativePath.endsWith(suffix);\n}\n\nfunction matchesFilename(relativePath: string, filename: string): boolean {\n const parts = relativePath.split(\"/\");\n return parts[parts.length - 1] === filename;\n}\n\n// ---------------------------------------------------------------------------\n// File filter helpers (per-kind default file filters)\n// ---------------------------------------------------------------------------\n\n/**\n * Recursively collect all files under a subdirectory.\n * Uses path.posix.join for relative paths so SHA256 hashes are consistent\n * across platforms (Linux/macOS/Windows).\n */\nfunction collectDirRecursive(baseDir: string, relativeDir: string): string[] {\n const full = path.join(baseDir, relativeDir);\n if (!fs.existsSync(full) || !fs.statSync(full).isDirectory()) return [];\n const results: string[] = [];\n for (const entry of fs.readdirSync(full, { withFileTypes: true })) {\n const rel = path.posix.join(relativeDir, entry.name);\n if (entry.isDirectory()) {\n results.push(...collectDirRecursive(baseDir, rel));\n } else if (entry.isFile()) {\n results.push(rel);\n }\n }\n return results;\n}\n\n/**\n * Manifest-only filter — for simple kinds that include only the manifest file.\n */\nfunction manifestOnlyFilter(manifestPath: string): AssetKindFileFilter {\n return {\n assetRoot: path.dirname(manifestPath),\n files: [path.basename(manifestPath)],\n };\n}\n\n/**\n * skill: SKILL.md + same-dir leaves (validator.py, CLI.md) + references/ + nested * /SKILL.md\n */\nfunction skillFilter(manifestPath: string): AssetKindFileFilter {\n const dir = path.dirname(manifestPath);\n const manifestName = path.basename(manifestPath);\n const files = [manifestName];\n\n // Same-dir leaves (from spec \"Per-type file filter defaults\" table).\n for (const leaf of [\"validator.py\", \"CLI.md\"]) {\n if (fs.existsSync(path.join(dir, leaf))) files.push(leaf);\n }\n\n // references/ subdirectory\n files.push(...collectDirRecursive(dir, \"references\"));\n\n // Nested sub-skill directories (*/SKILL.md)\n try {\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n if (entry.isDirectory() && entry.name !== \"references\") {\n if (fs.existsSync(path.join(dir, entry.name, \"SKILL.md\"))) {\n files.push(...collectDirRecursive(dir, entry.name));\n }\n }\n }\n } catch {\n /* empty */\n }\n\n files.sort();\n return { assetRoot: dir, files };\n}\n\n/**\n * agent: agent.yaml or AGENT.md + same-dir SOUL.md, RULES.md + knowledge/\n */\nfunction agentFilter(manifestPath: string): AssetKindFileFilter {\n const dir = path.dirname(manifestPath);\n const manifestName = path.basename(manifestPath);\n const files = [manifestName];\n\n for (const companion of [\"SOUL.md\", \"RULES.md\"]) {\n if (fs.existsSync(path.join(dir, companion))) files.push(companion);\n }\n\n files.push(...collectDirRecursive(dir, \"knowledge\"));\n\n files.sort();\n return { assetRoot: dir, files };\n}\n\n/**\n * contract: CONTRACT.md + same-dir attachments (all non-directory entries)\n */\nfunction contractFilter(manifestPath: string): AssetKindFileFilter {\n const dir = path.dirname(manifestPath);\n const manifestName = path.basename(manifestPath);\n const files = [manifestName];\n try {\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n if (entry.isFile() && entry.name !== manifestName) {\n files.push(entry.name);\n }\n }\n } catch {\n /* empty */\n }\n files.sort();\n return { assetRoot: dir, files };\n}\n\n/**\n * connector: CONNECTOR.md + entry file (adapter.ts by default)\n */\nfunction connectorFilter(manifestPath: string): AssetKindFileFilter {\n const dir = path.dirname(manifestPath);\n const manifestName = path.basename(manifestPath);\n const files = [manifestName];\n if (fs.existsSync(path.join(dir, \"adapter.ts\"))) files.push(\"adapter.ts\");\n files.sort();\n return { assetRoot: dir, files };\n}\n\n// ---------------------------------------------------------------------------\n// Provider factory\n// ---------------------------------------------------------------------------\n\nfunction makeProvider(config: {\n kind: string;\n displayName: string;\n providerVersion: string;\n discoveryPatterns: string[];\n matchesPath: (relativePath: string) => boolean;\n validate: (data: unknown) => ManifestValidationResult<unknown>;\n fileFilter: (manifestPath: string) => AssetKindFileFilter;\n hasExtractRequires?: boolean;\n}): IAssetKindProvider {\n return {\n kind: config.kind,\n displayName: config.displayName,\n providerVersion: config.providerVersion,\n discoveryPatterns: config.discoveryPatterns,\n matchesPath: config.matchesPath,\n validateManifest: config.validate,\n defaultFileFilter: config.fileFilter,\n ...(config.hasExtractRequires !== false && {\n extractRequires: (assetRef: string, manifest: Record<string, unknown>) =>\n extractRequiresFromManifest(assetRef, config.kind, manifest),\n }),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Core kind providers (8)\n// ---------------------------------------------------------------------------\n\nexport const skillProvider: IAssetKindProvider = makeProvider({\n kind: \"skill\",\n displayName: \"Skill\",\n providerVersion: \"1.0.0\",\n discoveryPatterns: [\"**/SKILL.md\"],\n matchesPath: (p) => matchesFilename(p, \"SKILL.md\"),\n validate: validateSkill,\n fileFilter: skillFilter,\n hasExtractRequires: true,\n});\n\nexport const agentProvider: IAssetKindProvider = makeProvider({\n kind: \"agent\",\n displayName: \"Agent\",\n providerVersion: \"1.0.0\",\n discoveryPatterns: [\"**/agent.yaml\", \"**/AGENT.md\"],\n matchesPath: (p) => matchesFilename(p, \"agent.yaml\") || matchesFilename(p, \"AGENT.md\"),\n validate: validateAgent,\n fileFilter: agentFilter,\n hasExtractRequires: true,\n});\n\nexport const connectorProvider: IAssetKindProvider = makeProvider({\n kind: \"connector\",\n displayName: \"Connector\",\n providerVersion: \"1.0.0\",\n discoveryPatterns: [\"**/CONNECTOR.md\"],\n matchesPath: (p) => matchesFilename(p, \"CONNECTOR.md\"),\n validate: validateConnector,\n fileFilter: connectorFilter,\n hasExtractRequires: false,\n});\n\nexport const mcpServerProvider: IAssetKindProvider = makeProvider({\n kind: \"mcp-server\",\n displayName: \"MCP Server\",\n providerVersion: \"1.0.0\",\n discoveryPatterns: [\"**/MCP.md\"],\n matchesPath: (p) => matchesFilename(p, \"MCP.md\"),\n validate: validateMcpServer,\n fileFilter: manifestOnlyFilter,\n hasExtractRequires: false,\n});\n\nexport const contractProvider: IAssetKindProvider = makeProvider({\n kind: \"contract\",\n displayName: \"Contract\",\n providerVersion: \"1.0.0\",\n discoveryPatterns: [\"**/CONTRACT.md\"],\n matchesPath: (p) => matchesFilename(p, \"CONTRACT.md\"),\n validate: validateContract,\n fileFilter: contractFilter,\n hasExtractRequires: false,\n});\n\nexport const promptProvider: IAssetKindProvider = makeProvider({\n kind: \"prompt\",\n displayName: \"Prompt\",\n providerVersion: \"1.0.0\",\n discoveryPatterns: [\"**/*.prompt.md\"],\n matchesPath: (p) => matchesSuffix(p, \".prompt.md\"),\n validate: validatePrompt,\n fileFilter: manifestOnlyFilter,\n hasExtractRequires: false,\n});\n\n/**\n * Persona and Ruleset providers have no FS discovery patterns — they are\n * sourced inline by the agent kind's resolver, not discovered as standalone\n * assets in a source tree. They remain registered as core kinds so the\n * registry recognizes them and can validate their manifests.\n */\nexport const personaProvider: IAssetKindProvider = {\n kind: \"persona\",\n displayName: \"Persona\",\n providerVersion: \"1.0.0\",\n discoveryPatterns: [],\n matchesPath: () => false,\n validateManifest: validatePersona,\n defaultFileFilter: manifestOnlyFilter,\n};\n\nexport const rulesetProvider: IAssetKindProvider = {\n kind: \"ruleset\",\n displayName: \"Ruleset\",\n providerVersion: \"1.0.0\",\n discoveryPatterns: [],\n matchesPath: () => false,\n validateManifest: validateRuleset,\n defaultFileFilter: manifestOnlyFilter,\n};\n\n// ---------------------------------------------------------------------------\n// Extension kind providers\n// NOTE: flow lives in @skaile/workspaces/base-assets/connectors/flow/engine (flowKindProvider).\n// knowledge lives in @skaile/library (knowledgeKindProvider).\n// Both are registered by CLI at bootstrap, not included in BUILTIN_PROVIDERS.\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Preset provider (composition entity — discoverable but not in AssetKind enum)\n// ---------------------------------------------------------------------------\n\nexport const presetProvider: IAssetKindProvider = makeProvider({\n kind: \"preset\",\n displayName: \"Preset\",\n providerVersion: \"1.0.0\",\n discoveryPatterns: [\"**/*.preset.yaml\"],\n matchesPath: (p) => matchesSuffix(p, \".preset.yaml\"),\n validate: validatePreset,\n fileFilter: manifestOnlyFilter,\n hasExtractRequires: true,\n});\n\n// ---------------------------------------------------------------------------\n// All built-in providers\n// ---------------------------------------------------------------------------\n\n/**\n * Built-in providers shipped with @skaile/discovery.\n *\n * 8 core kinds + preset. Extension kinds (flow, knowledge) moved to their\n * owning packages and are registered by the CLI at bootstrap.\n */\nexport const BUILTIN_PROVIDERS: IAssetKindProvider[] = [\n // 8 core kinds\n skillProvider,\n agentProvider,\n connectorProvider,\n mcpServerProvider,\n contractProvider,\n promptProvider,\n personaProvider,\n rulesetProvider,\n // Composition entity (discoverable, not in AssetKind enum)\n presetProvider,\n];\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as z from \"zod\";\nimport * as yaml from \"js-yaml\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/**\n * Semver regex matching `MAJOR.MINOR.PATCH` with optional `-<prerelease>` and\n * `+<build>` segments. Author-shipped inventory entries must declare a version\n * that matches this regex.\n *\n * @docLink packages/discovery/concepts#author-manifest-semver\n */\nexport const SEMVER_RE = /^\\d+\\.\\d+\\.\\d+(?:-[a-zA-Z0-9.-]+)?(?:\\+[a-zA-Z0-9.-]+)?$/;\n\n// ---------------------------------------------------------------------------\n// Schema\n// ---------------------------------------------------------------------------\n\nconst PublisherOverrideSchema = z.object({\n /** Relative path within the repo (trailing slash convention). */\n path: z.string().min(1),\n /** Publisher namespace override for assets under this path. */\n publisher: z\n .string()\n .regex(/^@[\\w-]+$/, \"Publisher must start with @ and contain only word chars / hyphens\"),\n});\n\nconst SyncConfigSchema = z\n .object({\n /** How the catalog backend learns about repo changes. */\n trigger: z.enum([\"webhook\", \"poll\"]).default(\"webhook\"),\n /** Seconds between polls. Required when trigger=poll. */\n poll_interval: z.number().int().positive().optional(),\n })\n .refine((data) => data.trigger !== \"poll\" || data.poll_interval !== undefined, {\n message: \"poll_interval is required when trigger is poll\",\n path: [\"poll_interval\"],\n });\n\n/**\n * Single entry in the author-shipped inventory (the `assets:` block of a\n * `.skaile-source.yaml` with `version: 2`).\n *\n * When the `assets:` block is present, discovery uses these entries as the\n * source of truth (`discoverFromManifest`) instead of running glob walk +\n * publisher resolution.\n *\n * @docLink packages/discovery/concepts#author-manifest-asset-entry\n */\nconst AssetEntrySchema = z.object({\n /** Relative path within the repo (directory or file). */\n path: z.string().min(1),\n /** Asset kind — validated against `IAssetKindRegistry` at discovery time. */\n kind: z.string().min(1),\n /** Publisher namespace. Required per entry; overrides publisher_default / _overrides. */\n publisher: z\n .string()\n .regex(/^@[\\w-]+$/, \"Publisher must start with @ and contain only word chars / hyphens\"),\n /** Asset name. Identity tuple is `<publisher>/<name>@<version>`. */\n name: z.string().min(1),\n /** Semver version string. */\n version: z.string().regex(SEMVER_RE, \"Version must be semver MAJOR.MINOR.PATCH\"),\n /**\n * Hex-encoded SHA256 hash of the deterministic tarball contents.\n * Optional on write, REQUIRED on Catalog publish (Phase 4).\n */\n sha256: z\n .string()\n .regex(/^[a-f0-9]{64}$/, \"sha256 must be 64-character hex\")\n .optional(),\n /** Curated file filter (paths relative to `path:`). At least one entry. */\n files: z.array(z.string().min(1)).min(1),\n /** Author-declared requires-graph entries. */\n requires: z.array(z.string().min(1)).default([]),\n /** Optional passthrough to `AssetDefinition.manifest`. */\n metadata: z.record(z.string(), z.unknown()).optional(),\n});\n\n/**\n * Root schema for `.skaile-source.yaml`.\n *\n * Declares how a repo maps to Catalog publisher namespaces.\n * Template variable `<domain>` in publisher_default is replaced at discovery\n * time with the first-level directory name containing the asset.\n *\n * Schema version `1` is the original glob-discovery surface. Version `2`\n * extends the schema with an optional `assets:` block — when present,\n * discovery uses the author-shipped inventory as authoritative and skips\n * glob walk + publisher resolution + AI enrichment.\n *\n * @docLink packages/discovery/concepts#source-config-schema\n */\nexport const SourceConfigSchema = z\n .object({\n /** Schema version. `1` (glob mode) or `2` (allows `assets:` block). */\n version: z.union([z.literal(1), z.literal(2)]),\n\n /**\n * Default publisher namespace template.\n * Use `@<domain>` to derive from first-level directory name.\n * Use a literal like `@skaile` if the entire repo maps to one publisher.\n */\n publisher_default: z\n .string()\n .min(1)\n .refine((v) => v.startsWith(\"@\"), \"publisher_default must start with @\"),\n\n /** Default git ref for version resolution. */\n default_ref: z.string().min(1).default(\"main\"),\n\n /** Per-path publisher overrides. Evaluated in order; first match wins. */\n publisher_overrides: z.array(PublisherOverrideSchema).default([]),\n\n /**\n * Repo-relative path prefixes holding assets meant only for developing the\n * project itself (e.g. `ai-assets-dev/`). Excluded from a normal discovery\n * run; re-included only when discovery is invoked with `includeDev` (the\n * `--dev` flag on `skaile source sync` / `source add`). Conventionally a\n * single top-level folder. See `docs/discovery/dev-assets.md`.\n */\n dev_paths: z.array(z.string().min(1)).default([]),\n\n /** Optional sync configuration for the catalog backend. */\n sync: SyncConfigSchema.optional(),\n\n /**\n * Optional author-shipped asset inventory. When present, discovery uses\n * these entries verbatim and skips glob walk + AI enrichment.\n *\n * Requires `version: 2`.\n */\n assets: z.array(AssetEntrySchema).optional(),\n })\n .refine((data) => !(data.assets && data.version !== 2), {\n message: \"`assets:` block requires version 2\",\n path: [\"version\"],\n });\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * Validated configuration derived from `.skaile-source.yaml`.\n *\n * @docLink packages/discovery/concepts#source-config\n */\nexport type SourceConfig = z.infer<typeof SourceConfigSchema>;\n\n/**\n * A `SourceConfig` known to be `version: 2` with the `assets:` block populated.\n * Returned from {@link isManifestMode} after a successful narrow.\n *\n * @docLink packages/discovery/concepts#source-config-v2\n */\nexport type SourceConfigV2 = SourceConfig & { version: 2; assets: AssetEntry[] };\n\n/**\n * A single entry in the author-shipped inventory.\n *\n * @docLink packages/discovery/concepts#author-manifest-asset-entry\n */\nexport type AssetEntry = z.infer<typeof AssetEntrySchema>;\n\n/**\n * A single per-path publisher namespace override entry.\n *\n * The first matching override (by path prefix) wins during publisher resolution.\n *\n * @docLink packages/discovery/concepts#publisher-override\n */\nexport type PublisherOverride = z.infer<typeof PublisherOverrideSchema>;\n\n/**\n * Sync configuration that controls how the catalog backend learns about repo changes.\n *\n * @docLink packages/discovery/concepts#sync-config\n */\nexport type SyncConfig = z.infer<typeof SyncConfigSchema>;\n\n// ---------------------------------------------------------------------------\n// Parser / Validator\n// ---------------------------------------------------------------------------\n\n/**\n * Successful result from {@link validateSourceConfig} or {@link loadSourceConfig}.\n *\n * `warnings` lists non-fatal anomalies (e.g. `assets:` present alongside\n * `publisher_overrides:` — the latter is ignored in manifest mode).\n *\n * @docLink packages/discovery/concepts#validation-success\n */\nexport interface ValidationSuccess {\n ok: true;\n config: SourceConfig;\n warnings?: string[];\n}\n\n/**\n * Failed result from {@link validateSourceConfig} or {@link loadSourceConfig},\n * carrying a list of per-field validation errors.\n *\n * @docLink packages/discovery/concepts#validation-failure\n */\nexport interface ValidationFailure {\n ok: false;\n errors: Array<{ path: string; message: string }>;\n}\n\n/**\n * Discriminated union returned by {@link validateSourceConfig} and {@link loadSourceConfig}.\n *\n * Use `result.ok` to narrow to {@link ValidationSuccess} or {@link ValidationFailure}.\n *\n * @docLink packages/discovery/concepts#validation-result\n */\nexport type ValidationResult = ValidationSuccess | ValidationFailure;\n\n/**\n * Parse raw YAML text into a plain object.\n *\n * Throws if the YAML is syntactically invalid. Pass the result to\n * {@link validateSourceConfig} to apply schema validation.\n *\n * @param yamlText - Raw YAML content of the `.skaile-source.yaml` file\n * @returns The parsed object (unvalidated)\n * @docLink packages/discovery/concepts#parse-source-config\n */\nexport function parseSourceConfig(yamlText: string): unknown {\n return yaml.load(yamlText);\n}\n\n/**\n * Validate a parsed object against the {@link SourceConfigSchema}.\n *\n * @param parsed - Plain object produced by {@link parseSourceConfig} or any other YAML parser\n * @returns A {@link ValidationSuccess} with the typed config, or a {@link ValidationFailure} with field errors\n * @docLink packages/discovery/concepts#validate-source-config\n */\nexport function validateSourceConfig(parsed: unknown): ValidationResult {\n const result = SourceConfigSchema.safeParse(parsed);\n if (result.success) {\n const warnings = collectWarnings(result.data);\n return warnings.length > 0\n ? { ok: true, config: result.data, warnings }\n : { ok: true, config: result.data };\n }\n return {\n ok: false,\n errors: result.error.issues.map((issue) => ({\n path: issue.path.join(\".\"),\n message: issue.message,\n })),\n };\n}\n\n/**\n * Convenience wrapper that parses YAML and validates in a single call.\n *\n * Equivalent to calling {@link parseSourceConfig} followed by {@link validateSourceConfig}.\n *\n * @param yamlText - Raw YAML content of the `.skaile-source.yaml` file\n * @returns A {@link ValidationResult} (success or failure)\n * @docLink packages/discovery/concepts#load-source-config\n */\nexport function loadSourceConfig(yamlText: string): ValidationResult {\n const parsed = parseSourceConfig(yamlText);\n return validateSourceConfig(parsed);\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Narrow a {@link SourceConfig} to {@link SourceConfigV2} when it carries an\n * author-shipped inventory.\n *\n * @param config - Validated source config\n * @returns `true` when `version === 2` and `assets:` is present (and non-empty\n * array — empty arrays still trigger manifest mode and yield an empty\n * discovery result, which matches an empty repo).\n * @docLink packages/discovery/concepts#is-manifest-mode\n */\nexport function isManifestMode(config: SourceConfig): config is SourceConfigV2 {\n return config.version === 2 && Array.isArray(config.assets);\n}\n\n/**\n * Test whether a repo-relative path falls under one of the configured\n * `dev_paths` prefixes.\n *\n * Matching is whole-segment: a `dev_paths` entry of `ai-assets-dev` matches\n * `ai-assets-dev` itself and anything under `ai-assets-dev/…`, but not a\n * sibling like `ai-assets-development`. Trailing slashes on either side are\n * normalized away.\n *\n * @param relativePath - Path relative to the source root (POSIX separators)\n * @param devPaths - The `dev_paths` list from a {@link SourceConfig}\n * @returns `true` when discovery should exclude the path in a normal run\n * @docLink packages/discovery/concepts#dev-paths\n */\nexport function isExcludedDevPath(relativePath: string, devPaths: readonly string[]): boolean {\n if (devPaths.length === 0) return false;\n const rel = relativePath.replace(/^\\.\\//, \"\").replace(/\\/+$/, \"\");\n for (const raw of devPaths) {\n const dp = raw.replace(/^\\.\\//, \"\").replace(/\\/+$/, \"\");\n if (dp.length === 0) continue;\n if (rel === dp || rel.startsWith(`${dp}/`)) return true;\n }\n return false;\n}\n\nfunction collectWarnings(config: SourceConfig): string[] {\n const warnings: string[] = [];\n if (Array.isArray(config.assets) && config.publisher_overrides.length > 0) {\n warnings.push(\n \"`assets:` block is present; `publisher_overrides:` will be ignored in manifest mode.\",\n );\n }\n return warnings;\n}\n\n// ---------------------------------------------------------------------------\n// Sidecar overlay (PR-3)\n// ---------------------------------------------------------------------------\n\n/**\n * A {@link SourceConfig} produced by merging a base in-repo config with a\n * local sidecar overlay. Always shaped like a regular `SourceConfig` —\n * downstream consumers treat it identically.\n *\n * @docLink packages/discovery/concepts#merged-source-config\n */\nexport type MergedSourceConfig = SourceConfig;\n\n/**\n * Merge a base in-repo `.skaile-source.yaml` config with a local sidecar\n * overlay.\n *\n * Merge rules (per PR-3 §D.3):\n *\n * | Field | Resolution |\n * |-----------------------|-----------------------------------------------------|\n * | `version` | sidecar wins (sidecar is always v2) |\n * | `publisher_default` | sidecar wins if set, else base |\n * | `publisher_overrides` | sidecar wins if non-empty, else base |\n * | `default_ref` | sidecar wins if set, else base |\n * | `sync` | sidecar wins if set, else base |\n * | `assets:` | sidecar fully **replaces** base (no partial merge) |\n *\n * Pure function — no I/O. Callers responsible for loading both configs.\n *\n * @param base - The in-repo source config (or `undefined` if absent)\n * @param overlay - The sidecar source config (or `undefined` for identity)\n * @returns The merged config, or `undefined` if both inputs are missing\n * @docLink packages/discovery/concepts#merge-source-configs\n */\nexport function mergeSourceConfigs(\n base: SourceConfig | undefined,\n overlay: SourceConfig | undefined,\n): MergedSourceConfig | undefined {\n if (!base && !overlay) return undefined;\n if (!overlay) return base;\n if (!base) return overlay;\n\n // Start from base, layer overlay fields per rules above.\n const merged: SourceConfig = { ...base };\n\n // version: sidecar always wins (sidecars are minted at v2).\n merged.version = overlay.version;\n\n // publisher_default: sidecar wins iff set (and non-empty). Schema requires\n // non-empty so any present overlay value wins.\n if (overlay.publisher_default && overlay.publisher_default.length > 0) {\n merged.publisher_default = overlay.publisher_default;\n }\n\n // publisher_overrides: sidecar wins iff non-empty.\n if (Array.isArray(overlay.publisher_overrides) && overlay.publisher_overrides.length > 0) {\n merged.publisher_overrides = overlay.publisher_overrides;\n }\n\n // dev_paths: sidecar wins iff non-empty.\n if (Array.isArray(overlay.dev_paths) && overlay.dev_paths.length > 0) {\n merged.dev_paths = overlay.dev_paths;\n }\n\n // default_ref: sidecar wins iff set. Schema gives default \"main\" so\n // we treat a non-default overlay value as a signal of intent.\n if (overlay.default_ref && overlay.default_ref.length > 0) {\n merged.default_ref = overlay.default_ref;\n }\n\n // sync: sidecar wins iff set.\n if (overlay.sync !== undefined) {\n merged.sync = overlay.sync;\n }\n\n // assets: sidecar fully replaces base on presence.\n if (overlay.assets !== undefined) {\n merged.assets = overlay.assets;\n }\n\n return merged;\n}\n\n/**\n * Load and merge a base `.skaile-source.yaml` (at `<rootPath>/.skaile-source.yaml`)\n * with an optional sidecar manifest at `<sidecarPath>/.skaile-source.yaml`.\n *\n * Either side may be absent. The result is wrapped in a {@link ValidationResult}\n * so the discovery dispatcher can surface per-side parse errors uniformly.\n *\n * Field merge follows {@link mergeSourceConfigs}. The sidecar's\n * `.skaile-source.yaml` is the only sidecar artifact this helper touches; the\n * README + lock file under `<sidecarPath>` are consumer concerns.\n *\n * @param rootPath - Absolute path to the upstream repo root\n * @param sidecarPath - Optional absolute path to the sidecar directory\n * (e.g. `~/.skaile/sources/<slug>/`)\n * @returns A {@link ValidationResult} carrying the merged config. Returns\n * `{ ok: true, config: <merged> }` when at least one side parses; returns\n * `{ ok: false, errors: [...] }` only when a present file is structurally\n * invalid. Missing files on both sides yield a typed success with an\n * empty/default v2 config.\n * @docLink packages/discovery/concepts#load-merged-source-config\n */\nexport function loadMergedSourceConfig(rootPath: string, sidecarPath?: string): ValidationResult {\n const baseResult = loadSourceConfigFromDir(rootPath);\n if (baseResult && !baseResult.ok) return baseResult;\n const base = baseResult?.ok ? baseResult.config : undefined;\n\n let overlay: SourceConfig | undefined;\n const overlayWarnings: string[] = [];\n if (sidecarPath) {\n const overlayResult = loadSourceConfigFromDir(sidecarPath);\n if (overlayResult && !overlayResult.ok) return overlayResult;\n if (overlayResult?.ok) {\n overlay = overlayResult.config;\n if (overlayResult.warnings) overlayWarnings.push(...overlayResult.warnings);\n }\n }\n\n const merged = mergeSourceConfigs(base, overlay);\n if (!merged) {\n // No file on either side — return a typed empty v2 default so callers\n // don't have to branch on undefined.\n return {\n ok: true,\n config: {\n version: 2,\n publisher_default: \"@<domain>\",\n default_ref: \"main\",\n publisher_overrides: [],\n dev_paths: [],\n },\n };\n }\n\n const warnings = collectWarnings(merged);\n if (overlayWarnings.length > 0) warnings.push(...overlayWarnings);\n return warnings.length > 0\n ? { ok: true, config: merged, warnings }\n : { ok: true, config: merged };\n}\n\n/**\n * Read `<dir>/.skaile-source.yaml` if present and return the parsed config.\n * Returns `undefined` when the file is missing (consumers treat as absent),\n * and a {@link ValidationFailure} when the file exists but is invalid.\n *\n * Internal helper for {@link loadMergedSourceConfig}.\n */\nfunction loadSourceConfigFromDir(dir: string): ValidationResult | undefined {\n const filePath = path.join(dir, \".skaile-source.yaml\");\n if (!fs.existsSync(filePath)) return undefined;\n try {\n const text = fs.readFileSync(filePath, \"utf-8\");\n return loadSourceConfig(text);\n } catch (err) {\n return {\n ok: false,\n errors: [\n {\n path: filePath,\n message: err instanceof Error ? err.message : String(err),\n },\n ],\n };\n }\n}\n","/**\n * Deterministic SHA256 hashing for asset content.\n *\n * One algorithm shared by:\n * - glob discovery (`discover.ts`)\n * - author-shipped manifest discovery (`discover-manifest.ts`)\n * - virtual-tree discovery (`tree-entries.ts`, via its own copy using async fetch)\n *\n * Hashing rule: files sorted alphabetically. For each file feed\n * `path` + `\\0` + `content` + `\\0`\n * into SHA256. Yields the same hash regardless of OS or filesystem ordering.\n *\n * Files that are referenced by the file filter but absent on disk are skipped\n * (non-fatal): they typically represent optional companion files like\n * `validator.py` that may not exist for every asset. The author-manifest path\n * surfaces missing files as a hard error before reaching the hash step, so\n * this only matters for the glob discovery code path.\n */\n\nimport * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\n/**\n * Compute a deterministic SHA256 hash over a set of files.\n *\n * @param assetRoot - Absolute path to the asset root directory\n * @param files - Relative file paths (from `assetRoot`) to include in the hash\n * @returns Hex-encoded SHA256 digest\n * @docLink packages/discovery/concepts#compute-deterministic-hash\n */\nexport function computeDeterministicHash(assetRoot: string, files: string[]): string {\n const hash = crypto.createHash(\"sha256\");\n const sorted = [...files].sort();\n for (const file of sorted) {\n const fullPath = path.join(assetRoot, file);\n try {\n hash.update(file);\n hash.update(\"\\0\");\n const content = fs.readFileSync(fullPath);\n hash.update(content);\n hash.update(\"\\0\");\n } catch {\n // File doesn't exist — skip (non-fatal, filter may reference optional\n // files like validator.py).\n }\n }\n return hash.digest(\"hex\");\n}\n\n/**\n * Compute SHA256 over a curated file set with full visibility into which\n * files contributed bytes vs were skipped because they're missing on disk.\n *\n * Used by the author-shipped manifest verifier where missing files are a\n * hard error, not a silent skip.\n *\n * @param assetRoot - Absolute path to the asset root directory\n * @param files - Relative file paths (from `assetRoot`) to include\n * @returns `{ sha256, present, missing }` — present/missing are relative paths\n * @docLink packages/discovery/concepts#compute-deterministic-hash-detailed\n */\nexport function computeDeterministicHashDetailed(\n assetRoot: string,\n files: string[],\n): { sha256: string; present: string[]; missing: string[] } {\n const hash = crypto.createHash(\"sha256\");\n const sorted = [...files].sort();\n const present: string[] = [];\n const missing: string[] = [];\n for (const file of sorted) {\n const fullPath = path.join(assetRoot, file);\n let content: Buffer | null = null;\n try {\n content = fs.readFileSync(fullPath);\n } catch {\n missing.push(file);\n continue;\n }\n hash.update(file);\n hash.update(\"\\0\");\n hash.update(content);\n hash.update(\"\\0\");\n present.push(file);\n }\n return { sha256: hash.digest(\"hex\"), present, missing };\n}\n","/**\n * Author-shipped inventory discovery.\n *\n * When a `.skaile-source.yaml` declares `version: 2` and an `assets:` block,\n * discovery uses the inventory verbatim. No glob walk, no AI enrichment.\n * Per-entry verification:\n *\n * - Each `files[]` entry exists on disk → hard error otherwise\n * - The manifest file parses (frontmatter / YAML / JSON) → hard error otherwise\n * - The kind is registered in the `IAssetKindRegistry` → ghost-install with\n * a warning (mirrors the Phase 1.7 amendment for unknown kinds)\n * - SHA256 hash is computed deterministically and compared against\n * `entry.sha256` when present → hard error on mismatch\n * - `entry.requires` refs are syntactically valid → hard error otherwise\n *\n * Output shape matches `discoverAssetsInTree()` so downstream consumers\n * (`LocalCatalogSource`, store backend) need no changes.\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as yaml from \"js-yaml\";\nimport { parseFrontmatter } from \"@skaile/workspaces/core/manifest\";\n\nimport type { IAssetKindRegistry } from \"@skaile/workspaces/plugins\";\nimport { isExcludedDevPath } from \"./source-config.js\";\nimport type { AssetEntry, SourceConfigV2 } from \"./source-config.js\";\nimport { buildRequiresGraph, type RequiresEdge } from \"./requires-graph.js\";\nimport { computeDeterministicHashDetailed } from \"./hash.js\";\nimport type { DiscoveredAsset, DiscoveryResult } from \"./discover.js\";\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Discover assets from an author-shipped inventory.\n *\n * Walks each `assets[]` entry in `sourceConfig`, verifies the declared file\n * filter against disk, parses the manifest, computes the deterministic hash,\n * validates requires syntax, and emits a `DiscoveredAsset` per entry.\n *\n * Verification failures are recorded in `result.errors` as\n * `<error-tag>: <relative-path>: <detail>` and the offending entry is skipped.\n * Tags: `ManifestFileMissing`, `ManifestSchemaError`, `ManifestHashMismatch`,\n * `ManifestRequiresError`.\n *\n * @param rootPath - Absolute path to the repo root\n * @param sourceConfig - Validated `version: 2` source config with `assets:` populated\n * @param registry - Asset kind registry for kind validation + file-filter fallback\n * @returns A {@link DiscoveryResult} identical in shape to `discoverAssetsInTree()`\n * @docLink packages/discovery/concepts#discover-from-manifest\n */\nexport function discoverFromManifest(\n rootPath: string,\n sourceConfig: SourceConfigV2,\n registry: IAssetKindRegistry,\n includeDev = false,\n): DiscoveryResult {\n const assets: DiscoveredAsset[] = [];\n const errors: Array<{ path: string; error: string }> = [];\n const allEdges: RequiresEdge[] = [];\n const devPaths = sourceConfig.dev_paths ?? [];\n\n // Stable ordering: sort by `path` so output is deterministic regardless\n // of how the author chose to list entries.\n const sortedEntries = [...sourceConfig.assets].sort((a, b) => (a.path < b.path ? -1 : 1));\n\n for (const entry of sortedEntries) {\n // Dev-only assets are excluded from a normal run; --dev re-includes them.\n if (!includeDev && isExcludedDevPath(entry.path, devPaths)) continue;\n\n const result = processEntry(rootPath, entry, registry);\n if (result.errors.length > 0) {\n errors.push(...result.errors);\n // Still continue on warning-class issues (unknown kind, missing sha256).\n if (!result.asset) continue;\n }\n if (result.asset) {\n assets.push(result.asset);\n allEdges.push(...result.asset.requires);\n }\n }\n\n const graph = buildRequiresGraph(allEdges);\n return { assets, graph, errors };\n}\n\n// ---------------------------------------------------------------------------\n// Per-entry processing\n// ---------------------------------------------------------------------------\n\ninterface ProcessEntryResult {\n asset: DiscoveredAsset | null;\n errors: Array<{ path: string; error: string }>;\n}\n\nfunction processEntry(\n rootPath: string,\n entry: AssetEntry,\n registry: IAssetKindRegistry,\n): ProcessEntryResult {\n const errors: Array<{ path: string; error: string }> = [];\n\n // ── 1. Resolve asset root + manifest path ─────────────────────────────────\n const assetRoot = path.resolve(rootPath, entry.path);\n const assetRootRelative = entry.path;\n\n // The manifest file is whichever entry in `files[]` looks like the manifest\n // — i.e. matches the registered kind's `matchesPath`. We try each `files[]`\n // entry against the registry; the first match wins. If no entry matches\n // (e.g. unknown kind), fall back to the first file in the list.\n const manifestFileRel = pickManifestFile(entry, registry);\n const manifestAbsPath = path.join(assetRoot, manifestFileRel);\n\n // ── 2. Verify every file exists on disk (hard error) ──────────────────────\n const missing: string[] = [];\n for (const file of entry.files) {\n if (!fs.existsSync(path.join(assetRoot, file))) {\n missing.push(file);\n }\n }\n if (missing.length > 0) {\n errors.push({\n path: assetRootRelative,\n error: `ManifestFileMissing: ${missing.join(\", \")}`,\n });\n return { asset: null, errors };\n }\n\n // ── 3. Parse manifest ─────────────────────────────────────────────────────\n const manifest = parseManifest(manifestAbsPath);\n if (!manifest) {\n errors.push({\n path: assetRootRelative,\n error: `ManifestSchemaError: failed to parse manifest file ${manifestFileRel}`,\n });\n return { asset: null, errors };\n }\n\n // ── 4. Resolve kind via registry (ghost-install on unknown) ───────────────\n if (!registry.getProvider(entry.kind)) {\n errors.push({\n path: assetRootRelative,\n error: `Unknown asset kind \"${entry.kind}\" — ghost-installing without provider validation`,\n });\n }\n\n // ── 5. Validate `requires` syntax ─────────────────────────────────────────\n const requiresErrors = validateRequiresSyntax(entry.requires);\n if (requiresErrors.length > 0) {\n errors.push({\n path: assetRootRelative,\n error: `ManifestRequiresError: ${requiresErrors.join(\"; \")}`,\n });\n return { asset: null, errors };\n }\n\n // ── 6. Compute hash + compare against entry.sha256 ────────────────────────\n const { sha256: computedHash, missing: hashMissing } = computeDeterministicHashDetailed(\n assetRoot,\n entry.files,\n );\n\n if (hashMissing.length > 0) {\n // existsSync passed at step 2 but readFileSync failed — race / perms.\n errors.push({\n path: assetRootRelative,\n error: `ManifestFileMissing: ${hashMissing.join(\", \")} (became unreadable during hashing)`,\n });\n return { asset: null, errors };\n }\n\n if (entry.sha256 && entry.sha256 !== computedHash) {\n errors.push({\n path: assetRootRelative,\n error: `ManifestHashMismatch: declared ${entry.sha256}, computed ${computedHash}`,\n });\n return { asset: null, errors };\n }\n\n if (!entry.sha256) {\n errors.push({\n path: assetRootRelative,\n error: `Missing sha256 — computed ${computedHash}. Re-run \\`skaile source build-manifest --write\\` to pin it.`,\n });\n // Non-fatal: proceed with the computed hash.\n }\n\n // ── 7. Build the DiscoveredAsset ──────────────────────────────────────────\n const ref = `${entry.publisher}/${entry.name}@${entry.version}`;\n const requires: RequiresEdge[] = entry.requires.map((to) => ({\n from: ref,\n to,\n field: \"assets[].requires\",\n }));\n\n // Merge entry.metadata into the parsed manifest so AssetDefinition.manifest\n // carries the author's passthrough fields downstream. Manifest fields win\n // on key collision — the author already declared identity in the entry.\n const mergedManifest: Record<string, unknown> = {\n ...(entry.metadata ?? {}),\n ...manifest,\n };\n\n const asset: DiscoveredAsset = {\n ref,\n kind: entry.kind,\n publisher: entry.publisher,\n name: entry.name,\n version: entry.version,\n manifest: mergedManifest,\n manifestPath: manifestAbsPath,\n relativePath: path.join(assetRootRelative, manifestFileRel).replace(/\\\\/g, \"/\"),\n fileFilter: {\n assetRoot,\n files: [...entry.files].sort(),\n },\n sha256: computedHash,\n requires,\n };\n\n return { asset, errors };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst MANIFEST_FILENAMES = new Set([\n \"SKILL.md\",\n \"AGENT.md\",\n \"agent.yaml\",\n \"CONNECTOR.md\",\n \"MCP.md\",\n \"CONTRACT.md\",\n \"PERSONA.md\",\n \"RULESET.md\",\n]);\n\nconst MANIFEST_SUFFIXES = [\".flow.yaml\", \".flow.json\", \".prompt.md\", \".preset.yaml\"];\n\nfunction pickManifestFile(entry: AssetEntry, registry: IAssetKindRegistry): string {\n const provider = registry.getProvider(entry.kind);\n\n // Provider knows best — give it the candidates and ask which matches.\n if (provider) {\n for (const file of entry.files) {\n if (provider.matchesPath(path.join(entry.path, file).replace(/\\\\/g, \"/\"))) {\n return file;\n }\n }\n }\n\n // Fallback to filename-based heuristics so we can still surface a\n // sensible manifestPath when the kind is unknown.\n for (const file of entry.files) {\n if (MANIFEST_FILENAMES.has(path.basename(file))) return file;\n if (MANIFEST_SUFFIXES.some((s) => file.endsWith(s))) return file;\n }\n\n // Last resort: first file in the list.\n return entry.files[0]!;\n}\n\nfunction parseManifest(absPath: string): Record<string, unknown> | null {\n try {\n const content = fs.readFileSync(absPath, \"utf-8\");\n\n if (absPath.endsWith(\".md\")) {\n const { data } = parseFrontmatter(content);\n return data as Record<string, unknown>;\n }\n\n if (absPath.endsWith(\".yaml\") || absPath.endsWith(\".yml\")) {\n const parsed = yaml.load(content);\n if (typeof parsed === \"object\" && parsed !== null) {\n return parsed as Record<string, unknown>;\n }\n return null;\n }\n\n if (absPath.endsWith(\".json\")) {\n return JSON.parse(content) as Record<string, unknown>;\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Validate the syntax of a single `requires:` entry.\n *\n * Accepted shapes:\n * - `<publisher>/<name>` (loose, no version)\n * - `<publisher>/<name>@<semver-range>` (e.g. `@org/foo@^1`)\n * - `<publisher>/<name>@<exact-version>`\n *\n * Returns a list of human-readable error strings (empty on success).\n */\nfunction validateRequiresSyntax(requires: string[]): string[] {\n const errors: string[] = [];\n // Loose validator: must start with `@`, contain one `/`, optional `@version`\n const RE = /^@[\\w-]+\\/[\\w.-]+(?:@.+)?$/;\n for (const r of requires) {\n if (!RE.test(r)) errors.push(`invalid requires entry \"${r}\"`);\n }\n return errors;\n}\n","/**\n * Asset discovery orchestrator.\n *\n * Walks a directory tree, identifies asset manifests via deterministic\n * filename matching, parses each manifest, computes file filters, and\n * extracts the requires graph.\n *\n * Zero storage dependencies — reused by LocalCatalogSource (Phase 1) and\n * the store backend (Phase 2).\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as yaml from \"js-yaml\";\nimport { parseFrontmatter } from \"@skaile/workspaces/core/manifest\";\n\nimport type { IAssetKindRegistry, AssetKindFileFilter } from \"@skaile/workspaces/plugins\";\nimport type { SourceConfig } from \"./source-config.js\";\nimport { isExcludedDevPath, isManifestMode, loadMergedSourceConfig } from \"./source-config.js\";\nimport { buildRequiresGraph, type RequiresEdge, type RequiresGraph } from \"./requires-graph.js\";\nimport { AssetKindRegistry } from \"./asset-kind-registry.js\";\nimport { BUILTIN_PROVIDERS } from \"./builtin-providers.js\";\nimport { computeDeterministicHash } from \"./hash.js\";\nimport { discoverFromManifest } from \"./discover-manifest.js\";\n\nexport { computeDeterministicHash } from \"./hash.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * A single asset discovered during a {@link discoverAssetsInTree} run, including its parsed\n * manifest, file filter, deterministic hash, and cross-asset dependency edges.\n *\n * @docLink packages/discovery/concepts#discovered-asset\n */\nexport interface DiscoveredAsset {\n /** Canonical ref: `<publisher>/<name>@<version>`. */\n ref: string;\n /** Asset kind (from registry resolution). */\n kind: string;\n publisher: string;\n name: string;\n version: string;\n /** Parsed manifest (frontmatter for .md, full YAML for .yaml/.json). */\n manifest: Record<string, unknown>;\n /** Absolute path to the manifest file. */\n manifestPath: string;\n /** Relative path from source root. */\n relativePath: string;\n /** Files included in this asset's tarball. */\n fileFilter: AssetKindFileFilter;\n /** SHA256 hash of the deterministic tarball content. */\n sha256: string;\n /** Cross-asset dependency edges originating from this asset. */\n requires: RequiresEdge[];\n}\n\nexport interface DiscoveryOptions {\n /** Optional .skaile-source.yaml config for publisher resolution. */\n sourceConfig?: SourceConfig;\n /**\n * Optional sidecar directory (e.g. `~/.skaile/sources/<slug>/`) carrying a\n * local overlay `.skaile-source.yaml`. When set and `sourceConfig` is\n * `undefined`, the helper loads the base in-repo config from `rootPath` and\n * merges the sidecar overlay on top. When both `sourceConfig` and\n * `sidecarPath` are set, the explicit `sourceConfig` wins (the caller is\n * responsible for merging).\n *\n * @docLink packages/discovery/concepts#sidecar-overlay\n */\n sidecarPath?: string;\n /** Optional kind registry. If omitted, a default registry with all built-in providers is used. */\n registry?: IAssetKindRegistry;\n /**\n * Include assets under the source config's `dev_paths` prefixes. Defaults to\n * `false` — a normal run excludes dev-only assets (e.g. `ai-assets-dev/`).\n * Set by the `--dev` flag on `skaile source sync` / `source add`.\n *\n * @docLink packages/discovery/concepts#dev-paths\n */\n includeDev?: boolean;\n}\n\n/**\n * The complete output of a {@link discoverAssetsInTree} scan: all discovered assets, the\n * full requires graph across those assets, and any non-fatal parse errors encountered.\n *\n * @docLink packages/discovery/concepts#discovery-result\n */\nexport interface DiscoveryResult {\n assets: DiscoveredAsset[];\n graph: RequiresGraph;\n errors: Array<{ path: string; error: string }>;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Create a default AssetKindRegistry with all built-in providers registered.\n * Used when no registry is passed to discoverAssetsInTree().\n */\nexport function createDefaultRegistry(): AssetKindRegistry {\n const registry = new AssetKindRegistry();\n for (const provider of BUILTIN_PROVIDERS) {\n registry.register(provider);\n }\n return registry;\n}\n\n/**\n * Discover all assets in a directory tree.\n *\n * Walks `rootPath` recursively, identifies manifests by filename, parses\n * them, computes file filters and SHA256 hashes, and extracts the\n * requires graph.\n *\n * @param rootPath - Absolute path to the directory tree to scan\n * @param optionsOrSourceConfig - Discovery options, or a SourceConfig for backward compat\n * @returns A {@link DiscoveryResult} with all discovered assets, the requires graph, and any parse errors\n * @docLink packages/discovery/concepts#discover-assets-in-tree\n */\nexport function discoverAssetsInTree(\n rootPath: string,\n optionsOrSourceConfig?: DiscoveryOptions | SourceConfig,\n): DiscoveryResult {\n // Backward-compat: accept a bare SourceConfig or the new options object\n let sourceConfig: SourceConfig | undefined;\n let registry: IAssetKindRegistry | undefined;\n let sidecarPath: string | undefined;\n let includeDev = false;\n\n if (\n optionsOrSourceConfig &&\n (\"registry\" in optionsOrSourceConfig ||\n \"sourceConfig\" in optionsOrSourceConfig ||\n \"sidecarPath\" in optionsOrSourceConfig ||\n \"includeDev\" in optionsOrSourceConfig)\n ) {\n sourceConfig = (optionsOrSourceConfig as DiscoveryOptions).sourceConfig;\n registry = (optionsOrSourceConfig as DiscoveryOptions).registry;\n sidecarPath = (optionsOrSourceConfig as DiscoveryOptions).sidecarPath;\n includeDev = (optionsOrSourceConfig as DiscoveryOptions).includeDev ?? false;\n } else {\n sourceConfig = optionsOrSourceConfig as SourceConfig | undefined;\n }\n\n // Use default registry if none provided\n if (!registry) {\n registry = createDefaultRegistry();\n }\n\n // Sidecar overlay: if no explicit sourceConfig was passed but a sidecar\n // path was supplied, load the base config from rootPath and merge in the\n // sidecar overlay before dispatching.\n if (!sourceConfig && sidecarPath) {\n const merged = loadMergedSourceConfig(rootPath, sidecarPath);\n if (merged.ok) {\n sourceConfig = merged.config;\n }\n }\n\n // Dispatch: if the source config carries an author-shipped inventory,\n // discover from the manifest and skip the glob walk entirely.\n if (sourceConfig && isManifestMode(sourceConfig)) {\n return discoverFromManifest(rootPath, sourceConfig, registry, includeDev);\n }\n\n const assets: DiscoveredAsset[] = [];\n const errors: Array<{ path: string; error: string }> = [];\n const allEdges: RequiresEdge[] = [];\n const devPaths = sourceConfig?.dev_paths ?? [];\n\n // Dedup: for kinds where a directory might contain both agent.yaml and AGENT.md,\n // keep only the first match per directory+kind.\n const seen = new Set<string>();\n\n for (const { absPath, relativePath } of walkTree(rootPath)) {\n // Dev-only assets are excluded from a normal run; --dev re-includes them.\n if (!includeDev && isExcludedDevPath(relativePath, devPaths)) continue;\n\n // Resolve kind through the registry\n let kind: string | undefined;\n try {\n kind = registry.resolveKind(relativePath);\n } catch (err) {\n // AssetKindPathAmbiguityError — record and skip\n errors.push({\n path: relativePath,\n error: err instanceof Error ? err.message : String(err),\n });\n continue;\n }\n if (!kind) continue;\n\n // Dedup key: directory + kind\n const dir = path.dirname(relativePath);\n const dedupKey = `${dir}:${kind}`;\n if (seen.has(dedupKey)) continue;\n seen.add(dedupKey);\n\n try {\n const manifest = parseManifest(absPath);\n if (!manifest) {\n errors.push({ path: relativePath, error: \"Failed to parse manifest\" });\n continue;\n }\n\n const publisher = resolvePublisher(relativePath, sourceConfig);\n const name = deriveName(relativePath, kind, manifest);\n // Default \"0.1.0\" (not \"0.0.0\"): the Catalog rejects \"0.0.0\" at publish.\n const version = typeof manifest.version === \"string\" ? manifest.version : \"0.1.0\";\n const ref = `${publisher}/${name}@${version}`;\n\n // File filter — through registry\n const fileFilter = registry.defaultFileFilter(kind, absPath) ?? {\n assetRoot: path.dirname(absPath),\n files: [path.basename(absPath)],\n };\n\n // SHA256\n const sha256 = computeDeterministicHash(fileFilter.assetRoot, fileFilter.files);\n\n // Requires extraction — through registry\n const requires = registry.extractRequires(kind, ref, manifest);\n allEdges.push(...requires);\n\n assets.push({\n ref,\n kind,\n publisher,\n name,\n version,\n manifest,\n manifestPath: absPath,\n relativePath,\n fileFilter,\n sha256,\n requires,\n });\n } catch (err) {\n errors.push({\n path: relativePath,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n const graph = buildRequiresGraph(allEdges);\n return { assets, graph, errors };\n}\n\n// ---------------------------------------------------------------------------\n// Directory walker\n// ---------------------------------------------------------------------------\n\nfunction* walkTree(rootDir: string): Generator<{ absPath: string; relativePath: string }> {\n function* walk(\n dir: string,\n relDir: string,\n ): Generator<{ absPath: string; relativePath: string }> {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const e of entries.sort((a, b) => (a.name < b.name ? -1 : 1))) {\n const full = path.join(dir, e.name);\n const rel = relDir ? `${relDir}/${e.name}` : e.name;\n if (e.isDirectory()) {\n if (e.name === \".git\" || e.name === \"node_modules\" || e.name === \".skaile\") continue;\n yield* walk(full, rel);\n } else if (e.isFile()) {\n yield { absPath: full, relativePath: rel };\n }\n }\n }\n yield* walk(rootDir, \"\");\n}\n\n// ---------------------------------------------------------------------------\n// Manifest parsing\n// ---------------------------------------------------------------------------\n\n/**\n * Parse a manifest file. .md files get frontmatter-parsed (YAML header),\n * .yaml files get full-YAML-parsed, .json files get JSON.parsed.\n */\nfunction parseManifest(absPath: string): Record<string, unknown> | null {\n try {\n const content = fs.readFileSync(absPath, \"utf-8\");\n\n if (absPath.endsWith(\".md\")) {\n const { data } = parseFrontmatter(content);\n return data as Record<string, unknown>;\n }\n\n if (absPath.endsWith(\".yaml\") || absPath.endsWith(\".yml\")) {\n const parsed = yaml.load(content);\n if (typeof parsed === \"object\" && parsed !== null) {\n return parsed as Record<string, unknown>;\n }\n return null;\n }\n\n if (absPath.endsWith(\".json\")) {\n return JSON.parse(content) as Record<string, unknown>;\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Publisher resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the publisher namespace for an asset at a given relative path.\n *\n * Resolution order:\n * 1. Publisher overrides (first match wins)\n * 2. publisher_default template (<domain> replaced with first-level dir name)\n * 3. Fallback: @<first-dir-component>\n */\nfunction resolvePublisher(relativePath: string, sourceConfig?: SourceConfig): string {\n if (!sourceConfig) {\n // No source config: derive from first directory component\n const domain = relativePath.split(\"/\")[0] ?? \"unknown\";\n return `@${domain}`;\n }\n\n // Check publisher overrides first (first match wins)\n for (const override of sourceConfig.publisher_overrides) {\n if (relativePath.startsWith(override.path)) {\n return override.publisher;\n }\n }\n\n // Use publisher_default template\n const template = sourceConfig.publisher_default;\n if (template.includes(\"<domain>\")) {\n const domain = relativePath.split(\"/\")[0] ?? \"unknown\";\n return template.replace(\"<domain>\", domain);\n }\n return template;\n}\n\n// ---------------------------------------------------------------------------\n// Name derivation\n// ---------------------------------------------------------------------------\n\n/**\n * Derive the asset name. Prefers manifest frontmatter `name:` field,\n * falls back to parent directory name.\n */\nfunction deriveName(relativePath: string, kind: string, manifest: Record<string, unknown>): string {\n // Use name from manifest if available\n if (typeof manifest.name === \"string\" && manifest.name.length > 0) {\n return manifest.name;\n }\n\n const parts = relativePath.split(\"/\");\n\n // For flow/prompt/preset, the name is the filename stem\n if (kind === \"flow\") {\n const filename = parts[parts.length - 1] ?? \"\";\n return filename.replace(/\\.flow\\.(yaml|json)$/, \"\");\n }\n if (kind === \"prompt\") {\n const filename = parts[parts.length - 1] ?? \"\";\n return filename.replace(/\\.prompt\\.md$/, \"\");\n }\n if (kind === \"preset\") {\n const filename = parts[parts.length - 1] ?? \"\";\n return filename.replace(/\\.preset\\.yaml$/, \"\");\n }\n\n // For most types, the parent directory name is the asset name\n if (parts.length >= 2) {\n return parts[parts.length - 2]!;\n }\n\n // Fallback\n const filename = parts[parts.length - 1] ?? \"unknown\";\n return filename.replace(/\\.(md|yaml|json)$/, \"\");\n}\n","/**\n * Asset discovery over a virtual file tree (no real filesystem access).\n *\n * `discoverAssetsInTreeEntries()` is the server-side counterpart to\n * `discoverAssetsInTree()` — same kind resolution, manifest parsing,\n * publisher/name derivation, requires extraction, and SHA256 hashing — but\n * driven by a flat list of {@link TreeEntry} (the shape returned by GitHub's\n * Git Trees API: `GET /repos/:owner/:repo/git/trees/:tree_sha?recursive=1`).\n *\n * Used by the public Catalog backend (`@postxl/skaile-store-api`) so that\n * Source ingestion never touches the local filesystem and never runs\n * `git clone` (per spec § Phase 2: \"no client-side cloning, ever\").\n *\n * The function is async because manifest parsing and content hashing both\n * require fetching blob bytes from the remote host (e.g. GitHub Blobs API).\n *\n * Per-kind file-filter logic is mirrored from `builtin-providers.ts` — the\n * provider implementations there read `fs.readdirSync` / `fs.existsSync`,\n * which doesn't translate to a virtual tree, so this module reimplements\n * the same patterns against the supplied {@link TreeEntry} list. The\n * resulting `fileFilter.files` set is identical to what\n * `discoverAssetsInTree()` would produce for the same content laid out on\n * disk.\n *\n * @module\n */\n\nimport * as crypto from \"node:crypto\";\nimport * as yaml from \"js-yaml\";\nimport { parseFrontmatter } from \"@skaile/workspaces/core/manifest\";\n\nimport type { IAssetKindRegistry, AssetKindFileFilter } from \"@skaile/workspaces/plugins\";\nimport type { AssetEntry, SourceConfig, SourceConfigV2 } from \"./source-config.js\";\nimport {\n isExcludedDevPath,\n isManifestMode,\n loadSourceConfig,\n mergeSourceConfigs,\n} from \"./source-config.js\";\nimport { buildRequiresGraph, type RequiresEdge } from \"./requires-graph.js\";\nimport { createDefaultRegistry } from \"./discover.js\";\nimport type { DiscoveredAsset, DiscoveryResult } from \"./discover.js\";\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\n/**\n * A single entry in a virtual file tree (the shape returned by GitHub's\n * Git Trees API).\n *\n * Only the four fields used by discovery are required; consumers may pass\n * Octokit's full `GitTreeResponse[]` directly because TypeScript structural\n * typing accepts the superset.\n *\n * @docLink packages/discovery/concepts#tree-entry\n */\nexport interface TreeEntry {\n /** Repo-relative path (forward slashes), e.g. `domain/skills/review/SKILL.md`. */\n path: string;\n /** `\"blob\"` for files, `\"tree\"` for directories, `\"commit\"` for submodules. */\n type: \"blob\" | \"tree\" | \"commit\" | string;\n /** Git object SHA used to fetch blob contents via {@link DiscoverAssetsInTreeEntriesOptions.fetchBlob}. */\n sha: string;\n /** Optional file mode (`\"100644\"` etc.). When `\"100755\"`, indicates an executable. */\n mode?: string;\n /** Optional blob size in bytes. */\n size?: number;\n}\n\n/**\n * Options for {@link discoverAssetsInTreeEntries}.\n *\n * @docLink packages/discovery/concepts#discover-assets-in-tree-entries-options\n */\nexport interface DiscoverAssetsInTreeEntriesOptions {\n /**\n * Async resolver that returns the bytes of a blob given its Git SHA.\n *\n * The store backend wires this to Octokit's\n * `repos.getContent` / `git.getBlob` API; tests can pass a synchronous\n * map-backed implementation. Returning `null` is treated identically to a\n * fetch error (the file is skipped during hashing).\n */\n fetchBlob: (sha: string) => Promise<Buffer | Uint8Array | string | null>;\n\n /** Optional `.skaile-source.yaml` config (parsed with {@link parseSourceConfig}). */\n sourceConfig?: SourceConfig;\n\n /**\n * Optional sidecar overlay config (loaded out-of-band from\n * `~/.skaile/sources/<slug>/.skaile-source.yaml`). When provided, the\n * `sourceConfig` resolved from the tree (or passed explicitly) is merged\n * with this overlay via {@link mergeSourceConfigs} before dispatch.\n *\n * @docLink packages/discovery/concepts#sidecar-overlay\n */\n sidecarSourceConfig?: SourceConfig;\n\n /** Optional kind registry. Defaults to {@link createDefaultRegistry}. */\n registry?: IAssetKindRegistry;\n\n /**\n * Include assets under the source config's `dev_paths` prefixes. Defaults to\n * `false`. Mirrors the local-FS {@link discoverAssetsInTree} option.\n *\n * @docLink packages/discovery/concepts#dev-paths\n */\n includeDev?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Discover assets in a virtual tree (Octokit `TreeEntry[]`).\n *\n * Mirrors {@link discoverAssetsInTree} but operates on a remote tree\n * snapshot — no `node:fs` access. Manifest content and per-asset file\n * bytes are fetched on demand via `options.fetchBlob`.\n *\n * @param entries - Flat list of tree entries (paths + blob SHAs). Tree\n * entries with `type: \"tree\"` are ignored (directories are reconstructed\n * from blob paths).\n * @param options - Blob fetcher + optional source config and registry.\n * @returns A {@link DiscoveryResult} identical in shape to\n * {@link discoverAssetsInTree}'s output, including `assets`, `graph`,\n * and `errors`.\n * @docLink packages/discovery/concepts#discover-assets-in-tree-entries\n */\nexport async function discoverAssetsInTreeEntries(\n entries: TreeEntry[],\n options: DiscoverAssetsInTreeEntriesOptions,\n): Promise<DiscoveryResult> {\n const registry = options.registry ?? createDefaultRegistry();\n const includeDev = options.includeDev ?? false;\n\n // Index every blob path for O(1) lookup during file-filter construction.\n const blobByPath = new Map<string, TreeEntry>();\n for (const entry of entries) {\n if (entry.type === \"blob\") {\n blobByPath.set(entry.path, entry);\n }\n }\n\n // Author-shipped inventory dispatch.\n // If a source config was explicitly supplied with `assets:` populated, use\n // it. Otherwise, look for `.skaile-source.yaml` in the tree itself and\n // parse it on the fly — this mirrors how a server-side ingestion pipeline\n // would honor an author-shipped manifest without any out-of-band hint.\n const baseSourceConfig = await resolveSourceConfigFromTree(\n options.sourceConfig,\n blobByPath,\n options.fetchBlob,\n );\n // Sidecar overlay: when supplied, merge on top of the base resolved from\n // the tree. The base may be undefined (no upstream config); the sidecar\n // alone is sufficient.\n const resolvedSourceConfig = options.sidecarSourceConfig\n ? mergeSourceConfigs(baseSourceConfig, options.sidecarSourceConfig)\n : baseSourceConfig;\n if (resolvedSourceConfig && isManifestMode(resolvedSourceConfig)) {\n return discoverFromManifestTree(\n resolvedSourceConfig,\n blobByPath,\n options.fetchBlob,\n registry,\n includeDev,\n );\n }\n const devPaths = resolvedSourceConfig?.dev_paths ?? [];\n\n // Stable iteration order — same convention as the directory walker:\n // sorted alphabetically so dedup picks the first match (e.g. AGENT.md\n // before agent.yaml).\n const sortedBlobPaths = [...blobByPath.keys()].sort();\n\n const assets: DiscoveredAsset[] = [];\n const errors: Array<{ path: string; error: string }> = [];\n const allEdges: RequiresEdge[] = [];\n\n // Dedup key: directory + kind (matches discoverAssetsInTree).\n const seen = new Set<string>();\n\n for (const relativePath of sortedBlobPaths) {\n // Skip the well-known directories to mirror the local walker.\n if (\n relativePath.startsWith(\".git/\") ||\n relativePath.startsWith(\"node_modules/\") ||\n relativePath.startsWith(\".skaile/\") ||\n relativePath.includes(\"/.git/\") ||\n relativePath.includes(\"/node_modules/\") ||\n relativePath.includes(\"/.skaile/\")\n ) {\n continue;\n }\n\n // Dev-only assets are excluded from a normal run; --dev re-includes them.\n if (!includeDev && isExcludedDevPath(relativePath, devPaths)) continue;\n\n let kind: string | undefined;\n try {\n kind = registry.resolveKind(relativePath);\n } catch (err) {\n errors.push({\n path: relativePath,\n error: err instanceof Error ? err.message : String(err),\n });\n continue;\n }\n if (!kind) continue;\n\n const dir = posixDirname(relativePath);\n const dedupKey = `${dir}:${kind}`;\n if (seen.has(dedupKey)) continue;\n seen.add(dedupKey);\n\n const manifestEntry = blobByPath.get(relativePath);\n if (!manifestEntry) {\n // Should never happen — `relativePath` came from `blobByPath`.\n errors.push({ path: relativePath, error: \"Manifest blob disappeared from tree index\" });\n continue;\n }\n\n let manifestBytes: Buffer | null;\n try {\n manifestBytes = await fetchAsBuffer(options.fetchBlob, manifestEntry.sha);\n } catch (err) {\n errors.push({\n path: relativePath,\n error: `Failed to fetch manifest blob: ${err instanceof Error ? err.message : String(err)}`,\n });\n continue;\n }\n if (!manifestBytes) {\n errors.push({ path: relativePath, error: \"Failed to fetch manifest blob\" });\n continue;\n }\n\n const manifestText = manifestBytes.toString(\"utf-8\");\n const manifest = parseManifestText(relativePath, manifestText);\n if (!manifest) {\n errors.push({ path: relativePath, error: \"Failed to parse manifest\" });\n continue;\n }\n\n const publisher = resolvePublisher(relativePath, resolvedSourceConfig);\n const name = deriveName(relativePath, kind, manifest);\n // Default \"0.1.0\" (not \"0.0.0\"): the Catalog rejects \"0.0.0\" at publish.\n const version = typeof manifest.version === \"string\" ? manifest.version : \"0.1.0\";\n const ref = `${publisher}/${name}@${version}`;\n\n // File filter — kind-aware, computed against the virtual tree.\n const fileFilter = computeFileFilter(kind, relativePath, blobByPath);\n\n // SHA256 — hash deterministically over the curated file set, fetching\n // each blob's bytes on demand.\n let sha256: string;\n try {\n sha256 = await computeDeterministicHashFromTree(fileFilter, blobByPath, options.fetchBlob);\n } catch (err) {\n errors.push({\n path: relativePath,\n error: `Failed to compute hash: ${err instanceof Error ? err.message : String(err)}`,\n });\n continue;\n }\n\n const requires = registry.extractRequires(kind, ref, manifest);\n allEdges.push(...requires);\n\n assets.push({\n ref,\n kind,\n publisher,\n name,\n version,\n manifest,\n // The tree-entries variant has no on-disk path — surface the\n // repo-relative path here so downstream consumers can build a\n // Manifest URL (raw.githubusercontent.com link).\n manifestPath: relativePath,\n relativePath,\n fileFilter,\n sha256,\n requires,\n });\n }\n\n const graph = buildRequiresGraph(allEdges);\n return { assets, graph, errors };\n}\n\n// ---------------------------------------------------------------------------\n// Manifest parsing (string-driven; mirrors discover.ts)\n// ---------------------------------------------------------------------------\n\nfunction parseManifestText(relativePath: string, text: string): Record<string, unknown> | null {\n try {\n if (relativePath.endsWith(\".md\")) {\n const { data } = parseFrontmatter(text);\n return data as Record<string, unknown>;\n }\n if (relativePath.endsWith(\".yaml\") || relativePath.endsWith(\".yml\")) {\n const parsed = yaml.load(text);\n if (typeof parsed === \"object\" && parsed !== null) {\n return parsed as Record<string, unknown>;\n }\n return null;\n }\n if (relativePath.endsWith(\".json\")) {\n return JSON.parse(text) as Record<string, unknown>;\n }\n return null;\n } catch {\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Publisher resolution (copy of discover.ts to avoid exporting an internal)\n// ---------------------------------------------------------------------------\n\nfunction resolvePublisher(relativePath: string, sourceConfig?: SourceConfig): string {\n if (!sourceConfig) {\n const domain = relativePath.split(\"/\")[0] ?? \"unknown\";\n return `@${domain}`;\n }\n for (const override of sourceConfig.publisher_overrides) {\n if (relativePath.startsWith(override.path)) {\n return override.publisher;\n }\n }\n const template = sourceConfig.publisher_default;\n if (template.includes(\"<domain>\")) {\n const domain = relativePath.split(\"/\")[0] ?? \"unknown\";\n return template.replace(\"<domain>\", domain);\n }\n return template;\n}\n\n// ---------------------------------------------------------------------------\n// Name derivation (mirrors discover.ts)\n// ---------------------------------------------------------------------------\n\nfunction deriveName(relativePath: string, kind: string, manifest: Record<string, unknown>): string {\n if (typeof manifest.name === \"string\" && manifest.name.length > 0) {\n return manifest.name;\n }\n const parts = relativePath.split(\"/\");\n if (kind === \"flow\") {\n const filename = parts[parts.length - 1] ?? \"\";\n return filename.replace(/\\.flow\\.(yaml|json)$/, \"\");\n }\n if (kind === \"prompt\") {\n const filename = parts[parts.length - 1] ?? \"\";\n return filename.replace(/\\.prompt\\.md$/, \"\");\n }\n if (kind === \"preset\") {\n const filename = parts[parts.length - 1] ?? \"\";\n return filename.replace(/\\.preset\\.yaml$/, \"\");\n }\n if (parts.length >= 2) {\n return parts[parts.length - 2]!;\n }\n const filename = parts[parts.length - 1] ?? \"unknown\";\n return filename.replace(/\\.(md|yaml|json)$/, \"\");\n}\n\n// ---------------------------------------------------------------------------\n// File-filter computation against a virtual tree\n// ---------------------------------------------------------------------------\n\n/**\n * Compute the per-kind default file filter against a virtual tree.\n *\n * Mirrors the per-kind logic in `builtin-providers.ts`. Kept inline because\n * the provider implementations there read `fs.readdirSync`/`fs.existsSync`,\n * which doesn't translate to a virtual `TreeEntry[]`. For unknown kinds\n * (extension kinds without a file filter, or kinds with `defaultFileFilter:\n * manifestOnly`) we fall back to manifest-only.\n */\nfunction computeFileFilter(\n kind: string,\n manifestPath: string,\n blobByPath: Map<string, TreeEntry>,\n): AssetKindFileFilter {\n const dir = posixDirname(manifestPath);\n const manifestName = posixBasename(manifestPath);\n\n switch (kind) {\n case \"skill\":\n return skillFilterVirtual(dir, manifestName, blobByPath);\n case \"agent\":\n return agentFilterVirtual(dir, manifestName, blobByPath);\n case \"contract\":\n return contractFilterVirtual(dir, manifestName, blobByPath);\n case \"connector\":\n return connectorFilterVirtual(dir, manifestName, blobByPath);\n // mcp-server, prompt, preset, persona, ruleset, knowledge: manifest-only\n default:\n return { assetRoot: dir, files: [manifestName] };\n }\n}\n\n/**\n * skill: SKILL.md + same-dir leaves (validator.py, CLI.md) + references/\n * + nested sub-directories that contain their own SKILL.md.\n */\nfunction skillFilterVirtual(\n dir: string,\n manifestName: string,\n blobByPath: Map<string, TreeEntry>,\n): AssetKindFileFilter {\n const files = new Set<string>([manifestName]);\n\n // Same-dir leaves.\n for (const leaf of [\"validator.py\", \"CLI.md\"]) {\n if (blobByPath.has(joinPosix(dir, leaf))) files.add(leaf);\n }\n\n // Direct children of `dir`: detect the nested-skill convention and the\n // `references/` subdir in one pass.\n const directChildDirs = new Set<string>();\n for (const blobPath of blobByPath.keys()) {\n if (!isInDir(blobPath, dir)) continue;\n const remainder = blobPath.slice(dir === \"\" ? 0 : dir.length + 1);\n const slash = remainder.indexOf(\"/\");\n if (slash === -1) continue; // direct file already handled\n const childDir = remainder.slice(0, slash);\n directChildDirs.add(childDir);\n }\n\n // references/ — included entirely.\n if (directChildDirs.has(\"references\")) {\n addAllUnder(files, dir, \"references\", blobByPath);\n }\n\n // Nested SKILL dirs — included entirely.\n for (const childDir of directChildDirs) {\n if (childDir === \"references\") continue;\n if (blobByPath.has(joinPosix(dir, childDir, \"SKILL.md\"))) {\n addAllUnder(files, dir, childDir, blobByPath);\n }\n }\n\n return { assetRoot: dir, files: [...files].sort() };\n}\n\n/**\n * agent: agent.yaml or AGENT.md + same-dir SOUL.md, RULES.md + knowledge/.\n */\nfunction agentFilterVirtual(\n dir: string,\n manifestName: string,\n blobByPath: Map<string, TreeEntry>,\n): AssetKindFileFilter {\n const files = new Set<string>([manifestName]);\n for (const companion of [\"SOUL.md\", \"RULES.md\"]) {\n if (blobByPath.has(joinPosix(dir, companion))) files.add(companion);\n }\n addAllUnder(files, dir, \"knowledge\", blobByPath);\n return { assetRoot: dir, files: [...files].sort() };\n}\n\n/**\n * contract: CONTRACT.md + same-dir attachments (all non-directory entries).\n */\nfunction contractFilterVirtual(\n dir: string,\n manifestName: string,\n blobByPath: Map<string, TreeEntry>,\n): AssetKindFileFilter {\n const files = new Set<string>([manifestName]);\n for (const blobPath of blobByPath.keys()) {\n if (!isInDir(blobPath, dir)) continue;\n const remainder = blobPath.slice(dir === \"\" ? 0 : dir.length + 1);\n if (remainder.includes(\"/\")) continue; // not direct child\n files.add(remainder);\n }\n return { assetRoot: dir, files: [...files].sort() };\n}\n\n/**\n * connector: CONNECTOR.md + entry file (adapter.ts by default).\n */\nfunction connectorFilterVirtual(\n dir: string,\n manifestName: string,\n blobByPath: Map<string, TreeEntry>,\n): AssetKindFileFilter {\n const files = new Set<string>([manifestName]);\n if (blobByPath.has(joinPosix(dir, \"adapter.ts\"))) files.add(\"adapter.ts\");\n return { assetRoot: dir, files: [...files].sort() };\n}\n\n// ---------------------------------------------------------------------------\n// Deterministic hashing over a virtual tree\n// ---------------------------------------------------------------------------\n\n/**\n * Compute a deterministic SHA256 hash over a virtual file set, fetching each\n * blob's bytes via `fetchBlob`. Mirrors the hashing convention in\n * {@link computeDeterministicHash}: files sorted, path + null + content +\n * null per file. Missing or unfetchable files are skipped (non-fatal,\n * matching the local case where optional files like `validator.py` may not\n * exist).\n */\nasync function computeDeterministicHashFromTree(\n fileFilter: AssetKindFileFilter,\n blobByPath: Map<string, TreeEntry>,\n fetchBlob: DiscoverAssetsInTreeEntriesOptions[\"fetchBlob\"],\n): Promise<string> {\n const hash = crypto.createHash(\"sha256\");\n const sorted = [...fileFilter.files].sort();\n for (const file of sorted) {\n const fullPath = joinPosix(fileFilter.assetRoot, file);\n const entry = blobByPath.get(fullPath);\n if (!entry) continue; // file referenced by filter but absent in tree\n hash.update(file);\n hash.update(\"\\0\");\n let bytes: Buffer | null;\n try {\n bytes = await fetchAsBuffer(fetchBlob, entry.sha);\n } catch {\n bytes = null;\n }\n if (bytes) hash.update(bytes);\n hash.update(\"\\0\");\n }\n return hash.digest(\"hex\");\n}\n\n// ---------------------------------------------------------------------------\n// POSIX path helpers (TreeEntry paths always use forward slashes)\n// ---------------------------------------------------------------------------\n\nfunction posixDirname(p: string): string {\n const i = p.lastIndexOf(\"/\");\n return i === -1 ? \"\" : p.slice(0, i);\n}\n\nfunction posixBasename(p: string): string {\n const i = p.lastIndexOf(\"/\");\n return i === -1 ? p : p.slice(i + 1);\n}\n\nfunction joinPosix(...segments: string[]): string {\n return segments.filter((s) => s !== \"\").join(\"/\");\n}\n\nfunction isInDir(blobPath: string, dir: string): boolean {\n if (dir === \"\") return true;\n return blobPath.startsWith(`${dir}/`);\n}\n\nfunction addAllUnder(\n out: Set<string>,\n baseDir: string,\n subDir: string,\n blobByPath: Map<string, TreeEntry>,\n): void {\n const prefix = baseDir === \"\" ? `${subDir}/` : `${baseDir}/${subDir}/`;\n for (const blobPath of blobByPath.keys()) {\n if (blobPath.startsWith(prefix)) {\n // Strip baseDir prefix to get path relative to assetRoot.\n const relToAssetRoot = baseDir === \"\" ? blobPath : blobPath.slice(baseDir.length + 1);\n out.add(relToAssetRoot);\n } else if (blobPath === prefix.slice(0, -1)) {\n // exact match (a file named exactly subDir, unlikely but defensive)\n out.add(subDir);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Blob fetcher normalisation\n// ---------------------------------------------------------------------------\n\nasync function fetchAsBuffer(\n fetchBlob: DiscoverAssetsInTreeEntriesOptions[\"fetchBlob\"],\n sha: string,\n): Promise<Buffer | null> {\n const result = await fetchBlob(sha);\n if (result == null) return null;\n if (Buffer.isBuffer(result)) return result;\n if (typeof result === \"string\") return Buffer.from(result, \"utf-8\");\n // Uint8Array\n return Buffer.from(result);\n}\n\n// ---------------------------------------------------------------------------\n// Author-shipped manifest dispatch (virtual tree)\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the source config to use for this discovery run.\n *\n * 1. If the caller passed `options.sourceConfig`, use it as-is.\n * 2. Otherwise, look up `.skaile-source.yaml` in the tree and parse it. This\n * lets a server-side ingestion pipeline honor an author-shipped inventory\n * without any out-of-band hint.\n */\nasync function resolveSourceConfigFromTree(\n explicit: SourceConfig | undefined,\n blobByPath: Map<string, TreeEntry>,\n fetchBlob: DiscoverAssetsInTreeEntriesOptions[\"fetchBlob\"],\n): Promise<SourceConfig | undefined> {\n if (explicit) return explicit;\n const entry = blobByPath.get(\".skaile-source.yaml\");\n if (!entry) return undefined;\n const bytes = await fetchAsBuffer(fetchBlob, entry.sha);\n if (!bytes) return undefined;\n const result = loadSourceConfig(bytes.toString(\"utf-8\"));\n return result.ok ? result.config : undefined;\n}\n\n/**\n * Discover assets from an author-shipped inventory against a virtual tree.\n *\n * Mirrors `discoverFromManifest()` from discover-manifest.ts but uses the\n * `TreeEntry[]` blob index + async `fetchBlob` instead of `node:fs`. Hash\n * algorithm is identical so the same content produces the same SHA256 on\n * local FS and remote tree.\n */\nasync function discoverFromManifestTree(\n sourceConfig: SourceConfigV2,\n blobByPath: Map<string, TreeEntry>,\n fetchBlob: DiscoverAssetsInTreeEntriesOptions[\"fetchBlob\"],\n registry: IAssetKindRegistry,\n includeDev = false,\n): Promise<DiscoveryResult> {\n const assets: DiscoveredAsset[] = [];\n const errors: Array<{ path: string; error: string }> = [];\n const allEdges: RequiresEdge[] = [];\n const devPaths = sourceConfig.dev_paths ?? [];\n\n const sortedEntries = [...sourceConfig.assets].sort((a, b) => (a.path < b.path ? -1 : 1));\n\n for (const entry of sortedEntries) {\n // Dev-only assets are excluded from a normal run; --dev re-includes them.\n if (!includeDev && isExcludedDevPath(entry.path, devPaths)) continue;\n const result = await processManifestEntryTree(entry, blobByPath, fetchBlob, registry);\n if (result.errors.length > 0) {\n errors.push(...result.errors);\n if (!result.asset) continue;\n }\n if (result.asset) {\n assets.push(result.asset);\n allEdges.push(...result.asset.requires);\n }\n }\n\n const graph = buildRequiresGraph(allEdges);\n return { assets, graph, errors };\n}\n\ninterface ProcessEntryTreeResult {\n asset: DiscoveredAsset | null;\n errors: Array<{ path: string; error: string }>;\n}\n\nasync function processManifestEntryTree(\n entry: AssetEntry,\n blobByPath: Map<string, TreeEntry>,\n fetchBlob: DiscoverAssetsInTreeEntriesOptions[\"fetchBlob\"],\n registry: IAssetKindRegistry,\n): Promise<ProcessEntryTreeResult> {\n const errors: Array<{ path: string; error: string }> = [];\n const assetRootRelative = entry.path;\n\n // Verify every file is present in the tree.\n const missing: string[] = [];\n for (const file of entry.files) {\n const full = joinPosix(entry.path, file);\n if (!blobByPath.has(full)) missing.push(file);\n }\n if (missing.length > 0) {\n errors.push({\n path: assetRootRelative,\n error: `ManifestFileMissing: ${missing.join(\", \")}`,\n });\n return { asset: null, errors };\n }\n\n // Pick the manifest file (provider's matchesPath wins; filename heuristic fallback).\n const manifestFileRel = pickManifestFileTree(entry, registry);\n const manifestFull = joinPosix(entry.path, manifestFileRel);\n const manifestEntry = blobByPath.get(manifestFull)!;\n\n // Fetch + parse manifest bytes.\n let manifestBytes: Buffer | null;\n try {\n manifestBytes = await fetchAsBuffer(fetchBlob, manifestEntry.sha);\n } catch (err) {\n errors.push({\n path: assetRootRelative,\n error: `ManifestSchemaError: failed to fetch manifest blob: ${err instanceof Error ? err.message : String(err)}`,\n });\n return { asset: null, errors };\n }\n if (!manifestBytes) {\n errors.push({\n path: assetRootRelative,\n error: `ManifestSchemaError: failed to fetch manifest blob`,\n });\n return { asset: null, errors };\n }\n const manifest = parseManifestText(manifestFull, manifestBytes.toString(\"utf-8\"));\n if (!manifest) {\n errors.push({\n path: assetRootRelative,\n error: `ManifestSchemaError: failed to parse manifest file ${manifestFileRel}`,\n });\n return { asset: null, errors };\n }\n\n // Ghost-install on unknown kind.\n if (!registry.getProvider(entry.kind)) {\n errors.push({\n path: assetRootRelative,\n error: `Unknown asset kind \"${entry.kind}\" — ghost-installing without provider validation`,\n });\n }\n\n // Requires syntax.\n const requiresErrors = validateRequiresSyntax(entry.requires);\n if (requiresErrors.length > 0) {\n errors.push({\n path: assetRootRelative,\n error: `ManifestRequiresError: ${requiresErrors.join(\"; \")}`,\n });\n return { asset: null, errors };\n }\n\n // Deterministic hash over the curated file set.\n let computedHash: string;\n try {\n computedHash = await computeManifestHashTree(entry, blobByPath, fetchBlob);\n } catch (err) {\n errors.push({\n path: assetRootRelative,\n error: `Failed to compute hash: ${err instanceof Error ? err.message : String(err)}`,\n });\n return { asset: null, errors };\n }\n\n if (entry.sha256 && entry.sha256 !== computedHash) {\n errors.push({\n path: assetRootRelative,\n error: `ManifestHashMismatch: declared ${entry.sha256}, computed ${computedHash}`,\n });\n return { asset: null, errors };\n }\n\n if (!entry.sha256) {\n errors.push({\n path: assetRootRelative,\n error: `Missing sha256 — computed ${computedHash}. Re-run \\`skaile source build-manifest --write\\` to pin it.`,\n });\n }\n\n const ref = `${entry.publisher}/${entry.name}@${entry.version}`;\n const requires: RequiresEdge[] = entry.requires.map((to) => ({\n from: ref,\n to,\n field: \"assets[].requires\",\n }));\n\n const mergedManifest: Record<string, unknown> = {\n ...(entry.metadata ?? {}),\n ...manifest,\n };\n\n const asset: DiscoveredAsset = {\n ref,\n kind: entry.kind,\n publisher: entry.publisher,\n name: entry.name,\n version: entry.version,\n manifest: mergedManifest,\n manifestPath: manifestFull,\n relativePath: manifestFull,\n fileFilter: {\n assetRoot: entry.path,\n files: [...entry.files].sort(),\n },\n sha256: computedHash,\n requires,\n };\n\n return { asset, errors };\n}\n\nconst MANIFEST_FILENAMES = new Set([\n \"SKILL.md\",\n \"AGENT.md\",\n \"agent.yaml\",\n \"CONNECTOR.md\",\n \"MCP.md\",\n \"CONTRACT.md\",\n \"PERSONA.md\",\n \"RULESET.md\",\n]);\n\nconst MANIFEST_SUFFIXES = [\".flow.yaml\", \".flow.json\", \".prompt.md\", \".preset.yaml\"];\n\nfunction pickManifestFileTree(entry: AssetEntry, registry: IAssetKindRegistry): string {\n const provider = registry.getProvider(entry.kind);\n if (provider) {\n for (const file of entry.files) {\n if (provider.matchesPath(joinPosix(entry.path, file))) return file;\n }\n }\n for (const file of entry.files) {\n const base = file.split(\"/\").pop() ?? file;\n if (MANIFEST_FILENAMES.has(base)) return file;\n if (MANIFEST_SUFFIXES.some((s) => file.endsWith(s))) return file;\n }\n return entry.files[0]!;\n}\n\nasync function computeManifestHashTree(\n entry: AssetEntry,\n blobByPath: Map<string, TreeEntry>,\n fetchBlob: DiscoverAssetsInTreeEntriesOptions[\"fetchBlob\"],\n): Promise<string> {\n const hash = crypto.createHash(\"sha256\");\n const sorted = [...entry.files].sort();\n for (const file of sorted) {\n const full = joinPosix(entry.path, file);\n const blob = blobByPath.get(full);\n if (!blob) continue; // existence already checked, defensive\n hash.update(file);\n hash.update(\"\\0\");\n const bytes = await fetchAsBuffer(fetchBlob, blob.sha);\n if (bytes) hash.update(bytes);\n hash.update(\"\\0\");\n }\n return hash.digest(\"hex\");\n}\n\nfunction validateRequiresSyntax(requires: string[]): string[] {\n const errors: string[] = [];\n const RE = /^@[\\w-]+\\/[\\w.-]+(?:@.+)?$/;\n for (const r of requires) {\n if (!RE.test(r)) errors.push(`invalid requires entry \"${r}\"`);\n }\n return errors;\n}\n","/**\n * Package version string.\n *\n * @docLink packages/discovery/concepts\n */\nexport const VERSION = \"0.0.0\";\n\n// Asset Kind Registry (pluggable kind resolution)\nexport { AssetKindRegistry } from \"./asset-kind-registry.js\";\n\n// Built-in providers\nexport {\n BUILTIN_PROVIDERS,\n skillProvider,\n agentProvider,\n connectorProvider,\n mcpServerProvider,\n contractProvider,\n promptProvider,\n personaProvider,\n rulesetProvider,\n presetProvider,\n} from \"./builtin-providers.js\";\n\n// Source config (.skaile-source.yaml)\nexport {\n SourceConfigSchema,\n SEMVER_RE,\n parseSourceConfig,\n validateSourceConfig,\n loadSourceConfig,\n isManifestMode,\n isExcludedDevPath,\n mergeSourceConfigs,\n loadMergedSourceConfig,\n} from \"./source-config.js\";\n\nexport type {\n SourceConfig,\n SourceConfigV2,\n AssetEntry,\n PublisherOverride,\n SyncConfig,\n ValidationResult,\n ValidationSuccess,\n ValidationFailure,\n MergedSourceConfig,\n} from \"./source-config.js\";\n\n// Requires graph\nexport {\n extractRequires,\n buildRequiresGraph,\n detectCycles,\n} from \"./requires-graph.js\";\n\nexport type { RequiresEdge, RequiresGraph } from \"./requires-graph.js\";\n\n// Discovery orchestrator\nexport {\n discoverAssetsInTree,\n createDefaultRegistry,\n computeDeterministicHash,\n} from \"./discover.js\";\n\nexport type {\n DiscoveredAsset,\n DiscoveryOptions,\n DiscoveryResult,\n} from \"./discover.js\";\n\n// Author-shipped inventory discovery\nexport { discoverFromManifest } from \"./discover-manifest.js\";\n\n// Hash helpers\nexport { computeDeterministicHashDetailed } from \"./hash.js\";\n\n// Discovery over a virtual tree (Octokit Tree entries)\nexport { discoverAssetsInTreeEntries } from \"./tree-entries.js\";\n\nexport type {\n TreeEntry,\n DiscoverAssetsInTreeEntriesOptions,\n} from \"./tree-entries.js\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../discovery/src/asset-kind-registry.ts","../discovery/src/requires-graph.ts","../discovery/src/builtin-providers.ts","../discovery/src/source-config.ts","../discovery/src/hash.ts","../discovery/src/discover-manifest.ts","../discovery/src/discover.ts","../discovery/src/tree-entries.ts","../discovery/src/index.ts"],"names":["path","path2","fs2","path3","fs3","path4","fs4","yaml2","path5","parseManifest","fs5","yaml3","filename","resolvePublisher","deriveName","yaml4","crypto2","validateRequiresSyntax","MANIFEST_FILENAMES","MANIFEST_SUFFIXES"],"mappings":"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","file":"chunk-JN2CUVSU.js","sourcesContent":["/**\n * AssetKindRegistry — concrete implementation of IAssetKindRegistry.\n *\n * Frozen-state machine:\n * - Created in \"open\" state, accepting provider registrations\n * - First read operation (or explicit freeze()) transitions to \"frozen\"\n * - No further registrations after freeze\n *\n * Pattern conflict detection:\n * - On register(), checks that the new provider's discoveryPatterns don't\n * overlap with any existing provider's patterns (exact string match).\n * - At resolveKind() time, checks that only one provider's matchesPath()\n * returns true (runtime safety net).\n *\n * Design decisions A3, A4: locked in Phase 1.7 planning.\n */\n\nimport type {\n IAssetKindProvider,\n IAssetKindRegistry,\n AssetKindFileFilter,\n AssetKindRequiresEdge,\n} from \"@skaile/workspaces/plugins\";\nimport {\n AssetKindConflictError,\n AssetKindPatternConflictError,\n AssetKindPathAmbiguityError,\n AssetKindRegistryFrozenError,\n} from \"@skaile/workspaces/plugins\";\nimport type { ManifestValidationResult } from \"@skaile/workspaces/types/manifests\";\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\nexport class AssetKindRegistry implements IAssetKindRegistry {\n private providers = new Map<string, IAssetKindProvider>();\n private patternOwnership = new Map<string, string>(); // pattern -> kind\n private _frozen = false;\n\n get frozen(): boolean {\n return this._frozen;\n }\n\n // -------------------------------------------------------------------------\n // Registration (open state only)\n // -------------------------------------------------------------------------\n\n register(provider: IAssetKindProvider): void {\n if (this._frozen) {\n throw new AssetKindRegistryFrozenError();\n }\n\n // A4: kind conflict\n if (this.providers.has(provider.kind)) {\n throw new AssetKindConflictError(provider.kind);\n }\n\n // A4: pattern conflict — check each discovery pattern against all registered\n for (const pattern of provider.discoveryPatterns) {\n const existingOwner = this.patternOwnership.get(pattern);\n if (existingOwner) {\n throw new AssetKindPatternConflictError(provider.kind, existingOwner, pattern);\n }\n }\n\n // Commit registration\n this.providers.set(provider.kind, provider);\n for (const pattern of provider.discoveryPatterns) {\n this.patternOwnership.set(pattern, provider.kind);\n }\n }\n\n // -------------------------------------------------------------------------\n // Freeze\n // -------------------------------------------------------------------------\n\n freeze(): void {\n this._frozen = true;\n }\n\n // -------------------------------------------------------------------------\n // Read operations (auto-freeze)\n // -------------------------------------------------------------------------\n\n getProvider(kind: string): IAssetKindProvider | undefined {\n this.autoFreeze();\n return this.providers.get(kind);\n }\n\n getAllProviders(): IAssetKindProvider[] {\n this.autoFreeze();\n return [...this.providers.values()];\n }\n\n getAllKinds(): string[] {\n this.autoFreeze();\n return [...this.providers.keys()];\n }\n\n resolveKind(relativePath: string): string | undefined {\n this.autoFreeze();\n\n const matches: string[] = [];\n for (const provider of this.providers.values()) {\n if (provider.matchesPath(relativePath)) {\n matches.push(provider.kind);\n }\n }\n\n if (matches.length === 0) return undefined;\n if (matches.length === 1) return matches[0];\n\n // A4: multiple providers claim the same path — hard error\n throw new AssetKindPathAmbiguityError(relativePath, matches);\n }\n\n // -------------------------------------------------------------------------\n // Convenience delegates\n // -------------------------------------------------------------------------\n\n validateManifest(kind: string, data: unknown): ManifestValidationResult<unknown> {\n this.autoFreeze();\n const provider = this.providers.get(kind);\n if (!provider) {\n return {\n ok: false,\n errors: [\n {\n path: \"kind\",\n message: `No provider registered for kind \"${kind}\"`,\n },\n ],\n };\n }\n return provider.validateManifest(data);\n }\n\n defaultFileFilter(kind: string, manifestPath: string): AssetKindFileFilter | undefined {\n this.autoFreeze();\n const provider = this.providers.get(kind);\n if (!provider) return undefined;\n return provider.defaultFileFilter(manifestPath);\n }\n\n extractRequires(\n kind: string,\n assetRef: string,\n manifest: Record<string, unknown>,\n ): AssetKindRequiresEdge[] {\n this.autoFreeze();\n const provider = this.providers.get(kind);\n if (!provider?.extractRequires) return [];\n return provider.extractRequires(assetRef, manifest);\n }\n\n // -------------------------------------------------------------------------\n // Internal\n // -------------------------------------------------------------------------\n\n private autoFreeze(): void {\n if (!this._frozen) {\n this._frozen = true;\n }\n }\n}\n","/**\n * Requires-graph extraction and cycle detection.\n *\n * Extracts cross-asset dependency edges from typed manifest fields:\n * - agent: skills[], composes[].ref, extends\n * - flow: nodes[].skill\n * - preset: items[].ref, items[].composes[].ref\n * - skill: metadata.artifacts.requires[].id\n *\n * Cycle detection uses Kahn's algorithm (topological sort).\n */\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * A directed dependency edge from one asset ref to another, annotated with the manifest\n * field that declared the dependency.\n *\n * @docLink packages/discovery/concepts#requires-edge\n */\nexport interface RequiresEdge {\n /** Asset ref of the requiring asset. */\n from: string;\n /** Asset ref of the required asset. */\n to: string;\n /** Manifest field that produced this edge. */\n field: string;\n}\n\n/**\n * The complete requires graph for a discovered asset tree: all dependency edges plus\n * the result of cycle detection.\n *\n * @docLink packages/discovery/concepts#requires-graph\n */\nexport interface RequiresGraph {\n edges: RequiresEdge[];\n /** True if the graph contains no cycles. */\n acyclic: boolean;\n /** If cycles exist, one example cycle path. */\n cyclePath?: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Extract requires edges from a single asset's manifest.\n *\n * @param assetRef - The canonical ref of the asset being examined (the `from` side)\n * @param kind - Asset kind, used to select the correct manifest field extractor\n * @param manifest - Parsed manifest object\n * @returns Array of {@link RequiresEdge} declared by this asset\n * @docLink packages/discovery/concepts#extract-requires\n */\nexport function extractRequires(\n assetRef: string,\n kind: string,\n manifest: Record<string, unknown>,\n): RequiresEdge[] {\n const edges: RequiresEdge[] = [];\n\n switch (kind) {\n case \"agent\":\n extractAgentRequires(assetRef, manifest, edges);\n break;\n case \"flow\":\n extractFlowRequires(assetRef, manifest, edges);\n break;\n case \"preset\":\n extractPresetRequires(assetRef, manifest, edges);\n break;\n case \"skill\":\n extractSkillRequires(assetRef, manifest, edges);\n break;\n // connector, mount, prompt, mcp-server, contract, knowledge, persona, ruleset:\n // no cross-asset requires in their manifest schemas.\n }\n\n return edges;\n}\n\n/**\n * Build a complete {@link RequiresGraph} from multiple assets' edges by running cycle detection.\n *\n * @param allEdges - All {@link RequiresEdge} values collected across all assets in the tree\n * @returns A {@link RequiresGraph} with `acyclic` status and optional `cyclePath`\n * @docLink packages/discovery/concepts#build-requires-graph\n */\nexport function buildRequiresGraph(allEdges: RequiresEdge[]): RequiresGraph {\n const { acyclic, cyclePath } = detectCycles(allEdges);\n return { edges: allEdges, acyclic, cyclePath };\n}\n\n/**\n * Detect cycles in a set of requires edges using Kahn's topological sort algorithm.\n *\n * If a cycle is found, DFS is used to recover one example cycle path for diagnostics.\n *\n * @param edges - Directed dependency edges to analyse\n * @returns `{ acyclic: true }` if the graph is a DAG, or `{ acyclic: false, cyclePath }` otherwise\n * @docLink packages/discovery/concepts#detect-cycles\n */\nexport function detectCycles(edges: RequiresEdge[]): { acyclic: boolean; cyclePath?: string[] } {\n if (edges.length === 0) return { acyclic: true };\n\n // Build adjacency + in-degree\n const nodes = new Set<string>();\n const adj = new Map<string, Set<string>>();\n const inDegree = new Map<string, number>();\n\n for (const e of edges) {\n nodes.add(e.from);\n nodes.add(e.to);\n if (!adj.has(e.from)) adj.set(e.from, new Set());\n adj.get(e.from)!.add(e.to);\n inDegree.set(e.to, (inDegree.get(e.to) ?? 0) + 1);\n if (!inDegree.has(e.from)) inDegree.set(e.from, 0);\n }\n\n // Kahn's algorithm\n const queue: string[] = [];\n for (const node of nodes) {\n if ((inDegree.get(node) ?? 0) === 0) queue.push(node);\n }\n\n const sorted: string[] = [];\n while (queue.length > 0) {\n const n = queue.shift()!;\n sorted.push(n);\n for (const neighbor of adj.get(n) ?? []) {\n const deg = inDegree.get(neighbor)! - 1;\n inDegree.set(neighbor, deg);\n if (deg === 0) queue.push(neighbor);\n }\n }\n\n if (sorted.length === nodes.size) {\n return { acyclic: true };\n }\n\n // Find one cycle path via DFS among remaining nodes\n const remaining = new Set([...nodes].filter((n) => !sorted.includes(n)));\n const cyclePath = findCyclePath(remaining, adj);\n return { acyclic: false, cyclePath };\n}\n\n// ---------------------------------------------------------------------------\n// Per-kind extractors\n// ---------------------------------------------------------------------------\n\nfunction extractAgentRequires(\n ref: string,\n m: Record<string, unknown>,\n edges: RequiresEdge[],\n): void {\n // skills: string[]\n if (Array.isArray(m.skills)) {\n for (const s of m.skills) {\n if (typeof s === \"string\") edges.push({ from: ref, to: s, field: \"skills\" });\n }\n }\n // composes: { ref: string, ... }[]\n if (Array.isArray(m.composes)) {\n for (const c of m.composes) {\n if (isObjectWithStringField(c, \"ref\")) {\n edges.push({ from: ref, to: (c as Record<string, string>).ref!, field: \"composes\" });\n }\n }\n }\n // extends: string\n if (typeof m.extends === \"string\") {\n edges.push({ from: ref, to: m.extends, field: \"extends\" });\n }\n}\n\nfunction extractFlowRequires(ref: string, m: Record<string, unknown>, edges: RequiresEdge[]): void {\n if (!Array.isArray(m.nodes)) return;\n for (const node of m.nodes) {\n if (isObjectWithStringField(node, \"skill\")) {\n edges.push({\n from: ref,\n to: (node as Record<string, string>).skill!,\n field: \"nodes[].skill\",\n });\n }\n }\n}\n\nfunction extractPresetRequires(\n ref: string,\n m: Record<string, unknown>,\n edges: RequiresEdge[],\n): void {\n if (!Array.isArray(m.items)) return;\n for (const item of m.items) {\n if (typeof item !== \"object\" || item === null) continue;\n const i = item as Record<string, unknown>;\n\n // items[].ref — skip library:// refs (those reference existing instances, not assets)\n if (typeof i.ref === \"string\" && !i.ref.startsWith(\"library://\")) {\n edges.push({ from: ref, to: i.ref, field: \"items[].ref\" });\n }\n\n // items[].composes[].ref — skip # (cross-item) and library:// refs\n if (Array.isArray(i.composes)) {\n for (const c of i.composes) {\n if (!isObjectWithStringField(c, \"ref\")) continue;\n const cRef = (c as Record<string, string>).ref!;\n if (!cRef.startsWith(\"#\") && !cRef.startsWith(\"library://\")) {\n edges.push({ from: ref, to: cRef, field: \"items[].composes[].ref\" });\n }\n }\n }\n }\n}\n\nfunction extractSkillRequires(\n ref: string,\n m: Record<string, unknown>,\n edges: RequiresEdge[],\n): void {\n const metadata = m.metadata as Record<string, unknown> | undefined;\n if (!metadata) return;\n const artifacts = metadata.artifacts as Record<string, unknown> | undefined;\n if (!artifacts) return;\n if (!Array.isArray(artifacts.requires)) return;\n for (const r of artifacts.requires) {\n if (isObjectWithStringField(r, \"id\")) {\n edges.push({\n from: ref,\n to: (r as Record<string, string>).id!,\n field: \"metadata.artifacts.requires\",\n });\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Cycle finder (DFS)\n// ---------------------------------------------------------------------------\n\nfunction findCyclePath(nodes: Set<string>, adj: Map<string, Set<string>>): string[] {\n const visited = new Set<string>();\n const stack = new Set<string>();\n const path: string[] = [];\n\n for (const start of nodes) {\n if (visited.has(start)) continue;\n const cycle = dfs(start, adj, visited, stack, path, nodes);\n if (cycle) return cycle;\n }\n\n return [...nodes]; // fallback: return all remaining nodes\n}\n\nfunction dfs(\n node: string,\n adj: Map<string, Set<string>>,\n visited: Set<string>,\n stack: Set<string>,\n path: string[],\n scope: Set<string>,\n): string[] | null {\n visited.add(node);\n stack.add(node);\n path.push(node);\n\n for (const neighbor of adj.get(node) ?? []) {\n if (!scope.has(neighbor)) continue;\n if (stack.has(neighbor)) {\n // Found cycle — extract the cycle portion\n const cycleStart = path.indexOf(neighbor);\n return [...path.slice(cycleStart), neighbor];\n }\n if (!visited.has(neighbor)) {\n const result = dfs(neighbor, adj, visited, stack, path, scope);\n if (result) return result;\n }\n }\n\n stack.delete(node);\n path.pop();\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Utility\n// ---------------------------------------------------------------------------\n\nfunction isObjectWithStringField(val: unknown, field: string): boolean {\n return (\n typeof val === \"object\" &&\n val !== null &&\n field in val &&\n typeof (val as Record<string, unknown>)[field] === \"string\"\n );\n}\n","/**\n * Built-in IAssetKindProvider implementations: 8 core kinds + preset (9 total).\n * Flow + knowledge moved to their owning runtime packages in 1.7.3/1.7.4.\n * The standalone `mount` provider was removed in the connectors-unification\n * hard cut — mountable resources are now `connector` assets (CONNECTOR.md).\n *\n * Core kinds: skill, agent, connector, mcp-server, contract,\n * prompt, persona, ruleset\n *\n * Each provider is self-contained: discovery patterns, path matching,\n * manifest validation, file filtering, and requires extraction are all\n * owned by the provider. This is the post-Phase-1.7 architecture where\n * IAssetKindRegistry is the single source of truth for kind-aware logic.\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { IAssetKindProvider, AssetKindFileFilter } from \"@skaile/workspaces/plugins\";\nimport type { ManifestValidationResult } from \"@skaile/workspaces/types/manifests\";\nimport {\n validateSkill,\n validateAgent,\n validateConnector,\n validateContract,\n validatePrompt,\n validateMcpServer,\n validatePersona,\n validateRuleset,\n validatePreset,\n} from \"@skaile/workspaces/types/manifests\";\n\nimport { extractRequires as extractRequiresFromManifest } from \"./requires-graph.js\";\n\n// ---------------------------------------------------------------------------\n// Helper: path matching from filename\n// ---------------------------------------------------------------------------\n\nfunction matchesSuffix(relativePath: string, suffix: string): boolean {\n return relativePath.endsWith(suffix);\n}\n\nfunction matchesFilename(relativePath: string, filename: string): boolean {\n const parts = relativePath.split(\"/\");\n return parts[parts.length - 1] === filename;\n}\n\n// ---------------------------------------------------------------------------\n// File filter helpers (per-kind default file filters)\n// ---------------------------------------------------------------------------\n\n/**\n * Recursively collect all files under a subdirectory.\n * Uses path.posix.join for relative paths so SHA256 hashes are consistent\n * across platforms (Linux/macOS/Windows).\n */\nfunction collectDirRecursive(baseDir: string, relativeDir: string): string[] {\n const full = path.join(baseDir, relativeDir);\n if (!fs.existsSync(full) || !fs.statSync(full).isDirectory()) return [];\n const results: string[] = [];\n for (const entry of fs.readdirSync(full, { withFileTypes: true })) {\n const rel = path.posix.join(relativeDir, entry.name);\n if (entry.isDirectory()) {\n results.push(...collectDirRecursive(baseDir, rel));\n } else if (entry.isFile()) {\n results.push(rel);\n }\n }\n return results;\n}\n\n/**\n * Manifest-only filter — for simple kinds that include only the manifest file.\n */\nfunction manifestOnlyFilter(manifestPath: string): AssetKindFileFilter {\n return {\n assetRoot: path.dirname(manifestPath),\n files: [path.basename(manifestPath)],\n };\n}\n\n/**\n * skill: SKILL.md + same-dir leaves (validator.py, CLI.md) + references/ + nested * /SKILL.md\n */\nfunction skillFilter(manifestPath: string): AssetKindFileFilter {\n const dir = path.dirname(manifestPath);\n const manifestName = path.basename(manifestPath);\n const files = [manifestName];\n\n // Same-dir leaves (from spec \"Per-type file filter defaults\" table).\n for (const leaf of [\"validator.py\", \"CLI.md\"]) {\n if (fs.existsSync(path.join(dir, leaf))) files.push(leaf);\n }\n\n // references/ subdirectory\n files.push(...collectDirRecursive(dir, \"references\"));\n\n // Nested sub-skill directories (*/SKILL.md)\n try {\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n if (entry.isDirectory() && entry.name !== \"references\") {\n if (fs.existsSync(path.join(dir, entry.name, \"SKILL.md\"))) {\n files.push(...collectDirRecursive(dir, entry.name));\n }\n }\n }\n } catch {\n /* empty */\n }\n\n files.sort();\n return { assetRoot: dir, files };\n}\n\n/**\n * agent: agent.yaml or AGENT.md + same-dir SOUL.md, RULES.md + knowledge/\n */\nfunction agentFilter(manifestPath: string): AssetKindFileFilter {\n const dir = path.dirname(manifestPath);\n const manifestName = path.basename(manifestPath);\n const files = [manifestName];\n\n for (const companion of [\"SOUL.md\", \"RULES.md\"]) {\n if (fs.existsSync(path.join(dir, companion))) files.push(companion);\n }\n\n files.push(...collectDirRecursive(dir, \"knowledge\"));\n\n files.sort();\n return { assetRoot: dir, files };\n}\n\n/**\n * contract: CONTRACT.md + same-dir attachments (all non-directory entries)\n */\nfunction contractFilter(manifestPath: string): AssetKindFileFilter {\n const dir = path.dirname(manifestPath);\n const manifestName = path.basename(manifestPath);\n const files = [manifestName];\n try {\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n if (entry.isFile() && entry.name !== manifestName) {\n files.push(entry.name);\n }\n }\n } catch {\n /* empty */\n }\n files.sort();\n return { assetRoot: dir, files };\n}\n\n/**\n * connector: CONNECTOR.md + entry file (adapter.ts by default)\n */\nfunction connectorFilter(manifestPath: string): AssetKindFileFilter {\n const dir = path.dirname(manifestPath);\n const manifestName = path.basename(manifestPath);\n const files = [manifestName];\n if (fs.existsSync(path.join(dir, \"adapter.ts\"))) files.push(\"adapter.ts\");\n files.sort();\n return { assetRoot: dir, files };\n}\n\n// ---------------------------------------------------------------------------\n// Provider factory\n// ---------------------------------------------------------------------------\n\nfunction makeProvider(config: {\n kind: string;\n displayName: string;\n providerVersion: string;\n discoveryPatterns: string[];\n matchesPath: (relativePath: string) => boolean;\n validate: (data: unknown) => ManifestValidationResult<unknown>;\n fileFilter: (manifestPath: string) => AssetKindFileFilter;\n hasExtractRequires?: boolean;\n}): IAssetKindProvider {\n return {\n kind: config.kind,\n displayName: config.displayName,\n providerVersion: config.providerVersion,\n discoveryPatterns: config.discoveryPatterns,\n matchesPath: config.matchesPath,\n validateManifest: config.validate,\n defaultFileFilter: config.fileFilter,\n ...(config.hasExtractRequires !== false && {\n extractRequires: (assetRef: string, manifest: Record<string, unknown>) =>\n extractRequiresFromManifest(assetRef, config.kind, manifest),\n }),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Core kind providers (8)\n// ---------------------------------------------------------------------------\n\nexport const skillProvider: IAssetKindProvider = makeProvider({\n kind: \"skill\",\n displayName: \"Skill\",\n providerVersion: \"1.0.0\",\n discoveryPatterns: [\"**/SKILL.md\"],\n matchesPath: (p) => matchesFilename(p, \"SKILL.md\"),\n validate: validateSkill,\n fileFilter: skillFilter,\n hasExtractRequires: true,\n});\n\nexport const agentProvider: IAssetKindProvider = makeProvider({\n kind: \"agent\",\n displayName: \"Agent\",\n providerVersion: \"1.0.0\",\n discoveryPatterns: [\"**/agent.yaml\", \"**/AGENT.md\"],\n matchesPath: (p) => matchesFilename(p, \"agent.yaml\") || matchesFilename(p, \"AGENT.md\"),\n validate: validateAgent,\n fileFilter: agentFilter,\n hasExtractRequires: true,\n});\n\nexport const connectorProvider: IAssetKindProvider = makeProvider({\n kind: \"connector\",\n displayName: \"Connector\",\n providerVersion: \"1.0.0\",\n discoveryPatterns: [\"**/CONNECTOR.md\"],\n matchesPath: (p) => matchesFilename(p, \"CONNECTOR.md\"),\n validate: validateConnector,\n fileFilter: connectorFilter,\n hasExtractRequires: false,\n});\n\nexport const mcpServerProvider: IAssetKindProvider = makeProvider({\n kind: \"mcp-server\",\n displayName: \"MCP Server\",\n providerVersion: \"1.0.0\",\n discoveryPatterns: [\"**/MCP.md\"],\n matchesPath: (p) => matchesFilename(p, \"MCP.md\"),\n validate: validateMcpServer,\n fileFilter: manifestOnlyFilter,\n hasExtractRequires: false,\n});\n\nexport const contractProvider: IAssetKindProvider = makeProvider({\n kind: \"contract\",\n displayName: \"Contract\",\n providerVersion: \"1.0.0\",\n discoveryPatterns: [\"**/CONTRACT.md\"],\n matchesPath: (p) => matchesFilename(p, \"CONTRACT.md\"),\n validate: validateContract,\n fileFilter: contractFilter,\n hasExtractRequires: false,\n});\n\nexport const promptProvider: IAssetKindProvider = makeProvider({\n kind: \"prompt\",\n displayName: \"Prompt\",\n providerVersion: \"1.0.0\",\n discoveryPatterns: [\"**/*.prompt.md\"],\n matchesPath: (p) => matchesSuffix(p, \".prompt.md\"),\n validate: validatePrompt,\n fileFilter: manifestOnlyFilter,\n hasExtractRequires: false,\n});\n\n/**\n * Persona and Ruleset providers have no FS discovery patterns — they are\n * sourced inline by the agent kind's resolver, not discovered as standalone\n * assets in a source tree. They remain registered as core kinds so the\n * registry recognizes them and can validate their manifests.\n */\nexport const personaProvider: IAssetKindProvider = {\n kind: \"persona\",\n displayName: \"Persona\",\n providerVersion: \"1.0.0\",\n discoveryPatterns: [],\n matchesPath: () => false,\n validateManifest: validatePersona,\n defaultFileFilter: manifestOnlyFilter,\n};\n\nexport const rulesetProvider: IAssetKindProvider = {\n kind: \"ruleset\",\n displayName: \"Ruleset\",\n providerVersion: \"1.0.0\",\n discoveryPatterns: [],\n matchesPath: () => false,\n validateManifest: validateRuleset,\n defaultFileFilter: manifestOnlyFilter,\n};\n\n// ---------------------------------------------------------------------------\n// Extension kind providers\n// NOTE: flow lives in @skaile/workspaces/base-assets/connectors/flow/engine (flowKindProvider).\n// knowledge lives in @skaile/library (knowledgeKindProvider).\n// Both are registered by CLI at bootstrap, not included in BUILTIN_PROVIDERS.\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Preset provider (composition entity — discoverable but not in AssetKind enum)\n// ---------------------------------------------------------------------------\n\nexport const presetProvider: IAssetKindProvider = makeProvider({\n kind: \"preset\",\n displayName: \"Preset\",\n providerVersion: \"1.0.0\",\n discoveryPatterns: [\"**/*.preset.yaml\"],\n matchesPath: (p) => matchesSuffix(p, \".preset.yaml\"),\n validate: validatePreset,\n fileFilter: manifestOnlyFilter,\n hasExtractRequires: true,\n});\n\n// ---------------------------------------------------------------------------\n// All built-in providers\n// ---------------------------------------------------------------------------\n\n/**\n * Built-in providers shipped with @skaile/discovery.\n *\n * 8 core kinds + preset. Extension kinds (flow, knowledge) moved to their\n * owning packages and are registered by the CLI at bootstrap.\n */\nexport const BUILTIN_PROVIDERS: IAssetKindProvider[] = [\n // 8 core kinds\n skillProvider,\n agentProvider,\n connectorProvider,\n mcpServerProvider,\n contractProvider,\n promptProvider,\n personaProvider,\n rulesetProvider,\n // Composition entity (discoverable, not in AssetKind enum)\n presetProvider,\n];\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as z from \"zod\";\nimport * as yaml from \"js-yaml\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/**\n * Semver regex matching `MAJOR.MINOR.PATCH` with optional `-<prerelease>` and\n * `+<build>` segments. Author-shipped inventory entries must declare a version\n * that matches this regex.\n *\n * @docLink packages/discovery/concepts#author-manifest-semver\n */\nexport const SEMVER_RE = /^\\d+\\.\\d+\\.\\d+(?:-[a-zA-Z0-9.-]+)?(?:\\+[a-zA-Z0-9.-]+)?$/;\n\n// ---------------------------------------------------------------------------\n// Schema\n// ---------------------------------------------------------------------------\n\nconst PublisherOverrideSchema = z.object({\n /** Relative path within the repo (trailing slash convention). */\n path: z.string().min(1),\n /** Publisher namespace override for assets under this path. */\n publisher: z\n .string()\n .regex(/^@[\\w-]+$/, \"Publisher must start with @ and contain only word chars / hyphens\"),\n});\n\nconst SyncConfigSchema = z\n .object({\n /** How the catalog backend learns about repo changes. */\n trigger: z.enum([\"webhook\", \"poll\"]).default(\"webhook\"),\n /** Seconds between polls. Required when trigger=poll. */\n poll_interval: z.number().int().positive().optional(),\n })\n .refine((data) => data.trigger !== \"poll\" || data.poll_interval !== undefined, {\n message: \"poll_interval is required when trigger is poll\",\n path: [\"poll_interval\"],\n });\n\n/**\n * Single entry in the author-shipped inventory (the `assets:` block of a\n * `.skaile-source.yaml` with `version: 2`).\n *\n * When the `assets:` block is present, discovery uses these entries as the\n * source of truth (`discoverFromManifest`) instead of running glob walk +\n * publisher resolution.\n *\n * @docLink packages/discovery/concepts#author-manifest-asset-entry\n */\nconst AssetEntrySchema = z.object({\n /** Relative path within the repo (directory or file). */\n path: z.string().min(1),\n /** Asset kind — validated against `IAssetKindRegistry` at discovery time. */\n kind: z.string().min(1),\n /** Publisher namespace. Required per entry; overrides publisher_default / _overrides. */\n publisher: z\n .string()\n .regex(/^@[\\w-]+$/, \"Publisher must start with @ and contain only word chars / hyphens\"),\n /** Asset name. Identity tuple is `<publisher>/<name>@<version>`. */\n name: z.string().min(1),\n /** Semver version string. */\n version: z.string().regex(SEMVER_RE, \"Version must be semver MAJOR.MINOR.PATCH\"),\n /**\n * Hex-encoded SHA256 hash of the deterministic tarball contents.\n * Optional on write, REQUIRED on Catalog publish (Phase 4).\n */\n sha256: z\n .string()\n .regex(/^[a-f0-9]{64}$/, \"sha256 must be 64-character hex\")\n .optional(),\n /** Curated file filter (paths relative to `path:`). At least one entry. */\n files: z.array(z.string().min(1)).min(1),\n /** Author-declared requires-graph entries. */\n requires: z.array(z.string().min(1)).default([]),\n /** Optional passthrough to `AssetDefinition.manifest`. */\n metadata: z.record(z.string(), z.unknown()).optional(),\n});\n\n/**\n * Root schema for `.skaile-source.yaml`.\n *\n * Declares how a repo maps to Catalog publisher namespaces.\n * Template variable `<domain>` in publisher_default is replaced at discovery\n * time with the first-level directory name containing the asset.\n *\n * Schema version `1` is the original glob-discovery surface. Version `2`\n * extends the schema with an optional `assets:` block — when present,\n * discovery uses the author-shipped inventory as authoritative and skips\n * glob walk + publisher resolution + AI enrichment.\n *\n * @docLink packages/discovery/concepts#source-config-schema\n */\nexport const SourceConfigSchema = z\n .object({\n /** Schema version. `1` (glob mode) or `2` (allows `assets:` block). */\n version: z.union([z.literal(1), z.literal(2)]),\n\n /**\n * Default publisher namespace template.\n * Use `@<domain>` to derive from first-level directory name.\n * Use a literal like `@skaile` if the entire repo maps to one publisher.\n */\n publisher_default: z\n .string()\n .min(1)\n .refine((v) => v.startsWith(\"@\"), \"publisher_default must start with @\"),\n\n /** Default git ref for version resolution. */\n default_ref: z.string().min(1).default(\"main\"),\n\n /** Per-path publisher overrides. Evaluated in order; first match wins. */\n publisher_overrides: z.array(PublisherOverrideSchema).default([]),\n\n /**\n * Repo-relative path prefixes holding assets meant only for developing the\n * project itself (e.g. `ai-assets-dev/`). Excluded from a normal discovery\n * run; re-included only when discovery is invoked with `includeDev` (the\n * `--dev` flag on `skaile source sync` / `source add`). Conventionally a\n * single top-level folder. See `docs/discovery/dev-assets.md`.\n */\n dev_paths: z.array(z.string().min(1)).default([]),\n\n /** Optional sync configuration for the catalog backend. */\n sync: SyncConfigSchema.optional(),\n\n /**\n * Optional author-shipped asset inventory. When present, discovery uses\n * these entries verbatim and skips glob walk + AI enrichment.\n *\n * Requires `version: 2`.\n */\n assets: z.array(AssetEntrySchema).optional(),\n })\n .refine((data) => !(data.assets && data.version !== 2), {\n message: \"`assets:` block requires version 2\",\n path: [\"version\"],\n });\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * Validated configuration derived from `.skaile-source.yaml`.\n *\n * @docLink packages/discovery/concepts#source-config\n */\nexport type SourceConfig = z.infer<typeof SourceConfigSchema>;\n\n/**\n * A `SourceConfig` known to be `version: 2` with the `assets:` block populated.\n * Returned from {@link isManifestMode} after a successful narrow.\n *\n * @docLink packages/discovery/concepts#source-config-v2\n */\nexport type SourceConfigV2 = SourceConfig & { version: 2; assets: AssetEntry[] };\n\n/**\n * A single entry in the author-shipped inventory.\n *\n * @docLink packages/discovery/concepts#author-manifest-asset-entry\n */\nexport type AssetEntry = z.infer<typeof AssetEntrySchema>;\n\n/**\n * A single per-path publisher namespace override entry.\n *\n * The first matching override (by path prefix) wins during publisher resolution.\n *\n * @docLink packages/discovery/concepts#publisher-override\n */\nexport type PublisherOverride = z.infer<typeof PublisherOverrideSchema>;\n\n/**\n * Sync configuration that controls how the catalog backend learns about repo changes.\n *\n * @docLink packages/discovery/concepts#sync-config\n */\nexport type SyncConfig = z.infer<typeof SyncConfigSchema>;\n\n// ---------------------------------------------------------------------------\n// Parser / Validator\n// ---------------------------------------------------------------------------\n\n/**\n * Successful result from {@link validateSourceConfig} or {@link loadSourceConfig}.\n *\n * `warnings` lists non-fatal anomalies (e.g. `assets:` present alongside\n * `publisher_overrides:` — the latter is ignored in manifest mode).\n *\n * @docLink packages/discovery/concepts#validation-success\n */\nexport interface ValidationSuccess {\n ok: true;\n config: SourceConfig;\n warnings?: string[];\n}\n\n/**\n * Failed result from {@link validateSourceConfig} or {@link loadSourceConfig},\n * carrying a list of per-field validation errors.\n *\n * @docLink packages/discovery/concepts#validation-failure\n */\nexport interface ValidationFailure {\n ok: false;\n errors: Array<{ path: string; message: string }>;\n}\n\n/**\n * Discriminated union returned by {@link validateSourceConfig} and {@link loadSourceConfig}.\n *\n * Use `result.ok` to narrow to {@link ValidationSuccess} or {@link ValidationFailure}.\n *\n * @docLink packages/discovery/concepts#validation-result\n */\nexport type ValidationResult = ValidationSuccess | ValidationFailure;\n\n/**\n * Parse raw YAML text into a plain object.\n *\n * Throws if the YAML is syntactically invalid. Pass the result to\n * {@link validateSourceConfig} to apply schema validation.\n *\n * @param yamlText - Raw YAML content of the `.skaile-source.yaml` file\n * @returns The parsed object (unvalidated)\n * @docLink packages/discovery/concepts#parse-source-config\n */\nexport function parseSourceConfig(yamlText: string): unknown {\n return yaml.load(yamlText);\n}\n\n/**\n * Validate a parsed object against the {@link SourceConfigSchema}.\n *\n * @param parsed - Plain object produced by {@link parseSourceConfig} or any other YAML parser\n * @returns A {@link ValidationSuccess} with the typed config, or a {@link ValidationFailure} with field errors\n * @docLink packages/discovery/concepts#validate-source-config\n */\nexport function validateSourceConfig(parsed: unknown): ValidationResult {\n const result = SourceConfigSchema.safeParse(parsed);\n if (result.success) {\n const warnings = collectWarnings(result.data);\n return warnings.length > 0\n ? { ok: true, config: result.data, warnings }\n : { ok: true, config: result.data };\n }\n return {\n ok: false,\n errors: result.error.issues.map((issue) => ({\n path: issue.path.join(\".\"),\n message: issue.message,\n })),\n };\n}\n\n/**\n * Convenience wrapper that parses YAML and validates in a single call.\n *\n * Equivalent to calling {@link parseSourceConfig} followed by {@link validateSourceConfig}.\n *\n * @param yamlText - Raw YAML content of the `.skaile-source.yaml` file\n * @returns A {@link ValidationResult} (success or failure)\n * @docLink packages/discovery/concepts#load-source-config\n */\nexport function loadSourceConfig(yamlText: string): ValidationResult {\n const parsed = parseSourceConfig(yamlText);\n return validateSourceConfig(parsed);\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Narrow a {@link SourceConfig} to {@link SourceConfigV2} when it carries an\n * author-shipped inventory.\n *\n * @param config - Validated source config\n * @returns `true` when `version === 2` and `assets:` is present (and non-empty\n * array — empty arrays still trigger manifest mode and yield an empty\n * discovery result, which matches an empty repo).\n * @docLink packages/discovery/concepts#is-manifest-mode\n */\nexport function isManifestMode(config: SourceConfig): config is SourceConfigV2 {\n return config.version === 2 && Array.isArray(config.assets);\n}\n\n/**\n * Test whether a repo-relative path falls under one of the configured\n * `dev_paths` prefixes.\n *\n * Matching is whole-segment: a `dev_paths` entry of `ai-assets-dev` matches\n * `ai-assets-dev` itself and anything under `ai-assets-dev/…`, but not a\n * sibling like `ai-assets-development`. Trailing slashes on either side are\n * normalized away.\n *\n * @param relativePath - Path relative to the source root (POSIX separators)\n * @param devPaths - The `dev_paths` list from a {@link SourceConfig}\n * @returns `true` when discovery should exclude the path in a normal run\n * @docLink packages/discovery/concepts#dev-paths\n */\nexport function isExcludedDevPath(relativePath: string, devPaths: readonly string[]): boolean {\n if (devPaths.length === 0) return false;\n const rel = relativePath.replace(/^\\.\\//, \"\").replace(/\\/+$/, \"\");\n for (const raw of devPaths) {\n const dp = raw.replace(/^\\.\\//, \"\").replace(/\\/+$/, \"\");\n if (dp.length === 0) continue;\n if (rel === dp || rel.startsWith(`${dp}/`)) return true;\n }\n return false;\n}\n\nfunction collectWarnings(config: SourceConfig): string[] {\n const warnings: string[] = [];\n if (Array.isArray(config.assets) && config.publisher_overrides.length > 0) {\n warnings.push(\n \"`assets:` block is present; `publisher_overrides:` will be ignored in manifest mode.\",\n );\n }\n return warnings;\n}\n\n// ---------------------------------------------------------------------------\n// Sidecar overlay (PR-3)\n// ---------------------------------------------------------------------------\n\n/**\n * A {@link SourceConfig} produced by merging a base in-repo config with a\n * local sidecar overlay. Always shaped like a regular `SourceConfig` —\n * downstream consumers treat it identically.\n *\n * @docLink packages/discovery/concepts#merged-source-config\n */\nexport type MergedSourceConfig = SourceConfig;\n\n/**\n * Merge a base in-repo `.skaile-source.yaml` config with a local sidecar\n * overlay.\n *\n * Merge rules (per PR-3 §D.3):\n *\n * | Field | Resolution |\n * |-----------------------|-----------------------------------------------------|\n * | `version` | sidecar wins (sidecar is always v2) |\n * | `publisher_default` | sidecar wins if set, else base |\n * | `publisher_overrides` | sidecar wins if non-empty, else base |\n * | `default_ref` | sidecar wins if set, else base |\n * | `sync` | sidecar wins if set, else base |\n * | `assets:` | sidecar fully **replaces** base (no partial merge) |\n *\n * Pure function — no I/O. Callers responsible for loading both configs.\n *\n * @param base - The in-repo source config (or `undefined` if absent)\n * @param overlay - The sidecar source config (or `undefined` for identity)\n * @returns The merged config, or `undefined` if both inputs are missing\n * @docLink packages/discovery/concepts#merge-source-configs\n */\nexport function mergeSourceConfigs(\n base: SourceConfig | undefined,\n overlay: SourceConfig | undefined,\n): MergedSourceConfig | undefined {\n if (!base && !overlay) return undefined;\n if (!overlay) return base;\n if (!base) return overlay;\n\n // Start from base, layer overlay fields per rules above.\n const merged: SourceConfig = { ...base };\n\n // version: sidecar always wins (sidecars are minted at v2).\n merged.version = overlay.version;\n\n // publisher_default: sidecar wins iff set (and non-empty). Schema requires\n // non-empty so any present overlay value wins.\n if (overlay.publisher_default && overlay.publisher_default.length > 0) {\n merged.publisher_default = overlay.publisher_default;\n }\n\n // publisher_overrides: sidecar wins iff non-empty.\n if (Array.isArray(overlay.publisher_overrides) && overlay.publisher_overrides.length > 0) {\n merged.publisher_overrides = overlay.publisher_overrides;\n }\n\n // dev_paths: sidecar wins iff non-empty.\n if (Array.isArray(overlay.dev_paths) && overlay.dev_paths.length > 0) {\n merged.dev_paths = overlay.dev_paths;\n }\n\n // default_ref: sidecar wins iff set. Schema gives default \"main\" so\n // we treat a non-default overlay value as a signal of intent.\n if (overlay.default_ref && overlay.default_ref.length > 0) {\n merged.default_ref = overlay.default_ref;\n }\n\n // sync: sidecar wins iff set.\n if (overlay.sync !== undefined) {\n merged.sync = overlay.sync;\n }\n\n // assets: sidecar fully replaces base on presence.\n if (overlay.assets !== undefined) {\n merged.assets = overlay.assets;\n }\n\n return merged;\n}\n\n/**\n * Load and merge a base `.skaile-source.yaml` (at `<rootPath>/.skaile-source.yaml`)\n * with an optional sidecar manifest at `<sidecarPath>/.skaile-source.yaml`.\n *\n * Either side may be absent. The result is wrapped in a {@link ValidationResult}\n * so the discovery dispatcher can surface per-side parse errors uniformly.\n *\n * Field merge follows {@link mergeSourceConfigs}. The sidecar's\n * `.skaile-source.yaml` is the only sidecar artifact this helper touches; the\n * README + lock file under `<sidecarPath>` are consumer concerns.\n *\n * @param rootPath - Absolute path to the upstream repo root\n * @param sidecarPath - Optional absolute path to the sidecar directory\n * (e.g. `~/.skaile/sources/<slug>/`)\n * @returns A {@link ValidationResult} carrying the merged config. Returns\n * `{ ok: true, config: <merged> }` when at least one side parses; returns\n * `{ ok: false, errors: [...] }` only when a present file is structurally\n * invalid. Missing files on both sides yield a typed success with an\n * empty/default v2 config.\n * @docLink packages/discovery/concepts#load-merged-source-config\n */\nexport function loadMergedSourceConfig(rootPath: string, sidecarPath?: string): ValidationResult {\n const baseResult = loadSourceConfigFromDir(rootPath);\n if (baseResult && !baseResult.ok) return baseResult;\n const base = baseResult?.ok ? baseResult.config : undefined;\n\n let overlay: SourceConfig | undefined;\n const overlayWarnings: string[] = [];\n if (sidecarPath) {\n const overlayResult = loadSourceConfigFromDir(sidecarPath);\n if (overlayResult && !overlayResult.ok) return overlayResult;\n if (overlayResult?.ok) {\n overlay = overlayResult.config;\n if (overlayResult.warnings) overlayWarnings.push(...overlayResult.warnings);\n }\n }\n\n const merged = mergeSourceConfigs(base, overlay);\n if (!merged) {\n // No file on either side — return a typed empty v2 default so callers\n // don't have to branch on undefined.\n return {\n ok: true,\n config: {\n version: 2,\n publisher_default: \"@<domain>\",\n default_ref: \"main\",\n publisher_overrides: [],\n dev_paths: [],\n },\n };\n }\n\n const warnings = collectWarnings(merged);\n if (overlayWarnings.length > 0) warnings.push(...overlayWarnings);\n return warnings.length > 0\n ? { ok: true, config: merged, warnings }\n : { ok: true, config: merged };\n}\n\n/**\n * Read `<dir>/.skaile-source.yaml` if present and return the parsed config.\n * Returns `undefined` when the file is missing (consumers treat as absent),\n * and a {@link ValidationFailure} when the file exists but is invalid.\n *\n * Internal helper for {@link loadMergedSourceConfig}.\n */\nfunction loadSourceConfigFromDir(dir: string): ValidationResult | undefined {\n const filePath = path.join(dir, \".skaile-source.yaml\");\n if (!fs.existsSync(filePath)) return undefined;\n try {\n const text = fs.readFileSync(filePath, \"utf-8\");\n return loadSourceConfig(text);\n } catch (err) {\n return {\n ok: false,\n errors: [\n {\n path: filePath,\n message: err instanceof Error ? err.message : String(err),\n },\n ],\n };\n }\n}\n","/**\n * Deterministic SHA256 hashing for asset content.\n *\n * One algorithm shared by:\n * - glob discovery (`discover.ts`)\n * - author-shipped manifest discovery (`discover-manifest.ts`)\n * - virtual-tree discovery (`tree-entries.ts`, via its own copy using async fetch)\n *\n * Hashing rule: files sorted alphabetically. For each file feed\n * `path` + `\\0` + `content` + `\\0`\n * into SHA256. Yields the same hash regardless of OS or filesystem ordering.\n *\n * Files that are referenced by the file filter but absent on disk are skipped\n * (non-fatal): they typically represent optional companion files like\n * `validator.py` that may not exist for every asset. The author-manifest path\n * surfaces missing files as a hard error before reaching the hash step, so\n * this only matters for the glob discovery code path.\n */\n\nimport * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\n/**\n * Compute a deterministic SHA256 hash over a set of files.\n *\n * @param assetRoot - Absolute path to the asset root directory\n * @param files - Relative file paths (from `assetRoot`) to include in the hash\n * @returns Hex-encoded SHA256 digest\n * @docLink packages/discovery/concepts#compute-deterministic-hash\n */\nexport function computeDeterministicHash(assetRoot: string, files: string[]): string {\n const hash = crypto.createHash(\"sha256\");\n const sorted = [...files].sort();\n for (const file of sorted) {\n const fullPath = path.join(assetRoot, file);\n try {\n hash.update(file);\n hash.update(\"\\0\");\n const content = fs.readFileSync(fullPath);\n hash.update(content);\n hash.update(\"\\0\");\n } catch {\n // File doesn't exist — skip (non-fatal, filter may reference optional\n // files like validator.py).\n }\n }\n return hash.digest(\"hex\");\n}\n\n/**\n * Compute SHA256 over a curated file set with full visibility into which\n * files contributed bytes vs were skipped because they're missing on disk.\n *\n * Used by the author-shipped manifest verifier where missing files are a\n * hard error, not a silent skip.\n *\n * @param assetRoot - Absolute path to the asset root directory\n * @param files - Relative file paths (from `assetRoot`) to include\n * @returns `{ sha256, present, missing }` — present/missing are relative paths\n * @docLink packages/discovery/concepts#compute-deterministic-hash-detailed\n */\nexport function computeDeterministicHashDetailed(\n assetRoot: string,\n files: string[],\n): { sha256: string; present: string[]; missing: string[] } {\n const hash = crypto.createHash(\"sha256\");\n const sorted = [...files].sort();\n const present: string[] = [];\n const missing: string[] = [];\n for (const file of sorted) {\n const fullPath = path.join(assetRoot, file);\n let content: Buffer | null = null;\n try {\n content = fs.readFileSync(fullPath);\n } catch {\n missing.push(file);\n continue;\n }\n hash.update(file);\n hash.update(\"\\0\");\n hash.update(content);\n hash.update(\"\\0\");\n present.push(file);\n }\n return { sha256: hash.digest(\"hex\"), present, missing };\n}\n","/**\n * Author-shipped inventory discovery.\n *\n * When a `.skaile-source.yaml` declares `version: 2` and an `assets:` block,\n * discovery uses the inventory verbatim. No glob walk, no AI enrichment.\n * Per-entry verification:\n *\n * - Each `files[]` entry exists on disk → hard error otherwise\n * - The manifest file parses (frontmatter / YAML / JSON) → hard error otherwise\n * - The kind is registered in the `IAssetKindRegistry` → ghost-install with\n * a warning (mirrors the Phase 1.7 amendment for unknown kinds)\n * - SHA256 hash is computed deterministically and compared against\n * `entry.sha256` when present → hard error on mismatch\n * - `entry.requires` refs are syntactically valid → hard error otherwise\n *\n * Output shape matches `discoverAssetsInTree()` so downstream consumers\n * (`LocalCatalogSource`, store backend) need no changes.\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as yaml from \"js-yaml\";\nimport { parseFrontmatter } from \"@skaile/workspaces/core/manifest\";\n\nimport type { IAssetKindRegistry } from \"@skaile/workspaces/plugins\";\nimport { isExcludedDevPath } from \"./source-config.js\";\nimport type { AssetEntry, SourceConfigV2 } from \"./source-config.js\";\nimport { buildRequiresGraph, type RequiresEdge } from \"./requires-graph.js\";\nimport { computeDeterministicHashDetailed } from \"./hash.js\";\nimport type { DiscoveredAsset, DiscoveryResult } from \"./discover.js\";\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Discover assets from an author-shipped inventory.\n *\n * Walks each `assets[]` entry in `sourceConfig`, verifies the declared file\n * filter against disk, parses the manifest, computes the deterministic hash,\n * validates requires syntax, and emits a `DiscoveredAsset` per entry.\n *\n * Verification failures are recorded in `result.errors` as\n * `<error-tag>: <relative-path>: <detail>` and the offending entry is skipped.\n * Tags: `ManifestFileMissing`, `ManifestSchemaError`, `ManifestHashMismatch`,\n * `ManifestRequiresError`.\n *\n * @param rootPath - Absolute path to the repo root\n * @param sourceConfig - Validated `version: 2` source config with `assets:` populated\n * @param registry - Asset kind registry for kind validation + file-filter fallback\n * @returns A {@link DiscoveryResult} identical in shape to `discoverAssetsInTree()`\n * @docLink packages/discovery/concepts#discover-from-manifest\n */\nexport function discoverFromManifest(\n rootPath: string,\n sourceConfig: SourceConfigV2,\n registry: IAssetKindRegistry,\n includeDev = false,\n): DiscoveryResult {\n const assets: DiscoveredAsset[] = [];\n const errors: Array<{ path: string; error: string }> = [];\n const allEdges: RequiresEdge[] = [];\n const devPaths = sourceConfig.dev_paths ?? [];\n\n // Stable ordering: sort by `path` so output is deterministic regardless\n // of how the author chose to list entries.\n const sortedEntries = [...sourceConfig.assets].sort((a, b) => (a.path < b.path ? -1 : 1));\n\n for (const entry of sortedEntries) {\n // Dev-only assets are excluded from a normal run; --dev re-includes them.\n if (!includeDev && isExcludedDevPath(entry.path, devPaths)) continue;\n\n const result = processEntry(rootPath, entry, registry);\n if (result.errors.length > 0) {\n errors.push(...result.errors);\n // Still continue on warning-class issues (unknown kind, missing sha256).\n if (!result.asset) continue;\n }\n if (result.asset) {\n assets.push(result.asset);\n allEdges.push(...result.asset.requires);\n }\n }\n\n const graph = buildRequiresGraph(allEdges);\n return { assets, graph, errors };\n}\n\n// ---------------------------------------------------------------------------\n// Per-entry processing\n// ---------------------------------------------------------------------------\n\ninterface ProcessEntryResult {\n asset: DiscoveredAsset | null;\n errors: Array<{ path: string; error: string }>;\n}\n\nfunction processEntry(\n rootPath: string,\n entry: AssetEntry,\n registry: IAssetKindRegistry,\n): ProcessEntryResult {\n const errors: Array<{ path: string; error: string }> = [];\n\n // ── 1. Resolve asset root + manifest path ─────────────────────────────────\n const assetRoot = path.resolve(rootPath, entry.path);\n const assetRootRelative = entry.path;\n\n // The manifest file is whichever entry in `files[]` looks like the manifest\n // — i.e. matches the registered kind's `matchesPath`. We try each `files[]`\n // entry against the registry; the first match wins. If no entry matches\n // (e.g. unknown kind), fall back to the first file in the list.\n const manifestFileRel = pickManifestFile(entry, registry);\n const manifestAbsPath = path.join(assetRoot, manifestFileRel);\n\n // ── 2. Verify every file exists on disk (hard error) ──────────────────────\n const missing: string[] = [];\n for (const file of entry.files) {\n if (!fs.existsSync(path.join(assetRoot, file))) {\n missing.push(file);\n }\n }\n if (missing.length > 0) {\n errors.push({\n path: assetRootRelative,\n error: `ManifestFileMissing: ${missing.join(\", \")}`,\n });\n return { asset: null, errors };\n }\n\n // ── 3. Parse manifest ─────────────────────────────────────────────────────\n const manifest = parseManifest(manifestAbsPath);\n if (!manifest) {\n errors.push({\n path: assetRootRelative,\n error: `ManifestSchemaError: failed to parse manifest file ${manifestFileRel}`,\n });\n return { asset: null, errors };\n }\n\n // ── 4. Resolve kind via registry (ghost-install on unknown) ───────────────\n if (!registry.getProvider(entry.kind)) {\n errors.push({\n path: assetRootRelative,\n error: `Unknown asset kind \"${entry.kind}\" — ghost-installing without provider validation`,\n });\n }\n\n // ── 5. Validate `requires` syntax ─────────────────────────────────────────\n const requiresErrors = validateRequiresSyntax(entry.requires);\n if (requiresErrors.length > 0) {\n errors.push({\n path: assetRootRelative,\n error: `ManifestRequiresError: ${requiresErrors.join(\"; \")}`,\n });\n return { asset: null, errors };\n }\n\n // ── 6. Compute hash + compare against entry.sha256 ────────────────────────\n const { sha256: computedHash, missing: hashMissing } = computeDeterministicHashDetailed(\n assetRoot,\n entry.files,\n );\n\n if (hashMissing.length > 0) {\n // existsSync passed at step 2 but readFileSync failed — race / perms.\n errors.push({\n path: assetRootRelative,\n error: `ManifestFileMissing: ${hashMissing.join(\", \")} (became unreadable during hashing)`,\n });\n return { asset: null, errors };\n }\n\n if (entry.sha256 && entry.sha256 !== computedHash) {\n errors.push({\n path: assetRootRelative,\n error: `ManifestHashMismatch: declared ${entry.sha256}, computed ${computedHash}`,\n });\n return { asset: null, errors };\n }\n\n if (!entry.sha256) {\n errors.push({\n path: assetRootRelative,\n error: `Missing sha256 — computed ${computedHash}. Re-run \\`skaile source build-manifest --write\\` to pin it.`,\n });\n // Non-fatal: proceed with the computed hash.\n }\n\n // ── 7. Build the DiscoveredAsset ──────────────────────────────────────────\n const ref = `${entry.publisher}/${entry.name}@${entry.version}`;\n const requires: RequiresEdge[] = entry.requires.map((to) => ({\n from: ref,\n to,\n field: \"assets[].requires\",\n }));\n\n // Merge entry.metadata into the parsed manifest so AssetDefinition.manifest\n // carries the author's passthrough fields downstream. Manifest fields win\n // on key collision — the author already declared identity in the entry.\n const mergedManifest: Record<string, unknown> = {\n ...(entry.metadata ?? {}),\n ...manifest,\n };\n\n const asset: DiscoveredAsset = {\n ref,\n kind: entry.kind,\n publisher: entry.publisher,\n name: entry.name,\n version: entry.version,\n manifest: mergedManifest,\n manifestPath: manifestAbsPath,\n relativePath: path.join(assetRootRelative, manifestFileRel).replace(/\\\\/g, \"/\"),\n fileFilter: {\n assetRoot,\n files: [...entry.files].sort(),\n },\n sha256: computedHash,\n requires,\n };\n\n return { asset, errors };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst MANIFEST_FILENAMES = new Set([\n \"SKILL.md\",\n \"AGENT.md\",\n \"agent.yaml\",\n \"CONNECTOR.md\",\n \"MCP.md\",\n \"CONTRACT.md\",\n \"PERSONA.md\",\n \"RULESET.md\",\n]);\n\nconst MANIFEST_SUFFIXES = [\".flow.yaml\", \".flow.json\", \".prompt.md\", \".preset.yaml\"];\n\nfunction pickManifestFile(entry: AssetEntry, registry: IAssetKindRegistry): string {\n const provider = registry.getProvider(entry.kind);\n\n // Provider knows best — give it the candidates and ask which matches.\n if (provider) {\n for (const file of entry.files) {\n if (provider.matchesPath(path.join(entry.path, file).replace(/\\\\/g, \"/\"))) {\n return file;\n }\n }\n }\n\n // Fallback to filename-based heuristics so we can still surface a\n // sensible manifestPath when the kind is unknown.\n for (const file of entry.files) {\n if (MANIFEST_FILENAMES.has(path.basename(file))) return file;\n if (MANIFEST_SUFFIXES.some((s) => file.endsWith(s))) return file;\n }\n\n // Last resort: first file in the list.\n return entry.files[0]!;\n}\n\nfunction parseManifest(absPath: string): Record<string, unknown> | null {\n try {\n const content = fs.readFileSync(absPath, \"utf-8\");\n\n if (absPath.endsWith(\".md\")) {\n const { data } = parseFrontmatter(content);\n return data as Record<string, unknown>;\n }\n\n if (absPath.endsWith(\".yaml\") || absPath.endsWith(\".yml\")) {\n const parsed = yaml.load(content);\n if (typeof parsed === \"object\" && parsed !== null) {\n return parsed as Record<string, unknown>;\n }\n return null;\n }\n\n if (absPath.endsWith(\".json\")) {\n return JSON.parse(content) as Record<string, unknown>;\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Validate the syntax of a single `requires:` entry.\n *\n * Accepted shapes:\n * - `<publisher>/<name>` (loose, no version)\n * - `<publisher>/<name>@<semver-range>` (e.g. `@org/foo@^1`)\n * - `<publisher>/<name>@<exact-version>`\n *\n * Returns a list of human-readable error strings (empty on success).\n */\nfunction validateRequiresSyntax(requires: string[]): string[] {\n const errors: string[] = [];\n // Loose validator: must start with `@`, contain one `/`, optional `@version`\n const RE = /^@[\\w-]+\\/[\\w.-]+(?:@.+)?$/;\n for (const r of requires) {\n if (!RE.test(r)) errors.push(`invalid requires entry \"${r}\"`);\n }\n return errors;\n}\n","/**\n * Asset discovery orchestrator.\n *\n * Walks a directory tree, identifies asset manifests via deterministic\n * filename matching, parses each manifest, computes file filters, and\n * extracts the requires graph.\n *\n * Zero storage dependencies — reused by LocalCatalogSource (Phase 1) and\n * the store backend (Phase 2).\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as yaml from \"js-yaml\";\nimport { parseFrontmatter } from \"@skaile/workspaces/core/manifest\";\n\nimport type { IAssetKindRegistry, AssetKindFileFilter } from \"@skaile/workspaces/plugins\";\nimport type { SourceConfig } from \"./source-config.js\";\nimport { isExcludedDevPath, isManifestMode, loadMergedSourceConfig } from \"./source-config.js\";\nimport { buildRequiresGraph, type RequiresEdge, type RequiresGraph } from \"./requires-graph.js\";\nimport { AssetKindRegistry } from \"./asset-kind-registry.js\";\nimport { BUILTIN_PROVIDERS } from \"./builtin-providers.js\";\nimport { computeDeterministicHash } from \"./hash.js\";\nimport { discoverFromManifest } from \"./discover-manifest.js\";\n\nexport { computeDeterministicHash } from \"./hash.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * A single asset discovered during a {@link discoverAssetsInTree} run, including its parsed\n * manifest, file filter, deterministic hash, and cross-asset dependency edges.\n *\n * @docLink packages/discovery/concepts#discovered-asset\n */\nexport interface DiscoveredAsset {\n /** Canonical ref: `<publisher>/<name>@<version>`. */\n ref: string;\n /** Asset kind (from registry resolution). */\n kind: string;\n publisher: string;\n name: string;\n version: string;\n /** Parsed manifest (frontmatter for .md, full YAML for .yaml/.json). */\n manifest: Record<string, unknown>;\n /** Absolute path to the manifest file. */\n manifestPath: string;\n /** Relative path from source root. */\n relativePath: string;\n /** Files included in this asset's tarball. */\n fileFilter: AssetKindFileFilter;\n /** SHA256 hash of the deterministic tarball content. */\n sha256: string;\n /** Cross-asset dependency edges originating from this asset. */\n requires: RequiresEdge[];\n}\n\nexport interface DiscoveryOptions {\n /** Optional .skaile-source.yaml config for publisher resolution. */\n sourceConfig?: SourceConfig;\n /**\n * Optional sidecar directory (e.g. `~/.skaile/sources/<slug>/`) carrying a\n * local overlay `.skaile-source.yaml`. When set and `sourceConfig` is\n * `undefined`, the helper loads the base in-repo config from `rootPath` and\n * merges the sidecar overlay on top. When both `sourceConfig` and\n * `sidecarPath` are set, the explicit `sourceConfig` wins (the caller is\n * responsible for merging).\n *\n * @docLink packages/discovery/concepts#sidecar-overlay\n */\n sidecarPath?: string;\n /** Optional kind registry. If omitted, a default registry with all built-in providers is used. */\n registry?: IAssetKindRegistry;\n /**\n * Include assets under the source config's `dev_paths` prefixes. Defaults to\n * `false` — a normal run excludes dev-only assets (e.g. `ai-assets-dev/`).\n * Set by the `--dev` flag on `skaile source sync` / `source add`.\n *\n * @docLink packages/discovery/concepts#dev-paths\n */\n includeDev?: boolean;\n}\n\n/**\n * The complete output of a {@link discoverAssetsInTree} scan: all discovered assets, the\n * full requires graph across those assets, and any non-fatal parse errors encountered.\n *\n * @docLink packages/discovery/concepts#discovery-result\n */\nexport interface DiscoveryResult {\n assets: DiscoveredAsset[];\n graph: RequiresGraph;\n errors: Array<{ path: string; error: string }>;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Create a default AssetKindRegistry with all built-in providers registered.\n * Used when no registry is passed to discoverAssetsInTree().\n */\nexport function createDefaultRegistry(): AssetKindRegistry {\n const registry = new AssetKindRegistry();\n for (const provider of BUILTIN_PROVIDERS) {\n registry.register(provider);\n }\n return registry;\n}\n\n/**\n * Discover all assets in a directory tree.\n *\n * Walks `rootPath` recursively, identifies manifests by filename, parses\n * them, computes file filters and SHA256 hashes, and extracts the\n * requires graph.\n *\n * @param rootPath - Absolute path to the directory tree to scan\n * @param optionsOrSourceConfig - Discovery options, or a SourceConfig for backward compat\n * @returns A {@link DiscoveryResult} with all discovered assets, the requires graph, and any parse errors\n * @docLink packages/discovery/concepts#discover-assets-in-tree\n */\nexport function discoverAssetsInTree(\n rootPath: string,\n optionsOrSourceConfig?: DiscoveryOptions | SourceConfig,\n): DiscoveryResult {\n // Backward-compat: accept a bare SourceConfig or the new options object\n let sourceConfig: SourceConfig | undefined;\n let registry: IAssetKindRegistry | undefined;\n let sidecarPath: string | undefined;\n let includeDev = false;\n\n if (\n optionsOrSourceConfig &&\n (\"registry\" in optionsOrSourceConfig ||\n \"sourceConfig\" in optionsOrSourceConfig ||\n \"sidecarPath\" in optionsOrSourceConfig ||\n \"includeDev\" in optionsOrSourceConfig)\n ) {\n sourceConfig = (optionsOrSourceConfig as DiscoveryOptions).sourceConfig;\n registry = (optionsOrSourceConfig as DiscoveryOptions).registry;\n sidecarPath = (optionsOrSourceConfig as DiscoveryOptions).sidecarPath;\n includeDev = (optionsOrSourceConfig as DiscoveryOptions).includeDev ?? false;\n } else {\n sourceConfig = optionsOrSourceConfig as SourceConfig | undefined;\n }\n\n // Use default registry if none provided\n if (!registry) {\n registry = createDefaultRegistry();\n }\n\n // Sidecar overlay: if no explicit sourceConfig was passed but a sidecar\n // path was supplied, load the base config from rootPath and merge in the\n // sidecar overlay before dispatching.\n if (!sourceConfig && sidecarPath) {\n const merged = loadMergedSourceConfig(rootPath, sidecarPath);\n if (merged.ok) {\n sourceConfig = merged.config;\n }\n }\n\n // Dispatch: if the source config carries an author-shipped inventory,\n // discover from the manifest and skip the glob walk entirely.\n if (sourceConfig && isManifestMode(sourceConfig)) {\n return discoverFromManifest(rootPath, sourceConfig, registry, includeDev);\n }\n\n const assets: DiscoveredAsset[] = [];\n const errors: Array<{ path: string; error: string }> = [];\n const allEdges: RequiresEdge[] = [];\n const devPaths = sourceConfig?.dev_paths ?? [];\n\n // Dedup: for kinds where a directory might contain both agent.yaml and AGENT.md,\n // keep only the first match per directory+kind.\n const seen = new Set<string>();\n\n for (const { absPath, relativePath } of walkTree(rootPath)) {\n // Dev-only assets are excluded from a normal run; --dev re-includes them.\n if (!includeDev && isExcludedDevPath(relativePath, devPaths)) continue;\n\n // Resolve kind through the registry\n let kind: string | undefined;\n try {\n kind = registry.resolveKind(relativePath);\n } catch (err) {\n // AssetKindPathAmbiguityError — record and skip\n errors.push({\n path: relativePath,\n error: err instanceof Error ? err.message : String(err),\n });\n continue;\n }\n if (!kind) continue;\n\n // Dedup key: directory + kind\n const dir = path.dirname(relativePath);\n const dedupKey = `${dir}:${kind}`;\n if (seen.has(dedupKey)) continue;\n seen.add(dedupKey);\n\n try {\n const manifest = parseManifest(absPath);\n if (!manifest) {\n errors.push({ path: relativePath, error: \"Failed to parse manifest\" });\n continue;\n }\n\n const publisher = resolvePublisher(relativePath, sourceConfig);\n const name = deriveName(relativePath, kind, manifest);\n // Default \"0.1.0\" (not \"0.0.0\"): the Catalog rejects \"0.0.0\" at publish.\n const version = typeof manifest.version === \"string\" ? manifest.version : \"0.1.0\";\n const ref = `${publisher}/${name}@${version}`;\n\n // File filter — through registry\n const fileFilter = registry.defaultFileFilter(kind, absPath) ?? {\n assetRoot: path.dirname(absPath),\n files: [path.basename(absPath)],\n };\n\n // SHA256\n const sha256 = computeDeterministicHash(fileFilter.assetRoot, fileFilter.files);\n\n // Requires extraction — through registry\n const requires = registry.extractRequires(kind, ref, manifest);\n allEdges.push(...requires);\n\n assets.push({\n ref,\n kind,\n publisher,\n name,\n version,\n manifest,\n manifestPath: absPath,\n relativePath,\n fileFilter,\n sha256,\n requires,\n });\n } catch (err) {\n errors.push({\n path: relativePath,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n const graph = buildRequiresGraph(allEdges);\n return { assets, graph, errors };\n}\n\n// ---------------------------------------------------------------------------\n// Directory walker\n// ---------------------------------------------------------------------------\n\nfunction* walkTree(rootDir: string): Generator<{ absPath: string; relativePath: string }> {\n function* walk(\n dir: string,\n relDir: string,\n ): Generator<{ absPath: string; relativePath: string }> {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const e of entries.sort((a, b) => (a.name < b.name ? -1 : 1))) {\n const full = path.join(dir, e.name);\n const rel = relDir ? `${relDir}/${e.name}` : e.name;\n if (e.isDirectory()) {\n if (e.name === \".git\" || e.name === \"node_modules\" || e.name === \".skaile\") continue;\n yield* walk(full, rel);\n } else if (e.isFile()) {\n yield { absPath: full, relativePath: rel };\n }\n }\n }\n yield* walk(rootDir, \"\");\n}\n\n// ---------------------------------------------------------------------------\n// Manifest parsing\n// ---------------------------------------------------------------------------\n\n/**\n * Parse a manifest file. .md files get frontmatter-parsed (YAML header),\n * .yaml files get full-YAML-parsed, .json files get JSON.parsed.\n */\nfunction parseManifest(absPath: string): Record<string, unknown> | null {\n try {\n const content = fs.readFileSync(absPath, \"utf-8\");\n\n if (absPath.endsWith(\".md\")) {\n const { data } = parseFrontmatter(content);\n return data as Record<string, unknown>;\n }\n\n if (absPath.endsWith(\".yaml\") || absPath.endsWith(\".yml\")) {\n const parsed = yaml.load(content);\n if (typeof parsed === \"object\" && parsed !== null) {\n return parsed as Record<string, unknown>;\n }\n return null;\n }\n\n if (absPath.endsWith(\".json\")) {\n return JSON.parse(content) as Record<string, unknown>;\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Publisher resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the publisher namespace for an asset at a given relative path.\n *\n * Resolution order:\n * 1. Publisher overrides (first match wins)\n * 2. publisher_default template (<domain> replaced with first-level dir name)\n * 3. Fallback: @<first-dir-component>\n */\nfunction resolvePublisher(relativePath: string, sourceConfig?: SourceConfig): string {\n if (!sourceConfig) {\n // No source config: derive from first directory component\n const domain = relativePath.split(\"/\")[0] ?? \"unknown\";\n return `@${domain}`;\n }\n\n // Check publisher overrides first (first match wins)\n for (const override of sourceConfig.publisher_overrides) {\n if (relativePath.startsWith(override.path)) {\n return override.publisher;\n }\n }\n\n // Use publisher_default template\n const template = sourceConfig.publisher_default;\n if (template.includes(\"<domain>\")) {\n const domain = relativePath.split(\"/\")[0] ?? \"unknown\";\n return template.replace(\"<domain>\", domain);\n }\n return template;\n}\n\n// ---------------------------------------------------------------------------\n// Name derivation\n// ---------------------------------------------------------------------------\n\n/**\n * Derive the asset name. Prefers manifest frontmatter `name:` field,\n * falls back to parent directory name.\n */\nfunction deriveName(relativePath: string, kind: string, manifest: Record<string, unknown>): string {\n // Use name from manifest if available\n if (typeof manifest.name === \"string\" && manifest.name.length > 0) {\n return manifest.name;\n }\n\n const parts = relativePath.split(\"/\");\n\n // For flow/prompt/preset, the name is the filename stem\n if (kind === \"flow\") {\n const filename = parts[parts.length - 1] ?? \"\";\n return filename.replace(/\\.flow\\.(yaml|json)$/, \"\");\n }\n if (kind === \"prompt\") {\n const filename = parts[parts.length - 1] ?? \"\";\n return filename.replace(/\\.prompt\\.md$/, \"\");\n }\n if (kind === \"preset\") {\n const filename = parts[parts.length - 1] ?? \"\";\n return filename.replace(/\\.preset\\.yaml$/, \"\");\n }\n\n // For most types, the parent directory name is the asset name\n if (parts.length >= 2) {\n return parts[parts.length - 2]!;\n }\n\n // Fallback\n const filename = parts[parts.length - 1] ?? \"unknown\";\n return filename.replace(/\\.(md|yaml|json)$/, \"\");\n}\n","/**\n * Asset discovery over a virtual file tree (no real filesystem access).\n *\n * `discoverAssetsInTreeEntries()` is the server-side counterpart to\n * `discoverAssetsInTree()` — same kind resolution, manifest parsing,\n * publisher/name derivation, requires extraction, and SHA256 hashing — but\n * driven by a flat list of {@link TreeEntry} (the shape returned by GitHub's\n * Git Trees API: `GET /repos/:owner/:repo/git/trees/:tree_sha?recursive=1`).\n *\n * Used by the public Catalog backend (`@postxl/skaile-store-api`) so that\n * Source ingestion never touches the local filesystem and never runs\n * `git clone` (per spec § Phase 2: \"no client-side cloning, ever\").\n *\n * The function is async because manifest parsing and content hashing both\n * require fetching blob bytes from the remote host (e.g. GitHub Blobs API).\n *\n * Per-kind file-filter logic is mirrored from `builtin-providers.ts` — the\n * provider implementations there read `fs.readdirSync` / `fs.existsSync`,\n * which doesn't translate to a virtual tree, so this module reimplements\n * the same patterns against the supplied {@link TreeEntry} list. The\n * resulting `fileFilter.files` set is identical to what\n * `discoverAssetsInTree()` would produce for the same content laid out on\n * disk.\n *\n * @module\n */\n\nimport * as crypto from \"node:crypto\";\nimport * as yaml from \"js-yaml\";\nimport { parseFrontmatter } from \"@skaile/workspaces/core/manifest\";\n\nimport type { IAssetKindRegistry, AssetKindFileFilter } from \"@skaile/workspaces/plugins\";\nimport type { AssetEntry, SourceConfig, SourceConfigV2 } from \"./source-config.js\";\nimport {\n isExcludedDevPath,\n isManifestMode,\n loadSourceConfig,\n mergeSourceConfigs,\n} from \"./source-config.js\";\nimport { buildRequiresGraph, type RequiresEdge } from \"./requires-graph.js\";\nimport { createDefaultRegistry } from \"./discover.js\";\nimport type { DiscoveredAsset, DiscoveryResult } from \"./discover.js\";\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\n/**\n * A single entry in a virtual file tree (the shape returned by GitHub's\n * Git Trees API).\n *\n * Only the four fields used by discovery are required; consumers may pass\n * Octokit's full `GitTreeResponse[]` directly because TypeScript structural\n * typing accepts the superset.\n *\n * @docLink packages/discovery/concepts#tree-entry\n */\nexport interface TreeEntry {\n /** Repo-relative path (forward slashes), e.g. `domain/skills/review/SKILL.md`. */\n path: string;\n /** `\"blob\"` for files, `\"tree\"` for directories, `\"commit\"` for submodules. */\n type: \"blob\" | \"tree\" | \"commit\" | string;\n /** Git object SHA used to fetch blob contents via {@link DiscoverAssetsInTreeEntriesOptions.fetchBlob}. */\n sha: string;\n /** Optional file mode (`\"100644\"` etc.). When `\"100755\"`, indicates an executable. */\n mode?: string;\n /** Optional blob size in bytes. */\n size?: number;\n}\n\n/**\n * Options for {@link discoverAssetsInTreeEntries}.\n *\n * @docLink packages/discovery/concepts#discover-assets-in-tree-entries-options\n */\nexport interface DiscoverAssetsInTreeEntriesOptions {\n /**\n * Async resolver that returns the bytes of a blob given its Git SHA.\n *\n * The store backend wires this to Octokit's\n * `repos.getContent` / `git.getBlob` API; tests can pass a synchronous\n * map-backed implementation. Returning `null` is treated identically to a\n * fetch error (the file is skipped during hashing).\n */\n fetchBlob: (sha: string) => Promise<Buffer | Uint8Array | string | null>;\n\n /** Optional `.skaile-source.yaml` config (parsed with {@link parseSourceConfig}). */\n sourceConfig?: SourceConfig;\n\n /**\n * Optional sidecar overlay config (loaded out-of-band from\n * `~/.skaile/sources/<slug>/.skaile-source.yaml`). When provided, the\n * `sourceConfig` resolved from the tree (or passed explicitly) is merged\n * with this overlay via {@link mergeSourceConfigs} before dispatch.\n *\n * @docLink packages/discovery/concepts#sidecar-overlay\n */\n sidecarSourceConfig?: SourceConfig;\n\n /** Optional kind registry. Defaults to {@link createDefaultRegistry}. */\n registry?: IAssetKindRegistry;\n\n /**\n * Include assets under the source config's `dev_paths` prefixes. Defaults to\n * `false`. Mirrors the local-FS {@link discoverAssetsInTree} option.\n *\n * @docLink packages/discovery/concepts#dev-paths\n */\n includeDev?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Discover assets in a virtual tree (Octokit `TreeEntry[]`).\n *\n * Mirrors {@link discoverAssetsInTree} but operates on a remote tree\n * snapshot — no `node:fs` access. Manifest content and per-asset file\n * bytes are fetched on demand via `options.fetchBlob`.\n *\n * @param entries - Flat list of tree entries (paths + blob SHAs). Tree\n * entries with `type: \"tree\"` are ignored (directories are reconstructed\n * from blob paths).\n * @param options - Blob fetcher + optional source config and registry.\n * @returns A {@link DiscoveryResult} identical in shape to\n * {@link discoverAssetsInTree}'s output, including `assets`, `graph`,\n * and `errors`.\n * @docLink packages/discovery/concepts#discover-assets-in-tree-entries\n */\nexport async function discoverAssetsInTreeEntries(\n entries: TreeEntry[],\n options: DiscoverAssetsInTreeEntriesOptions,\n): Promise<DiscoveryResult> {\n const registry = options.registry ?? createDefaultRegistry();\n const includeDev = options.includeDev ?? false;\n\n // Index every blob path for O(1) lookup during file-filter construction.\n const blobByPath = new Map<string, TreeEntry>();\n for (const entry of entries) {\n if (entry.type === \"blob\") {\n blobByPath.set(entry.path, entry);\n }\n }\n\n // Author-shipped inventory dispatch.\n // If a source config was explicitly supplied with `assets:` populated, use\n // it. Otherwise, look for `.skaile-source.yaml` in the tree itself and\n // parse it on the fly — this mirrors how a server-side ingestion pipeline\n // would honor an author-shipped manifest without any out-of-band hint.\n const baseSourceConfig = await resolveSourceConfigFromTree(\n options.sourceConfig,\n blobByPath,\n options.fetchBlob,\n );\n // Sidecar overlay: when supplied, merge on top of the base resolved from\n // the tree. The base may be undefined (no upstream config); the sidecar\n // alone is sufficient.\n const resolvedSourceConfig = options.sidecarSourceConfig\n ? mergeSourceConfigs(baseSourceConfig, options.sidecarSourceConfig)\n : baseSourceConfig;\n if (resolvedSourceConfig && isManifestMode(resolvedSourceConfig)) {\n return discoverFromManifestTree(\n resolvedSourceConfig,\n blobByPath,\n options.fetchBlob,\n registry,\n includeDev,\n );\n }\n const devPaths = resolvedSourceConfig?.dev_paths ?? [];\n\n // Stable iteration order — same convention as the directory walker:\n // sorted alphabetically so dedup picks the first match (e.g. AGENT.md\n // before agent.yaml).\n const sortedBlobPaths = [...blobByPath.keys()].sort();\n\n const assets: DiscoveredAsset[] = [];\n const errors: Array<{ path: string; error: string }> = [];\n const allEdges: RequiresEdge[] = [];\n\n // Dedup key: directory + kind (matches discoverAssetsInTree).\n const seen = new Set<string>();\n\n for (const relativePath of sortedBlobPaths) {\n // Skip the well-known directories to mirror the local walker.\n if (\n relativePath.startsWith(\".git/\") ||\n relativePath.startsWith(\"node_modules/\") ||\n relativePath.startsWith(\".skaile/\") ||\n relativePath.includes(\"/.git/\") ||\n relativePath.includes(\"/node_modules/\") ||\n relativePath.includes(\"/.skaile/\")\n ) {\n continue;\n }\n\n // Dev-only assets are excluded from a normal run; --dev re-includes them.\n if (!includeDev && isExcludedDevPath(relativePath, devPaths)) continue;\n\n let kind: string | undefined;\n try {\n kind = registry.resolveKind(relativePath);\n } catch (err) {\n errors.push({\n path: relativePath,\n error: err instanceof Error ? err.message : String(err),\n });\n continue;\n }\n if (!kind) continue;\n\n const dir = posixDirname(relativePath);\n const dedupKey = `${dir}:${kind}`;\n if (seen.has(dedupKey)) continue;\n seen.add(dedupKey);\n\n const manifestEntry = blobByPath.get(relativePath);\n if (!manifestEntry) {\n // Should never happen — `relativePath` came from `blobByPath`.\n errors.push({ path: relativePath, error: \"Manifest blob disappeared from tree index\" });\n continue;\n }\n\n let manifestBytes: Buffer | null;\n try {\n manifestBytes = await fetchAsBuffer(options.fetchBlob, manifestEntry.sha);\n } catch (err) {\n errors.push({\n path: relativePath,\n error: `Failed to fetch manifest blob: ${err instanceof Error ? err.message : String(err)}`,\n });\n continue;\n }\n if (!manifestBytes) {\n errors.push({ path: relativePath, error: \"Failed to fetch manifest blob\" });\n continue;\n }\n\n const manifestText = manifestBytes.toString(\"utf-8\");\n const manifest = parseManifestText(relativePath, manifestText);\n if (!manifest) {\n errors.push({ path: relativePath, error: \"Failed to parse manifest\" });\n continue;\n }\n\n const publisher = resolvePublisher(relativePath, resolvedSourceConfig);\n const name = deriveName(relativePath, kind, manifest);\n // Default \"0.1.0\" (not \"0.0.0\"): the Catalog rejects \"0.0.0\" at publish.\n const version = typeof manifest.version === \"string\" ? manifest.version : \"0.1.0\";\n const ref = `${publisher}/${name}@${version}`;\n\n // File filter — kind-aware, computed against the virtual tree.\n const fileFilter = computeFileFilter(kind, relativePath, blobByPath);\n\n // SHA256 — hash deterministically over the curated file set, fetching\n // each blob's bytes on demand.\n let sha256: string;\n try {\n sha256 = await computeDeterministicHashFromTree(fileFilter, blobByPath, options.fetchBlob);\n } catch (err) {\n errors.push({\n path: relativePath,\n error: `Failed to compute hash: ${err instanceof Error ? err.message : String(err)}`,\n });\n continue;\n }\n\n const requires = registry.extractRequires(kind, ref, manifest);\n allEdges.push(...requires);\n\n assets.push({\n ref,\n kind,\n publisher,\n name,\n version,\n manifest,\n // The tree-entries variant has no on-disk path — surface the\n // repo-relative path here so downstream consumers can build a\n // Manifest URL (raw.githubusercontent.com link).\n manifestPath: relativePath,\n relativePath,\n fileFilter,\n sha256,\n requires,\n });\n }\n\n const graph = buildRequiresGraph(allEdges);\n return { assets, graph, errors };\n}\n\n// ---------------------------------------------------------------------------\n// Manifest parsing (string-driven; mirrors discover.ts)\n// ---------------------------------------------------------------------------\n\nfunction parseManifestText(relativePath: string, text: string): Record<string, unknown> | null {\n try {\n if (relativePath.endsWith(\".md\")) {\n const { data } = parseFrontmatter(text);\n return data as Record<string, unknown>;\n }\n if (relativePath.endsWith(\".yaml\") || relativePath.endsWith(\".yml\")) {\n const parsed = yaml.load(text);\n if (typeof parsed === \"object\" && parsed !== null) {\n return parsed as Record<string, unknown>;\n }\n return null;\n }\n if (relativePath.endsWith(\".json\")) {\n return JSON.parse(text) as Record<string, unknown>;\n }\n return null;\n } catch {\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Publisher resolution (copy of discover.ts to avoid exporting an internal)\n// ---------------------------------------------------------------------------\n\nfunction resolvePublisher(relativePath: string, sourceConfig?: SourceConfig): string {\n if (!sourceConfig) {\n const domain = relativePath.split(\"/\")[0] ?? \"unknown\";\n return `@${domain}`;\n }\n for (const override of sourceConfig.publisher_overrides) {\n if (relativePath.startsWith(override.path)) {\n return override.publisher;\n }\n }\n const template = sourceConfig.publisher_default;\n if (template.includes(\"<domain>\")) {\n const domain = relativePath.split(\"/\")[0] ?? \"unknown\";\n return template.replace(\"<domain>\", domain);\n }\n return template;\n}\n\n// ---------------------------------------------------------------------------\n// Name derivation (mirrors discover.ts)\n// ---------------------------------------------------------------------------\n\nfunction deriveName(relativePath: string, kind: string, manifest: Record<string, unknown>): string {\n if (typeof manifest.name === \"string\" && manifest.name.length > 0) {\n return manifest.name;\n }\n const parts = relativePath.split(\"/\");\n if (kind === \"flow\") {\n const filename = parts[parts.length - 1] ?? \"\";\n return filename.replace(/\\.flow\\.(yaml|json)$/, \"\");\n }\n if (kind === \"prompt\") {\n const filename = parts[parts.length - 1] ?? \"\";\n return filename.replace(/\\.prompt\\.md$/, \"\");\n }\n if (kind === \"preset\") {\n const filename = parts[parts.length - 1] ?? \"\";\n return filename.replace(/\\.preset\\.yaml$/, \"\");\n }\n if (parts.length >= 2) {\n return parts[parts.length - 2]!;\n }\n const filename = parts[parts.length - 1] ?? \"unknown\";\n return filename.replace(/\\.(md|yaml|json)$/, \"\");\n}\n\n// ---------------------------------------------------------------------------\n// File-filter computation against a virtual tree\n// ---------------------------------------------------------------------------\n\n/**\n * Compute the per-kind default file filter against a virtual tree.\n *\n * Mirrors the per-kind logic in `builtin-providers.ts`. Kept inline because\n * the provider implementations there read `fs.readdirSync`/`fs.existsSync`,\n * which doesn't translate to a virtual `TreeEntry[]`. For unknown kinds\n * (extension kinds without a file filter, or kinds with `defaultFileFilter:\n * manifestOnly`) we fall back to manifest-only.\n */\nfunction computeFileFilter(\n kind: string,\n manifestPath: string,\n blobByPath: Map<string, TreeEntry>,\n): AssetKindFileFilter {\n const dir = posixDirname(manifestPath);\n const manifestName = posixBasename(manifestPath);\n\n switch (kind) {\n case \"skill\":\n return skillFilterVirtual(dir, manifestName, blobByPath);\n case \"agent\":\n return agentFilterVirtual(dir, manifestName, blobByPath);\n case \"contract\":\n return contractFilterVirtual(dir, manifestName, blobByPath);\n case \"connector\":\n return connectorFilterVirtual(dir, manifestName, blobByPath);\n // mcp-server, prompt, preset, persona, ruleset, knowledge: manifest-only\n default:\n return { assetRoot: dir, files: [manifestName] };\n }\n}\n\n/**\n * skill: SKILL.md + same-dir leaves (validator.py, CLI.md) + references/\n * + nested sub-directories that contain their own SKILL.md.\n */\nfunction skillFilterVirtual(\n dir: string,\n manifestName: string,\n blobByPath: Map<string, TreeEntry>,\n): AssetKindFileFilter {\n const files = new Set<string>([manifestName]);\n\n // Same-dir leaves.\n for (const leaf of [\"validator.py\", \"CLI.md\"]) {\n if (blobByPath.has(joinPosix(dir, leaf))) files.add(leaf);\n }\n\n // Direct children of `dir`: detect the nested-skill convention and the\n // `references/` subdir in one pass.\n const directChildDirs = new Set<string>();\n for (const blobPath of blobByPath.keys()) {\n if (!isInDir(blobPath, dir)) continue;\n const remainder = blobPath.slice(dir === \"\" ? 0 : dir.length + 1);\n const slash = remainder.indexOf(\"/\");\n if (slash === -1) continue; // direct file already handled\n const childDir = remainder.slice(0, slash);\n directChildDirs.add(childDir);\n }\n\n // references/ — included entirely.\n if (directChildDirs.has(\"references\")) {\n addAllUnder(files, dir, \"references\", blobByPath);\n }\n\n // Nested SKILL dirs — included entirely.\n for (const childDir of directChildDirs) {\n if (childDir === \"references\") continue;\n if (blobByPath.has(joinPosix(dir, childDir, \"SKILL.md\"))) {\n addAllUnder(files, dir, childDir, blobByPath);\n }\n }\n\n return { assetRoot: dir, files: [...files].sort() };\n}\n\n/**\n * agent: agent.yaml or AGENT.md + same-dir SOUL.md, RULES.md + knowledge/.\n */\nfunction agentFilterVirtual(\n dir: string,\n manifestName: string,\n blobByPath: Map<string, TreeEntry>,\n): AssetKindFileFilter {\n const files = new Set<string>([manifestName]);\n for (const companion of [\"SOUL.md\", \"RULES.md\"]) {\n if (blobByPath.has(joinPosix(dir, companion))) files.add(companion);\n }\n addAllUnder(files, dir, \"knowledge\", blobByPath);\n return { assetRoot: dir, files: [...files].sort() };\n}\n\n/**\n * contract: CONTRACT.md + same-dir attachments (all non-directory entries).\n */\nfunction contractFilterVirtual(\n dir: string,\n manifestName: string,\n blobByPath: Map<string, TreeEntry>,\n): AssetKindFileFilter {\n const files = new Set<string>([manifestName]);\n for (const blobPath of blobByPath.keys()) {\n if (!isInDir(blobPath, dir)) continue;\n const remainder = blobPath.slice(dir === \"\" ? 0 : dir.length + 1);\n if (remainder.includes(\"/\")) continue; // not direct child\n files.add(remainder);\n }\n return { assetRoot: dir, files: [...files].sort() };\n}\n\n/**\n * connector: CONNECTOR.md + entry file (adapter.ts by default).\n */\nfunction connectorFilterVirtual(\n dir: string,\n manifestName: string,\n blobByPath: Map<string, TreeEntry>,\n): AssetKindFileFilter {\n const files = new Set<string>([manifestName]);\n if (blobByPath.has(joinPosix(dir, \"adapter.ts\"))) files.add(\"adapter.ts\");\n return { assetRoot: dir, files: [...files].sort() };\n}\n\n// ---------------------------------------------------------------------------\n// Deterministic hashing over a virtual tree\n// ---------------------------------------------------------------------------\n\n/**\n * Compute a deterministic SHA256 hash over a virtual file set, fetching each\n * blob's bytes via `fetchBlob`. Mirrors the hashing convention in\n * {@link computeDeterministicHash}: files sorted, path + null + content +\n * null per file. Missing or unfetchable files are skipped (non-fatal,\n * matching the local case where optional files like `validator.py` may not\n * exist).\n */\nasync function computeDeterministicHashFromTree(\n fileFilter: AssetKindFileFilter,\n blobByPath: Map<string, TreeEntry>,\n fetchBlob: DiscoverAssetsInTreeEntriesOptions[\"fetchBlob\"],\n): Promise<string> {\n const hash = crypto.createHash(\"sha256\");\n const sorted = [...fileFilter.files].sort();\n for (const file of sorted) {\n const fullPath = joinPosix(fileFilter.assetRoot, file);\n const entry = blobByPath.get(fullPath);\n if (!entry) continue; // file referenced by filter but absent in tree\n hash.update(file);\n hash.update(\"\\0\");\n let bytes: Buffer | null;\n try {\n bytes = await fetchAsBuffer(fetchBlob, entry.sha);\n } catch {\n bytes = null;\n }\n if (bytes) hash.update(bytes);\n hash.update(\"\\0\");\n }\n return hash.digest(\"hex\");\n}\n\n// ---------------------------------------------------------------------------\n// POSIX path helpers (TreeEntry paths always use forward slashes)\n// ---------------------------------------------------------------------------\n\nfunction posixDirname(p: string): string {\n const i = p.lastIndexOf(\"/\");\n return i === -1 ? \"\" : p.slice(0, i);\n}\n\nfunction posixBasename(p: string): string {\n const i = p.lastIndexOf(\"/\");\n return i === -1 ? p : p.slice(i + 1);\n}\n\nfunction joinPosix(...segments: string[]): string {\n return segments.filter((s) => s !== \"\").join(\"/\");\n}\n\nfunction isInDir(blobPath: string, dir: string): boolean {\n if (dir === \"\") return true;\n return blobPath.startsWith(`${dir}/`);\n}\n\nfunction addAllUnder(\n out: Set<string>,\n baseDir: string,\n subDir: string,\n blobByPath: Map<string, TreeEntry>,\n): void {\n const prefix = baseDir === \"\" ? `${subDir}/` : `${baseDir}/${subDir}/`;\n for (const blobPath of blobByPath.keys()) {\n if (blobPath.startsWith(prefix)) {\n // Strip baseDir prefix to get path relative to assetRoot.\n const relToAssetRoot = baseDir === \"\" ? blobPath : blobPath.slice(baseDir.length + 1);\n out.add(relToAssetRoot);\n } else if (blobPath === prefix.slice(0, -1)) {\n // exact match (a file named exactly subDir, unlikely but defensive)\n out.add(subDir);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Blob fetcher normalisation\n// ---------------------------------------------------------------------------\n\nasync function fetchAsBuffer(\n fetchBlob: DiscoverAssetsInTreeEntriesOptions[\"fetchBlob\"],\n sha: string,\n): Promise<Buffer | null> {\n const result = await fetchBlob(sha);\n if (result == null) return null;\n if (Buffer.isBuffer(result)) return result;\n if (typeof result === \"string\") return Buffer.from(result, \"utf-8\");\n // Uint8Array\n return Buffer.from(result);\n}\n\n// ---------------------------------------------------------------------------\n// Author-shipped manifest dispatch (virtual tree)\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the source config to use for this discovery run.\n *\n * 1. If the caller passed `options.sourceConfig`, use it as-is.\n * 2. Otherwise, look up `.skaile-source.yaml` in the tree and parse it. This\n * lets a server-side ingestion pipeline honor an author-shipped inventory\n * without any out-of-band hint.\n */\nasync function resolveSourceConfigFromTree(\n explicit: SourceConfig | undefined,\n blobByPath: Map<string, TreeEntry>,\n fetchBlob: DiscoverAssetsInTreeEntriesOptions[\"fetchBlob\"],\n): Promise<SourceConfig | undefined> {\n if (explicit) return explicit;\n const entry = blobByPath.get(\".skaile-source.yaml\");\n if (!entry) return undefined;\n const bytes = await fetchAsBuffer(fetchBlob, entry.sha);\n if (!bytes) return undefined;\n const result = loadSourceConfig(bytes.toString(\"utf-8\"));\n return result.ok ? result.config : undefined;\n}\n\n/**\n * Discover assets from an author-shipped inventory against a virtual tree.\n *\n * Mirrors `discoverFromManifest()` from discover-manifest.ts but uses the\n * `TreeEntry[]` blob index + async `fetchBlob` instead of `node:fs`. Hash\n * algorithm is identical so the same content produces the same SHA256 on\n * local FS and remote tree.\n */\nasync function discoverFromManifestTree(\n sourceConfig: SourceConfigV2,\n blobByPath: Map<string, TreeEntry>,\n fetchBlob: DiscoverAssetsInTreeEntriesOptions[\"fetchBlob\"],\n registry: IAssetKindRegistry,\n includeDev = false,\n): Promise<DiscoveryResult> {\n const assets: DiscoveredAsset[] = [];\n const errors: Array<{ path: string; error: string }> = [];\n const allEdges: RequiresEdge[] = [];\n const devPaths = sourceConfig.dev_paths ?? [];\n\n const sortedEntries = [...sourceConfig.assets].sort((a, b) => (a.path < b.path ? -1 : 1));\n\n for (const entry of sortedEntries) {\n // Dev-only assets are excluded from a normal run; --dev re-includes them.\n if (!includeDev && isExcludedDevPath(entry.path, devPaths)) continue;\n const result = await processManifestEntryTree(entry, blobByPath, fetchBlob, registry);\n if (result.errors.length > 0) {\n errors.push(...result.errors);\n if (!result.asset) continue;\n }\n if (result.asset) {\n assets.push(result.asset);\n allEdges.push(...result.asset.requires);\n }\n }\n\n const graph = buildRequiresGraph(allEdges);\n return { assets, graph, errors };\n}\n\ninterface ProcessEntryTreeResult {\n asset: DiscoveredAsset | null;\n errors: Array<{ path: string; error: string }>;\n}\n\nasync function processManifestEntryTree(\n entry: AssetEntry,\n blobByPath: Map<string, TreeEntry>,\n fetchBlob: DiscoverAssetsInTreeEntriesOptions[\"fetchBlob\"],\n registry: IAssetKindRegistry,\n): Promise<ProcessEntryTreeResult> {\n const errors: Array<{ path: string; error: string }> = [];\n const assetRootRelative = entry.path;\n\n // Verify every file is present in the tree.\n const missing: string[] = [];\n for (const file of entry.files) {\n const full = joinPosix(entry.path, file);\n if (!blobByPath.has(full)) missing.push(file);\n }\n if (missing.length > 0) {\n errors.push({\n path: assetRootRelative,\n error: `ManifestFileMissing: ${missing.join(\", \")}`,\n });\n return { asset: null, errors };\n }\n\n // Pick the manifest file (provider's matchesPath wins; filename heuristic fallback).\n const manifestFileRel = pickManifestFileTree(entry, registry);\n const manifestFull = joinPosix(entry.path, manifestFileRel);\n const manifestEntry = blobByPath.get(manifestFull)!;\n\n // Fetch + parse manifest bytes.\n let manifestBytes: Buffer | null;\n try {\n manifestBytes = await fetchAsBuffer(fetchBlob, manifestEntry.sha);\n } catch (err) {\n errors.push({\n path: assetRootRelative,\n error: `ManifestSchemaError: failed to fetch manifest blob: ${err instanceof Error ? err.message : String(err)}`,\n });\n return { asset: null, errors };\n }\n if (!manifestBytes) {\n errors.push({\n path: assetRootRelative,\n error: `ManifestSchemaError: failed to fetch manifest blob`,\n });\n return { asset: null, errors };\n }\n const manifest = parseManifestText(manifestFull, manifestBytes.toString(\"utf-8\"));\n if (!manifest) {\n errors.push({\n path: assetRootRelative,\n error: `ManifestSchemaError: failed to parse manifest file ${manifestFileRel}`,\n });\n return { asset: null, errors };\n }\n\n // Ghost-install on unknown kind.\n if (!registry.getProvider(entry.kind)) {\n errors.push({\n path: assetRootRelative,\n error: `Unknown asset kind \"${entry.kind}\" — ghost-installing without provider validation`,\n });\n }\n\n // Requires syntax.\n const requiresErrors = validateRequiresSyntax(entry.requires);\n if (requiresErrors.length > 0) {\n errors.push({\n path: assetRootRelative,\n error: `ManifestRequiresError: ${requiresErrors.join(\"; \")}`,\n });\n return { asset: null, errors };\n }\n\n // Deterministic hash over the curated file set.\n let computedHash: string;\n try {\n computedHash = await computeManifestHashTree(entry, blobByPath, fetchBlob);\n } catch (err) {\n errors.push({\n path: assetRootRelative,\n error: `Failed to compute hash: ${err instanceof Error ? err.message : String(err)}`,\n });\n return { asset: null, errors };\n }\n\n if (entry.sha256 && entry.sha256 !== computedHash) {\n errors.push({\n path: assetRootRelative,\n error: `ManifestHashMismatch: declared ${entry.sha256}, computed ${computedHash}`,\n });\n return { asset: null, errors };\n }\n\n if (!entry.sha256) {\n errors.push({\n path: assetRootRelative,\n error: `Missing sha256 — computed ${computedHash}. Re-run \\`skaile source build-manifest --write\\` to pin it.`,\n });\n }\n\n const ref = `${entry.publisher}/${entry.name}@${entry.version}`;\n const requires: RequiresEdge[] = entry.requires.map((to) => ({\n from: ref,\n to,\n field: \"assets[].requires\",\n }));\n\n const mergedManifest: Record<string, unknown> = {\n ...(entry.metadata ?? {}),\n ...manifest,\n };\n\n const asset: DiscoveredAsset = {\n ref,\n kind: entry.kind,\n publisher: entry.publisher,\n name: entry.name,\n version: entry.version,\n manifest: mergedManifest,\n manifestPath: manifestFull,\n relativePath: manifestFull,\n fileFilter: {\n assetRoot: entry.path,\n files: [...entry.files].sort(),\n },\n sha256: computedHash,\n requires,\n };\n\n return { asset, errors };\n}\n\nconst MANIFEST_FILENAMES = new Set([\n \"SKILL.md\",\n \"AGENT.md\",\n \"agent.yaml\",\n \"CONNECTOR.md\",\n \"MCP.md\",\n \"CONTRACT.md\",\n \"PERSONA.md\",\n \"RULESET.md\",\n]);\n\nconst MANIFEST_SUFFIXES = [\".flow.yaml\", \".flow.json\", \".prompt.md\", \".preset.yaml\"];\n\nfunction pickManifestFileTree(entry: AssetEntry, registry: IAssetKindRegistry): string {\n const provider = registry.getProvider(entry.kind);\n if (provider) {\n for (const file of entry.files) {\n if (provider.matchesPath(joinPosix(entry.path, file))) return file;\n }\n }\n for (const file of entry.files) {\n const base = file.split(\"/\").pop() ?? file;\n if (MANIFEST_FILENAMES.has(base)) return file;\n if (MANIFEST_SUFFIXES.some((s) => file.endsWith(s))) return file;\n }\n return entry.files[0]!;\n}\n\nasync function computeManifestHashTree(\n entry: AssetEntry,\n blobByPath: Map<string, TreeEntry>,\n fetchBlob: DiscoverAssetsInTreeEntriesOptions[\"fetchBlob\"],\n): Promise<string> {\n const hash = crypto.createHash(\"sha256\");\n const sorted = [...entry.files].sort();\n for (const file of sorted) {\n const full = joinPosix(entry.path, file);\n const blob = blobByPath.get(full);\n if (!blob) continue; // existence already checked, defensive\n hash.update(file);\n hash.update(\"\\0\");\n const bytes = await fetchAsBuffer(fetchBlob, blob.sha);\n if (bytes) hash.update(bytes);\n hash.update(\"\\0\");\n }\n return hash.digest(\"hex\");\n}\n\nfunction validateRequiresSyntax(requires: string[]): string[] {\n const errors: string[] = [];\n const RE = /^@[\\w-]+\\/[\\w.-]+(?:@.+)?$/;\n for (const r of requires) {\n if (!RE.test(r)) errors.push(`invalid requires entry \"${r}\"`);\n }\n return errors;\n}\n","/**\n * Package version string.\n *\n * @docLink packages/discovery/concepts\n */\nexport const VERSION = \"0.0.0\";\n\n// Asset Kind Registry (pluggable kind resolution)\nexport { AssetKindRegistry } from \"./asset-kind-registry.js\";\n\n// Built-in providers\nexport {\n BUILTIN_PROVIDERS,\n skillProvider,\n agentProvider,\n connectorProvider,\n mcpServerProvider,\n contractProvider,\n promptProvider,\n personaProvider,\n rulesetProvider,\n presetProvider,\n} from \"./builtin-providers.js\";\n\n// Source config (.skaile-source.yaml)\nexport {\n SourceConfigSchema,\n SEMVER_RE,\n parseSourceConfig,\n validateSourceConfig,\n loadSourceConfig,\n isManifestMode,\n isExcludedDevPath,\n mergeSourceConfigs,\n loadMergedSourceConfig,\n} from \"./source-config.js\";\n\nexport type {\n SourceConfig,\n SourceConfigV2,\n AssetEntry,\n PublisherOverride,\n SyncConfig,\n ValidationResult,\n ValidationSuccess,\n ValidationFailure,\n MergedSourceConfig,\n} from \"./source-config.js\";\n\n// Requires graph\nexport {\n extractRequires,\n buildRequiresGraph,\n detectCycles,\n} from \"./requires-graph.js\";\n\nexport type { RequiresEdge, RequiresGraph } from \"./requires-graph.js\";\n\n// Discovery orchestrator\nexport {\n discoverAssetsInTree,\n createDefaultRegistry,\n computeDeterministicHash,\n} from \"./discover.js\";\n\nexport type {\n DiscoveredAsset,\n DiscoveryOptions,\n DiscoveryResult,\n} from \"./discover.js\";\n\n// Author-shipped inventory discovery\nexport { discoverFromManifest } from \"./discover-manifest.js\";\n\n// Hash helpers\nexport { computeDeterministicHashDetailed } from \"./hash.js\";\n\n// Discovery over a virtual tree (Octokit Tree entries)\nexport { discoverAssetsInTreeEntries } from \"./tree-entries.js\";\n\nexport type {\n TreeEntry,\n DiscoverAssetsInTreeEntriesOptions,\n} from \"./tree-entries.js\";\n"]}
|