@delorenj/skillex 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,9 +10,21 @@ export interface SkillMetadata {
10
10
  readonly metadata: Readonly<Record<string, unknown>>;
11
11
  readonly provenance: Readonly<Record<string, unknown>> | null;
12
12
  }
13
+ /** Who owns a definition's bytes: the catalog's all-skills/, or a repository (ADR-0002). */
14
+ export interface SkillOwner {
15
+ readonly kind: "catalog" | "repo";
16
+ /** The declaring link source; null for catalog definitions. */
17
+ readonly source: string | null;
18
+ readonly repo: string | null;
19
+ /** The resolved checkout root on this machine; null for catalog definitions. */
20
+ readonly checkout: string | null;
21
+ /** The owning checkout's HEAD; null for catalog definitions or when Git cannot say. */
22
+ readonly commit: string | null;
23
+ }
13
24
  export interface SkillDetails extends SkillMetadata {
14
25
  readonly name: string;
15
26
  readonly path: string;
27
+ readonly owner: SkillOwner;
16
28
  readonly references: readonly SkillReference[];
17
29
  }
18
30
  export interface ListSkillsOptions extends RegistryOptions {
@@ -28,7 +28,7 @@ export interface CompositionPlan {
28
28
  }
29
29
  export declare function compositionError<T>(command: string, error: unknown): ResultEnvelope<T | null>;
30
30
  export declare function conflict(path: string, message?: string): never;
31
- export declare function requestedSkills(registry: string, names: readonly string[], path: string): Promise<Map<string, string>>;
31
+ export declare function requestedSkills(registry: string, names: readonly string[], path: string, composition?: "set" | "pack"): Promise<Map<string, string>>;
32
32
  export declare function newPlan(registry: RegistrySelection, composition: CompositionDetails, dryRun: boolean): Promise<CompositionPlan>;
33
33
  export declare function planDirectory(plan: CompositionPlan, path: string): Promise<void>;
34
34
  export declare function inspectCanonicalLink(plan: CompositionPlan, path: string, target: string): Promise<boolean>;
@@ -1,12 +1,23 @@
1
+ import { type RegistryRef } from "./registry-context.js";
1
2
  import type { PackSelection, ResolvedPack } from "./selection.js";
2
- export declare function canonicalSkill(registry: string, name: string): Promise<string>;
3
+ export interface CanonicalOptions {
4
+ /** Resolving a set or pack member: repo-owned names are refused in phase 1 (ADR-0002 §4). */
5
+ readonly composition?: "set" | "pack";
6
+ }
7
+ /** Phase 1: committed set and pack link farms cannot reference a machine-local checkout. */
8
+ export declare function refuseOwnedMember(name: string, kind: "set" | "pack", path?: string): never;
9
+ /**
10
+ * One name, one directory: all-skills/<name>, or the working tree of the link source that declares
11
+ * it. A name in both is refused (E_DIVERGENT_CANONICAL_NAME); neither ever shadows the other.
12
+ */
13
+ export declare function canonicalSkill(registry: RegistryRef, name: string, options?: CanonicalOptions): Promise<string>;
3
14
  export declare function setMembers(registry: string, name: string): Promise<{
4
15
  path: string;
5
16
  names: string[];
6
17
  }>;
7
- export declare function setMemberTarget(registry: string, setPath: string, name: string): Promise<string>;
18
+ export declare function setMemberTarget(registry: RegistryRef, setPath: string, name: string): Promise<string>;
8
19
  export interface PackInventory extends ResolvedPack {
9
20
  readonly names: readonly string[];
10
21
  }
11
22
  /** pack.toml owns membership; its generated skills/ links are checked by verify. */
12
- export declare function packInventory(registry: string, selection: PackSelection): Promise<PackInventory>;
23
+ export declare function packInventory(registryRef: RegistryRef, selection: PackSelection): Promise<PackInventory>;
@@ -1,3 +1,4 @@
1
+ import type { SkillOwner } from "./catalog-types.js";
1
2
  import type { SyncChange, SyncOptions } from "./reconciliation-types.js";
2
3
  import type { Diagnostic } from "./result.js";
3
4
  import type { ExcludedBinding, Resolution, ScopeName, SkillOrigin } from "./selection.js";
@@ -72,5 +73,7 @@ export interface SkillExplanation {
72
73
  export interface ExplainResult {
73
74
  readonly name: string;
74
75
  readonly canonical: string | null;
76
+ /** Owner of the canonical definition: all-skills/ or a repo-owned link source (ADR-0002). */
77
+ readonly owner: SkillOwner | null;
75
78
  readonly scopes: readonly SkillExplanation[];
76
79
  }
@@ -12,6 +12,9 @@ export interface DoctorSourceInspection {
12
12
  readonly packs: number;
13
13
  readonly provenance: number;
14
14
  readonly digestsChecked: number;
15
+ /** Skills declared by link sources (ADR-0002); each resolved one is hub-linted. */
16
+ readonly repoOwnedSkills: number;
17
+ readonly hubsLinted: number;
15
18
  }
16
19
  export interface ConfiguredLegacyWriter {
17
20
  readonly kind: "mise" | "service";
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Which machine wrote a receipt, journal or lock claim.
3
+ *
4
+ * `os.hostname()` is that answer on Linux, where the hostname is configured
5
+ * state. On macOS it is not: with no `scutil --get HostName` set (the default),
6
+ * `gethostname()` reports whatever name DHCP or Bonjour handed out last, and it
7
+ * changes on its own. On one Mac it went from `Mac.attlocal.net` to
8
+ * `HelloSub.local` between two runs, a few minutes apart, and every profile
9
+ * receipt written under the first name was refused as "another host's"
10
+ * (E_RECEIPT_INVALID). A lock claim left behind under the old name would be
11
+ * a "foreign host" claim that can never be reaped.
12
+ *
13
+ * macOS therefore names the machine by its hardware UUID (IOPlatformUUID),
14
+ * which survives renames, DHCP and Bonjour conflict renaming, and does not
15
+ * survive a move to a different Mac, which is the case receipts must refuse.
16
+ * When the UUID cannot be read, the hostname is used, as before.
17
+ */
18
+ export interface HostIdentitySources {
19
+ readonly platform: string;
20
+ readonly hostname: () => string;
21
+ readonly platformUuid: () => string | null;
22
+ }
23
+ /** IOPlatformUUID from `ioreg`, or null. Never throws. */
24
+ export declare function readDarwinPlatformUuid(): string | null;
25
+ /** The identity for `sources`; pure, so every platform branch is testable anywhere. */
26
+ export declare function resolveHostIdentity(sources: HostIdentitySources): string;
27
+ /** This machine's stable identity (cached for the process). Linux: `os.hostname()`. */
28
+ export declare function hostIdentity(): string;
29
+ /**
30
+ * Every value a record written on THIS machine may carry: the stable identity,
31
+ * and the bare hostname earlier releases wrote. Accepting the hostname keeps a
32
+ * receipt written before the change valid exactly when it was valid before
33
+ * (the hostname still matches); it never accepts another machine's record that
34
+ * the old check would have refused.
35
+ */
36
+ export declare function localHostIdentities(): readonly string[];
@@ -0,0 +1,83 @@
1
+ import type { RegistryRef } from "./registry-context.js";
2
+ import { type Diagnostic, ExitCode, type ResultEnvelope } from "./result.js";
3
+ import type { RegistryOptions } from "./selection.js";
4
+ /**
5
+ * Hub lint (ADR-0002 §6). Every rule is structural or an exact syntax match, so prose never
6
+ * produces a finding:
7
+ *
8
+ * - Links are Markdown inline links and reference definitions (`[x](path)`, `![x](path)`,
9
+ * `[id]: path`) outside fenced code blocks and inline code spans. URLs (any `scheme:`), `//`
10
+ * links and pure `#anchors` are ignored; `#fragment` and `?query` suffixes are stripped. An
11
+ * absolute target (`/...` or `~...`) or one that resolves outside the hub is an escape; a
12
+ * relative target that does not exist is missing. Paths written in prose or backticks are never
13
+ * checked for existence.
14
+ * - Scanned files are every `*.md` in the hub except under its top-level `examples/`,
15
+ * `templates/` and `assets/` directories, which may quote foreign Markdown.
16
+ * - Orphans are Markdown files under `references/` or `subskills/` that no scanned file links to
17
+ * or names by path in an inline code span (relative to that file or to the hub root).
18
+ * - Skill references are the exact phrase "load the `name` hub" or "load the `name` skill"
19
+ * (load/loads/loaded/loading, "the" optional), whose name must be a valid skill name that
20
+ * resolves in all-skills/ or is declared by a link source. Other backticked words are prose.
21
+ */
22
+ export interface HubLintOptions {
23
+ /** Line budget for SKILL.md before W_HUB_SIZE. */
24
+ readonly maxLines?: number;
25
+ /** Decide whether a skill name is known; omit to skip E_HUB_SKILL_REF_UNKNOWN. */
26
+ readonly knownSkill?: (name: string) => Promise<boolean>;
27
+ /**
28
+ * A wild hub lives in all-skills/ beside every other catalog skill and keeps its .source.yaml
29
+ * provenance there, so the repository rules (E_HUB_COUNT, W_HUB_PROVENANCE) do not apply.
30
+ */
31
+ readonly wild?: boolean;
32
+ }
33
+ export interface HubLintTarget {
34
+ /** The hub directory. */
35
+ readonly path: string;
36
+ /** The name a link source declares for this hub, when there is one. */
37
+ readonly declaredName?: string;
38
+ readonly source?: string;
39
+ readonly checkout?: string;
40
+ }
41
+ export interface HubLintData {
42
+ readonly name: string;
43
+ readonly path: string;
44
+ readonly source: string | null;
45
+ readonly checkout: string | null;
46
+ readonly lines: number | null;
47
+ readonly files: number;
48
+ readonly links: number;
49
+ }
50
+ export interface HubLintReport {
51
+ readonly data: HubLintData;
52
+ readonly findings: readonly Diagnostic[];
53
+ }
54
+ export declare const HUB_SIZE_LIMIT = 500;
55
+ interface Line {
56
+ readonly number: number;
57
+ /** Line text with inline code spans blanked out. */
58
+ readonly prose: string;
59
+ /** Line text with code spans intact (for the explicit load phrase). */
60
+ readonly raw: string;
61
+ readonly spans: readonly string[];
62
+ }
63
+ /** Split Markdown into prose lines, skipping fenced code blocks and blanking inline code. */
64
+ export declare function markdownLines(text: string): Line[];
65
+ /** Markdown link targets on one prose line. */
66
+ export declare function linkTargets(line: string): string[];
67
+ /** A local path from a link target, or null for URLs, anchors and empty targets. */
68
+ export declare function localTarget(target: string): string | null;
69
+ /** Lint one hub directory. Structural failures are findings; only an absent hub throws. */
70
+ export declare function lintHub(target: HubLintTarget, options?: HubLintOptions): Promise<HubLintReport>;
71
+ /** Exit for lint findings: errors refuse, warnings are drift, info is clean. */
72
+ export declare function hubLintExit(findings: readonly Diagnostic[]): ExitCode;
73
+ /** Whether a name resolves in all-skills/ or is declared by any link source. */
74
+ export declare function knownSkillIn(registry: RegistryRef): (name: string) => Promise<boolean>;
75
+ /** Lint the hub of one repo-owned skill, using its declaration and resolved checkout. */
76
+ export declare function lintOwnedSkill(registry: RegistryRef, name: string, options?: HubLintOptions): Promise<HubLintReport>;
77
+ export interface LintSkillOptions extends RegistryOptions {
78
+ readonly path?: string;
79
+ readonly maxLines?: number;
80
+ }
81
+ /** `skillex skill lint <name>` or `skillex skill lint --path <hub>`. */
82
+ export declare function lintSkill(name: string | undefined, options?: LintSkillOptions): Promise<ResultEnvelope<HubLintData | null>>;
83
+ export {};
@@ -0,0 +1,54 @@
1
+ import type { SkillOwner } from "./catalog-types.js";
2
+ import { SkillexError } from "./error.js";
3
+ import { type RegistryRef } from "./registry-context.js";
4
+ import type { VendorCheckout, VendorSource } from "./vendor-types.js";
5
+ /** A skill defined in its owning repository's working tree (ADR-0002), never in all-skills/. */
6
+ export interface OwnedSkill {
7
+ readonly name: string;
8
+ /** Realpath of <checkout>/<subdir>/<name>: a real directory inside the checkout. */
9
+ readonly path: string;
10
+ readonly source: string;
11
+ readonly repo: string;
12
+ readonly checkout: string;
13
+ readonly checkoutRoot: string;
14
+ /** Realpath of <checkout>/<subdir>: the directory that holds the repository's one hub. */
15
+ readonly skillsRoot: string;
16
+ readonly subdir: string;
17
+ }
18
+ /** Link-mode declarations from all-skills/sources.toml. Names are known without any checkout. */
19
+ export interface OwnedDeclarations {
20
+ readonly path: string;
21
+ readonly sources: readonly VendorSource[];
22
+ readonly owners: ReadonlyMap<string, VendorSource>;
23
+ }
24
+ export interface OwnedCheckout {
25
+ readonly source: VendorSource;
26
+ readonly checkout: VendorCheckout;
27
+ }
28
+ /** Declared repo-owned names. A selection memoizes them; a bare root reuses an unchanged read. */
29
+ export declare function ownedDeclarations(registry: RegistryRef): Promise<OwnedDeclarations>;
30
+ /** The link source that owns a name, or undefined for catalog and unknown names. */
31
+ export declare function ownedSource(registry: RegistryRef, name: string): Promise<VendorSource | undefined>;
32
+ /**
33
+ * Resolve and verify one link source's checkout. An absent checkout yields root null; a present
34
+ * checkout of the wrong repository, a stale one, or a non-root one is always refused.
35
+ */
36
+ export declare function ownedCheckout(registry: RegistryRef, source: VendorSource): Promise<OwnedCheckout>;
37
+ /**
38
+ * Resolve a repo-owned skill, or undefined when no link source declares the name. A declared name
39
+ * whose checkout is unavailable fails: E_SOURCE_CHECKOUT_MISSING for a required source and
40
+ * E_SKILL_MISSING for an optional one. Filesystem checks run on every call.
41
+ */
42
+ export declare function ownedSkill(registry: RegistryRef, name: string): Promise<OwnedSkill | undefined>;
43
+ /** Every declared repo-owned skill, resolved independently; failures are returned, not thrown. */
44
+ export declare function ownedSkills(registry: RegistryRef): Promise<readonly {
45
+ readonly name: string;
46
+ readonly source: VendorSource;
47
+ readonly skill?: OwnedSkill;
48
+ readonly error?: SkillexError;
49
+ }[]>;
50
+ /** The owning repository's HEAD, for provenance displays. Null when Git cannot say. */
51
+ export declare function ownedCommit(registry: RegistryRef, checkoutRoot: string): Promise<string | null>;
52
+ export declare const catalogOwner: SkillOwner;
53
+ /** The owner of a resolved definition path: its link source when it is repo-owned. */
54
+ export declare function skillOwner(registry: RegistryRef, name: string, path: string): Promise<SkillOwner>;
@@ -3,11 +3,13 @@ import type { SourceRevision } from "./activation-types.js";
3
3
  import { type ProfileData, type ProfileState } from "./profile-state.js";
4
4
  import type { ProfileLocation, ProfileOptions, ProfileShowResult, ProfileSyncOptions, ProfileSyncResult } from "./profile-types.js";
5
5
  import { type Diagnostic, ExitCode, type ResultEnvelope } from "./result.js";
6
- import type { ResolvedScope, SkillOrigin } from "./selection.js";
6
+ import type { RegistrySelection, ResolvedScope, SkillOrigin } from "./selection.js";
7
7
  interface Desired {
8
8
  readonly name: string;
9
9
  readonly target: string;
10
10
  readonly registry: string;
11
+ /** The selection that resolved this binding; repo-owned skills re-resolve through it. */
12
+ readonly selection: RegistrySelection;
11
13
  readonly origins: readonly SkillOrigin[];
12
14
  readonly winner: "global" | "project";
13
15
  }
@@ -3,7 +3,7 @@ import type { ActivationData, ActivationJournal, EntryIdentity, OwnedNode, Sourc
3
3
  import { type DerivationPreview } from "./derivation.js";
4
4
  import type { SyncChange, SyncOptions, SyncPlan, SyncResult, SyncScopePlan } from "./reconciliation-types.js";
5
5
  import { type Diagnostic, type ResultEnvelope } from "./result.js";
6
- import type { Resolution, ResolvedScope, SkillsManifest } from "./selection.js";
6
+ import type { RegistrySelection, Resolution, ResolvedScope, SkillsManifest } from "./selection.js";
7
7
  interface Operation {
8
8
  readonly path: string;
9
9
  readonly previous?: OwnedNode;
@@ -20,6 +20,8 @@ interface Recovery {
20
20
  interface ScopeWork {
21
21
  readonly options: SyncOptions;
22
22
  readonly scope: ResolvedScope;
23
+ /** Every registry the resolution consulted; inherited bindings may come from another one. */
24
+ readonly registries: readonly RegistrySelection[];
23
25
  readonly snapshot: ReceiptSnapshot<ActivationData>;
24
26
  readonly receiptOptions: ReceiptOptions;
25
27
  readonly data: ActivationData;
@@ -39,6 +41,13 @@ export interface PreparedSync {
39
41
  }
40
42
  /** Internal shared revision evidence for scope and profile receipts. */
41
43
  export declare function sourceRevision(kind: SourceRevision["kind"], path: string): Promise<SourceRevision>;
44
+ /**
45
+ * Revisions to compare a fresh plan against its receipt. A repo-owned hub is a live link into
46
+ * its owning checkout, so that repository's HEAD moving changes no link: a source that is not
47
+ * some registry's all-skills/ keeps its recorded commit for the comparison. The fresh commit
48
+ * is still written whenever the receipt is rewritten for any other reason.
49
+ */
50
+ export declare function settledRevisions(next: readonly SourceRevision[], recorded: readonly SourceRevision[] | undefined, catalogRoots: ReadonlySet<string>): SourceRevision[];
42
51
  /**
43
52
  * Plan-only boundary for a set not yet materialized. Reuses every destination,
44
53
  * receipt, recovery and alias guard; only the on-disk set check is replaced by
@@ -0,0 +1,26 @@
1
+ import type { RegistryOptions, RegistrySelection } from "./selection.js";
2
+ /**
3
+ * The machine context a registry was discovered with. Repo-owned (link) sources resolve their
4
+ * checkouts per machine, so a lookup must use the same home, environment and working directory
5
+ * that selected the registry. Kept beside the selection, never inside it: selections are wire
6
+ * data, and this context is not.
7
+ */
8
+ export interface RegistryContext {
9
+ readonly env: Readonly<Record<string, string | undefined>>;
10
+ readonly home: string;
11
+ readonly cwd: string;
12
+ readonly checkouts?: Readonly<Record<string, string>>;
13
+ }
14
+ /** A registry identity: a discovered selection, or a bare root path from older call sites. */
15
+ export type RegistryRef = string | RegistrySelection;
16
+ export declare function registryRoot(registry: RegistryRef): string;
17
+ export declare function contextFromOptions(options: RegistryOptions & {
18
+ readonly checkouts?: Readonly<Record<string, string>>;
19
+ }): RegistryContext;
20
+ /** Called by registry discovery so later lookups through this selection share its context. */
21
+ export declare function bindRegistryContext(selection: RegistrySelection, context: RegistryContext): void;
22
+ /**
23
+ * A selection's own context; a bare root falls back to the most recent discovery of that root in
24
+ * this process, then to the process defaults.
25
+ */
26
+ export declare function registryContext(registry: RegistryRef): RegistryContext;
@@ -1,5 +1,7 @@
1
1
  import { type Diagnostic } from "./result.js";
2
2
  import type { VendorCheckout, VendorOptions, VendorSource, VendorSourcesManifest } from "./vendor-types.js";
3
+ /** The pinned version of a vendor-mode source; link sources never reach vendoring. */
4
+ export declare function vendorVersion(source: VendorSource): string;
3
5
  export declare function checkVendorSignal(options: Pick<VendorOptions, "signal">): void;
4
6
  /** Load the owning catalog's declaration only; prepared migration files are never fallback input. */
5
7
  export declare function readVendorSources(options?: VendorOptions): Promise<VendorSourcesManifest>;
@@ -22,7 +22,10 @@ export interface VendorSourceSkill {
22
22
  export interface VendorSource {
23
23
  readonly name: string;
24
24
  readonly repo: string;
25
- readonly version: string;
25
+ /** "vendor" copies a pinned commit into all-skills/; "link" exposes the checkout's working tree (ADR-0002). */
26
+ readonly mode: "vendor" | "link";
27
+ /** Required for vendor mode; optional and unused in link mode. */
28
+ readonly version: string | null;
26
29
  readonly checkout: string;
27
30
  readonly subdir: string;
28
31
  readonly membership: "explicit" | "discovery";
@@ -71,7 +74,7 @@ export interface VendorSkillStatus {
71
74
  readonly name: string;
72
75
  readonly path: string;
73
76
  readonly source: string;
74
- readonly state: "ok" | "missing" | "unrecorded" | "invalid" | "modified" | "stale" | "unknown" | "recorded" | "orphaned" | "foreign";
77
+ readonly state: "ok" | "missing" | "unrecorded" | "invalid" | "modified" | "stale" | "unknown" | "recorded" | "orphaned" | "foreign" | "linked";
75
78
  readonly recordedCommit: string | null;
76
79
  readonly upstreamCommit: string | null;
77
80
  readonly recordedDigest: string | null;
@@ -99,6 +102,7 @@ export interface VendorStatusResult {
99
102
  readonly upstream: boolean;
100
103
  readonly sources: readonly {
101
104
  readonly name: string;
105
+ readonly mode: "vendor" | "link";
102
106
  readonly membership: "explicit" | "recorded";
103
107
  readonly checkout: VendorCheckout | null;
104
108
  readonly upstreamCommit: string | null;
@@ -107,6 +111,8 @@ export interface VendorStatusResult {
107
111
  }
108
112
  export interface VendorSourceResolution {
109
113
  readonly name: string;
114
+ /** Link sources are never vendored: they are reported as skipped and linked. */
115
+ readonly linked?: true;
110
116
  readonly checkout: string | null;
111
117
  readonly commit: string | null;
112
118
  readonly refKind: "branch" | "tag" | "commit" | "unknown" | null;
package/dist/index.d.ts CHANGED
@@ -4,7 +4,7 @@ export { freezeBmadPack } from "./core/bmad-freeze.js";
4
4
  export { explainBmadSkill, inspectBmadStatus } from "./core/bmad-status.js";
5
5
  export type { BmadCanonicalStatus, BmadCommandClient, BmadCommandFile, BmadCommandInventory, BmadExplainData, BmadExplainOptions, BmadForeignSkill, BmadFreezeChange, BmadFreezeData, BmadFreezeOptions, BmadProvenance, BmadReference, BmadSkillExplanation, BmadSkillInventory, BmadSkillManifestEntry, BmadSourceInstallation, BmadSourceModule, BmadStatusData, BmadStatusOptions, } from "./core/bmad-types.js";
6
6
  export { listSkills, showSkill } from "./core/catalog.js";
7
- export type { ListSkillsOptions, SkillDetails, SkillListData, SkillMetadata, SkillReference, SkillShowData, } from "./core/catalog-types.js";
7
+ export type { ListSkillsOptions, SkillDetails, SkillListData, SkillMetadata, SkillOwner, SkillReference, SkillShowData, } from "./core/catalog-types.js";
8
8
  export { type CatalogChange, type CatalogWriteOptions, type CatalogWriteResult, type CreateSkillOptions, createSkill, importSkill, } from "./core/catalog-write.js";
9
9
  export { ClientIsolationCommand, type ClientIsolationOptions, type ClientIsolationPlan, type ClientIsolationResult, type ClientVerification, type ClientVerifyOptions, isolateClient, type OpenCodeRequest, unisolateClient, verifyClientIsolation, } from "./core/client-isolation.js";
10
10
  export type { CompositionChange, CompositionDetails, CompositionMutationData, CompositionOptions, PackListData, PackShowData, SetListData, SetShowData, } from "./core/composition-types.js";
@@ -16,6 +16,8 @@ export { discoverRegistry, discoverScopes } from "./core/discovery.js";
16
16
  export { doctor } from "./core/doctor.js";
17
17
  export type { ConfiguredLegacyWriter, DoctorOptions, DoctorResult, DoctorSourceInspection, DoctorWriterInspection, RunningLegacyWriter, } from "./core/doctor-types.js";
18
18
  export { SkillexError } from "./core/error.js";
19
+ export { type HostIdentitySources, hostIdentity, localHostIdentities, resolveHostIdentity, } from "./core/host-identity.js";
20
+ export { HUB_SIZE_LIMIT, type HubLintData, type HubLintOptions, type HubLintReport, type HubLintTarget, hubLintExit, knownSkillIn, type LintSkillOptions, linkTargets, lintHub, lintOwnedSkill, lintSkill, localTarget, markdownLines, } from "./core/hub-lint.js";
19
21
  export type { ExecutedImport, ImportExecution, PendingImport, PlannedSources, SourceEntry, SourceInventory, SourceOptions, SourceProvenance, } from "./core/import-sources.js";
20
22
  export { executeImports, inventorySkillRoot, inventorySource, membersFromInventories, planSourceMembers, provenanceFrom, releaseInventory, } from "./core/import-sources.js";
21
23
  export { type LockOptions, withLock } from "./core/lock.js";
@@ -23,6 +25,7 @@ export { isSkillName, isVersionComponent, parseManifest, readManifest } from "./
23
25
  export { migrate } from "./core/migration.js";
24
26
  export type { MigrationItem, MigrationMapping, MigrationOptions, MigrationResult, } from "./core/migration-types.js";
25
27
  export { type NormalizeOptions, normalizeScope } from "./core/normalization.js";
28
+ export { type OwnedDeclarations, type OwnedSkill, ownedDeclarations, ownedSkill, ownedSkills, } from "./core/owned-sources.js";
26
29
  export { addPackSkills, type CreatePackOptions, createPack, listPacks, removePackSkills, showPack, verifyPack, } from "./core/packs.js";
27
30
  export type { HermesRootSelection, ProfileCandidate, ProfileChange, ProfileListResult, ProfileLocalEntry, ProfileLocation, ProfileOptions, ProfileShowResult, ProfileSummary, ProfileSyncOptions, ProfileSyncResult, } from "./core/profile-types.js";
28
31
  export { listProfiles, showProfile, syncProfile } from "./core/profiles.js";