@warmhub/cli 0.64.0 → 0.66.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/dist/wh.js +130 -156
- package/package.json +1 -1
package/dist/wh.js
CHANGED
|
@@ -27292,7 +27292,6 @@ var SUBSCRIBABLE_EVENT_TYPES = [
|
|
|
27292
27292
|
];
|
|
27293
27293
|
// ../../packages/rules/src/system-components/system.ts
|
|
27294
27294
|
var SYSTEM_COMPONENT_ID = "com.warmhub.system";
|
|
27295
|
-
var SYSTEM_REGISTERED_COMPONENT_REF = "warmhub/system";
|
|
27296
27295
|
var COMPONENT_INSTALL_FIELDS = {
|
|
27297
27296
|
componentId: "string",
|
|
27298
27297
|
name: "string",
|
|
@@ -27353,7 +27352,7 @@ function findSystemComponent(componentId) {
|
|
|
27353
27352
|
// ../../packages/sdk-ts/package.json
|
|
27354
27353
|
var package_default = {
|
|
27355
27354
|
name: "@warmhub/sdk-ts",
|
|
27356
|
-
version: "0.
|
|
27355
|
+
version: "0.65.0",
|
|
27357
27356
|
private: false,
|
|
27358
27357
|
type: "module",
|
|
27359
27358
|
description: "The TypeScript SDK for WarmHub — create repos, commit and query data, and compound knowledge with your AI agents.",
|
|
@@ -28439,6 +28438,18 @@ class WarmHubClient {
|
|
|
28439
28438
|
throw toWarmHubError(error);
|
|
28440
28439
|
}
|
|
28441
28440
|
},
|
|
28441
|
+
history: async (orgName, repoName, opts) => {
|
|
28442
|
+
try {
|
|
28443
|
+
return await this.trpc.component.history.query({
|
|
28444
|
+
orgName,
|
|
28445
|
+
repoName,
|
|
28446
|
+
componentRef: opts?.componentRef,
|
|
28447
|
+
limit: opts?.limit
|
|
28448
|
+
});
|
|
28449
|
+
} catch (error) {
|
|
28450
|
+
throw toWarmHubError(error);
|
|
28451
|
+
}
|
|
28452
|
+
},
|
|
28442
28453
|
install: async (orgName, repoName, componentRef) => {
|
|
28443
28454
|
try {
|
|
28444
28455
|
return await this.trpc.component.install.mutate({
|
|
@@ -32744,17 +32755,37 @@ function escapeTerminalTextForDisplay(value) {
|
|
|
32744
32755
|
var escapeInlineTerminalText = escapeFieldNameForDisplay;
|
|
32745
32756
|
function renderWarningLine(out, c, chars, op) {
|
|
32746
32757
|
const warnings = op.warnings;
|
|
32747
|
-
if (!warnings
|
|
32758
|
+
if (!warnings)
|
|
32748
32759
|
return;
|
|
32749
|
-
|
|
32750
|
-
|
|
32760
|
+
renderUndeclaredFieldsWarning(out, c, chars, op.name, warnings);
|
|
32761
|
+
renderCoalescedWrefsWarning(out, c, chars, warnings);
|
|
32762
|
+
}
|
|
32763
|
+
function renderUndeclaredFieldsWarning(out, c, chars, opName, warnings) {
|
|
32764
|
+
const undeclaredFields = warnings.undeclaredFields;
|
|
32765
|
+
if (!undeclaredFields || undeclaredFields.length === 0)
|
|
32766
|
+
return;
|
|
32767
|
+
const shapeName = extractShapeName(opName);
|
|
32768
|
+
const total = warnings.totalUndeclared ?? undeclaredFields.length;
|
|
32751
32769
|
const noun = total === 1 ? "field" : "fields";
|
|
32752
32770
|
const shapeLabel = shapeName ? ` ${shapeName}` : "";
|
|
32753
|
-
const remaining = warnings.undeclaredFieldsTruncated ? total -
|
|
32754
|
-
const fieldsList =
|
|
32771
|
+
const remaining = warnings.undeclaredFieldsTruncated ? total - undeclaredFields.length : 0;
|
|
32772
|
+
const fieldsList = undeclaredFields.map(escapeInlineTerminalText).join(", ");
|
|
32755
32773
|
const moreSuffix = remaining > 0 ? ` ${c.dim}(+${remaining} more)${c.reset}` : "";
|
|
32756
32774
|
out(` ${c.yellow}${chars.warn}${c.reset} ${total} ${noun} not declared in shape${shapeLabel}: ${c.dim}${fieldsList}${c.reset}${moreSuffix}`);
|
|
32757
32775
|
}
|
|
32776
|
+
function renderCoalescedWrefsWarning(out, c, chars, warnings) {
|
|
32777
|
+
const coalescedWrefs = warnings.coalescedWrefs;
|
|
32778
|
+
if (!coalescedWrefs || coalescedWrefs.length === 0)
|
|
32779
|
+
return;
|
|
32780
|
+
for (const entry of coalescedWrefs) {
|
|
32781
|
+
out(` ${c.yellow}${chars.warn}${c.reset} coalesced wref ${escapeInlineTerminalText(entry.fieldPath)}: ${c.dim}${escapeInlineTerminalText(entry.wref)}${c.reset} (${escapeInlineTerminalText(entry.reason)})`);
|
|
32782
|
+
}
|
|
32783
|
+
const total = warnings.totalCoalescedWrefs ?? coalescedWrefs.length;
|
|
32784
|
+
const remaining = warnings.coalescedWrefsTruncated ? total - coalescedWrefs.length : 0;
|
|
32785
|
+
if (remaining > 0) {
|
|
32786
|
+
out(` ${c.dim}(+${remaining} more coalesced wrefs)${c.reset}`);
|
|
32787
|
+
}
|
|
32788
|
+
}
|
|
32758
32789
|
function renderCommitterEcho(out, c, committer) {
|
|
32759
32790
|
if (!committer)
|
|
32760
32791
|
return;
|
|
@@ -37882,6 +37913,24 @@ function isInstallSnapshotCacheShape(value) {
|
|
|
37882
37913
|
if (!Array.isArray(component.methods))
|
|
37883
37914
|
return false;
|
|
37884
37915
|
}
|
|
37916
|
+
if (!isPlainObject2(value.installs))
|
|
37917
|
+
return false;
|
|
37918
|
+
const installs = value.installs;
|
|
37919
|
+
for (const entry of Object.values(installs)) {
|
|
37920
|
+
if (!isPlainObject2(entry))
|
|
37921
|
+
return false;
|
|
37922
|
+
const install = entry;
|
|
37923
|
+
if (typeof install.ref !== "string")
|
|
37924
|
+
return false;
|
|
37925
|
+
if (typeof install.version !== "string")
|
|
37926
|
+
return false;
|
|
37927
|
+
if (install.latestVersion !== undefined && typeof install.latestVersion !== "string") {
|
|
37928
|
+
return false;
|
|
37929
|
+
}
|
|
37930
|
+
if (install.updateAvailable !== undefined && typeof install.updateAvailable !== "boolean") {
|
|
37931
|
+
return false;
|
|
37932
|
+
}
|
|
37933
|
+
}
|
|
37885
37934
|
return true;
|
|
37886
37935
|
}
|
|
37887
37936
|
|
|
@@ -37955,6 +38004,7 @@ async function refreshInstallSnapshotCache(repoSlug, client, opts) {
|
|
|
37955
38004
|
}
|
|
37956
38005
|
async function refreshFromSummaries(repoSlug, parsed, activeItems, client, now, previousCache) {
|
|
37957
38006
|
const components = {};
|
|
38007
|
+
const installs = {};
|
|
37958
38008
|
let detailReadFailures = 0;
|
|
37959
38009
|
for (const item of activeItems) {
|
|
37960
38010
|
if (!item.ref)
|
|
@@ -37971,13 +38021,20 @@ async function refreshFromSummaries(repoSlug, parsed, activeItems, client, now,
|
|
|
37971
38021
|
}
|
|
37972
38022
|
continue;
|
|
37973
38023
|
}
|
|
37974
|
-
|
|
37975
|
-
|
|
37976
|
-
|
|
38024
|
+
if (!detail.installedManifest || typeof detail.installedManifest !== "object") {
|
|
38025
|
+
throw new Error(`component.get returned no installedManifest for ${itemRef}; the backend must support GH-4690 (installedManifest on component.get)`);
|
|
38026
|
+
}
|
|
38027
|
+
const manifest = detail.installedManifest;
|
|
38028
|
+
installs[item.componentName] = {
|
|
38029
|
+
ref: itemRef,
|
|
38030
|
+
version: manifest.component.version ?? item.version ?? "",
|
|
38031
|
+
latestVersion: item.latestVersion,
|
|
38032
|
+
updateAvailable: item.updateAvailable
|
|
38033
|
+
};
|
|
37977
38034
|
const methods = manifest.cli?.methods ?? [];
|
|
37978
38035
|
if (methods.length === 0)
|
|
37979
38036
|
continue;
|
|
37980
|
-
const ref = extractRegisteredRef(
|
|
38037
|
+
const ref = extractRegisteredRef(itemRef);
|
|
37981
38038
|
if (!ref)
|
|
37982
38039
|
continue;
|
|
37983
38040
|
components[item.componentName] = {
|
|
@@ -37987,7 +38044,9 @@ async function refreshFromSummaries(repoSlug, parsed, activeItems, client, now,
|
|
|
37987
38044
|
version: manifest.component.version ?? item.version ?? "",
|
|
37988
38045
|
description: manifest.cli?.description,
|
|
37989
38046
|
manifestHash: item.manifestHash ?? "",
|
|
37990
|
-
methods
|
|
38047
|
+
methods,
|
|
38048
|
+
latestVersion: item.latestVersion,
|
|
38049
|
+
updateAvailable: item.updateAvailable
|
|
37991
38050
|
};
|
|
37992
38051
|
}
|
|
37993
38052
|
if (activeItems.length > 0 && detailReadFailures === activeItems.length) {
|
|
@@ -37999,7 +38058,8 @@ async function refreshFromSummaries(repoSlug, parsed, activeItems, client, now,
|
|
|
37999
38058
|
const cache = {
|
|
38000
38059
|
cachedAt: now,
|
|
38001
38060
|
repoSlug,
|
|
38002
|
-
components
|
|
38061
|
+
components,
|
|
38062
|
+
installs
|
|
38003
38063
|
};
|
|
38004
38064
|
writeInstallSnapshotCache(repoSlug, cache);
|
|
38005
38065
|
return cache;
|
|
@@ -38020,10 +38080,7 @@ async function fetchAllSummaries(client, org, repo) {
|
|
|
38020
38080
|
function filterActiveItems(items) {
|
|
38021
38081
|
return items.filter((i) => i.active && i.state !== "uninstalled" && i.state !== "paused" && i.state !== "error");
|
|
38022
38082
|
}
|
|
38023
|
-
function extractRegisteredRef(
|
|
38024
|
-
if (typeof data !== "object" || data === null)
|
|
38025
|
-
return null;
|
|
38026
|
-
const ref = data.registeredComponentRef;
|
|
38083
|
+
function extractRegisteredRef(ref) {
|
|
38027
38084
|
if (typeof ref !== "string" || ref.length === 0)
|
|
38028
38085
|
return null;
|
|
38029
38086
|
const segments = ref.split("/");
|
|
@@ -38034,27 +38091,6 @@ function extractRegisteredRef(data) {
|
|
|
38034
38091
|
return null;
|
|
38035
38092
|
return { ownerOrgName: org, registeredComponentName: name };
|
|
38036
38093
|
}
|
|
38037
|
-
function extractInstalledManifest(data) {
|
|
38038
|
-
if (typeof data !== "object" || data === null)
|
|
38039
|
-
return null;
|
|
38040
|
-
const raw = data.manifest;
|
|
38041
|
-
let manifest;
|
|
38042
|
-
if (typeof raw === "string") {
|
|
38043
|
-
try {
|
|
38044
|
-
manifest = JSON.parse(raw);
|
|
38045
|
-
} catch {
|
|
38046
|
-
return null;
|
|
38047
|
-
}
|
|
38048
|
-
} else {
|
|
38049
|
-
manifest = raw;
|
|
38050
|
-
}
|
|
38051
|
-
if (typeof manifest !== "object" || manifest === null)
|
|
38052
|
-
return null;
|
|
38053
|
-
const component = manifest.component;
|
|
38054
|
-
if (typeof component !== "object" || component === null)
|
|
38055
|
-
return null;
|
|
38056
|
-
return manifest;
|
|
38057
|
-
}
|
|
38058
38094
|
|
|
38059
38095
|
// ../../packages/warmhub-cli/src/manifest.ts
|
|
38060
38096
|
var GLOBAL_FLAGS = [
|
|
@@ -38365,6 +38401,13 @@ var handleComponentExec = async (ctx, { args, terminator }) => {
|
|
|
38365
38401
|
const cache = await ensureFreshInstallSnapshotCache(installRepo, ctx.client);
|
|
38366
38402
|
const entry = cache.components[componentName];
|
|
38367
38403
|
if (!entry) {
|
|
38404
|
+
const install = cache.installs[componentName];
|
|
38405
|
+
if (install?.updateAvailable && install.latestVersion) {
|
|
38406
|
+
throw new CliError(2 /* UserInput */, "USER_INPUT", `Component '${componentName}' is installed at ${install.version || "an older version"} in ${installRepo}, which exposes no CLI method${methodName ? ` '${methodName}'` : "s"}.`, undefined, `Version ${install.latestVersion} is available — run 'wh component update ${install.ref} --repo ${installRepo}', then 'wh component exec ${componentName} --help' to see its methods.`);
|
|
38407
|
+
}
|
|
38408
|
+
if (install) {
|
|
38409
|
+
throw new CliError(2 /* UserInput */, "USER_INPUT", `Component '${componentName}' is installed in ${installRepo} but exposes no CLI methods.`);
|
|
38410
|
+
}
|
|
38368
38411
|
throw new CliError(2 /* UserInput */, "USER_INPUT", `Component '${componentName}' is not installed in ${installRepo}.`, undefined, `Run 'wh component install <ref> --repo ${installRepo}' first.`);
|
|
38369
38412
|
}
|
|
38370
38413
|
if (!methodName) {
|
|
@@ -38376,7 +38419,9 @@ var handleComponentExec = async (ctx, { args, terminator }) => {
|
|
|
38376
38419
|
}
|
|
38377
38420
|
const method = entry.methods.find((m) => m.name === methodName);
|
|
38378
38421
|
if (!method) {
|
|
38379
|
-
|
|
38422
|
+
const available = entry.methods.map((m) => m.name).join(", ");
|
|
38423
|
+
const updateHint = entry.updateAvailable && entry.latestVersion ? `Version ${entry.latestVersion} is available — run wh component update ${entry.ref} --repo ${installRepo} for newer methods.` : `Run wh component update ${entry.ref} --repo ${installRepo} if you expect a newer method.`;
|
|
38424
|
+
throw new CliError(2 /* UserInput */, "USER_INPUT", `Method '${methodName}' not found on component '${componentName}'.`, undefined, `Available: ${available}. ${updateHint}`);
|
|
38380
38425
|
}
|
|
38381
38426
|
if (helpRequested) {
|
|
38382
38427
|
renderMethodHelp(ctx, componentName, method);
|
|
@@ -38697,6 +38742,9 @@ function renderTeardownResult(ctx, result) {
|
|
|
38697
38742
|
if (result.pausedSubscriptions.length > 0) {
|
|
38698
38743
|
ctx.out(` ${c.green}paused${c.reset} ${result.pausedSubscriptions.length} subscription(s): ${result.pausedSubscriptions.join(", ")}`);
|
|
38699
38744
|
}
|
|
38745
|
+
if (result.releasedShapes.length > 0) {
|
|
38746
|
+
ctx.out(` ${c.green}released${c.reset} ${result.releasedShapes.length} shape(s): ${result.releasedShapes.join(", ")}`);
|
|
38747
|
+
}
|
|
38700
38748
|
if (result.tokensRevoked > 0) {
|
|
38701
38749
|
ctx.out(` ${c.green}revoked${c.reset} ${result.tokensRevoked} token(s)`);
|
|
38702
38750
|
}
|
|
@@ -38856,46 +38904,6 @@ function readManifestArg(path2) {
|
|
|
38856
38904
|
}
|
|
38857
38905
|
return parsed;
|
|
38858
38906
|
}
|
|
38859
|
-
function asRecord(value) {
|
|
38860
|
-
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
38861
|
-
return;
|
|
38862
|
-
}
|
|
38863
|
-
return value;
|
|
38864
|
-
}
|
|
38865
|
-
function readString(data, key) {
|
|
38866
|
-
const candidate = data?.[key];
|
|
38867
|
-
return typeof candidate === "string" && candidate.length > 0 ? candidate : undefined;
|
|
38868
|
-
}
|
|
38869
|
-
function componentInstallIdFromWref(wref) {
|
|
38870
|
-
const prefix = "ComponentInstall/";
|
|
38871
|
-
return wref.startsWith(prefix) ? wref.slice(prefix.length) : undefined;
|
|
38872
|
-
}
|
|
38873
|
-
function componentInstallCanonicalId(item) {
|
|
38874
|
-
const data = asRecord(item.data);
|
|
38875
|
-
return componentInstallIdFromWref(item.wref) ?? readString(data, "id") ?? readString(data, "componentId") ?? item.name;
|
|
38876
|
-
}
|
|
38877
|
-
function componentInstallHasRegisteredRef(item, ref) {
|
|
38878
|
-
return readString(asRecord(item.data), "registeredComponentRef") === ref;
|
|
38879
|
-
}
|
|
38880
|
-
async function resolveInstalledComponentRefId(client, org, repo, ref) {
|
|
38881
|
-
let cursor;
|
|
38882
|
-
do {
|
|
38883
|
-
const result = await client.thing.head(org, repo, {
|
|
38884
|
-
shape: "ComponentInstall",
|
|
38885
|
-
kind: "thing",
|
|
38886
|
-
limit: 500,
|
|
38887
|
-
cursor
|
|
38888
|
-
});
|
|
38889
|
-
const items = result.items ?? [];
|
|
38890
|
-
const exactMatch = items.find((item) => componentInstallHasRegisteredRef(item, ref));
|
|
38891
|
-
const resolved = exactMatch ? componentInstallCanonicalId(exactMatch) : undefined;
|
|
38892
|
-
if (resolved) {
|
|
38893
|
-
return resolved;
|
|
38894
|
-
}
|
|
38895
|
-
cursor = result.nextCursor;
|
|
38896
|
-
} while (cursor);
|
|
38897
|
-
throw new CliError(2 /* UserInput */, "USER_INPUT", `Component '${ref}' is not installed. Run 'wh component install <org>/<name>' first.`);
|
|
38898
|
-
}
|
|
38899
38907
|
|
|
38900
38908
|
// ../../packages/warmhub-cli/src/domains/component-handlers.ts
|
|
38901
38909
|
var handleUpdate = async (ctx, { args }) => {
|
|
@@ -39025,8 +39033,9 @@ var handleView3 = async (ctx, { args }) => {
|
|
|
39025
39033
|
writeOutput(ctx, viewData, () => {
|
|
39026
39034
|
const c = ctx.colors;
|
|
39027
39035
|
ctx.out(`${c.bold}Component:${c.reset} ${c.cyan}${viewData.ref ?? ref}${c.reset}`);
|
|
39028
|
-
|
|
39029
|
-
ctx.out(`${c.bold}
|
|
39036
|
+
const update = viewData.updateAvailable && viewData.latestVersion ? ` ${c.yellow}(${viewData.latestVersion} available — run wh component update ${viewData.ref ?? ref} --repo ${org}/${repo})${c.reset}` : "";
|
|
39037
|
+
ctx.out(`${c.bold}Version:${c.reset} ${viewData.version ?? "unknown"}${update}`);
|
|
39038
|
+
ctx.out(`${c.bold}Lifecycle:${c.reset} ${viewData.state ?? "-"}`);
|
|
39030
39039
|
ctx.out(`${c.bold}Source:${c.reset} ${viewData.source ?? "-"}`);
|
|
39031
39040
|
if (viewData.ownedShapes.length > 0) {
|
|
39032
39041
|
ctx.out("");
|
|
@@ -39077,67 +39086,37 @@ var handleValidate = async (ctx, { args }) => {
|
|
|
39077
39086
|
throw new CliError(2 /* UserInput */, "USER_INPUT", "Component package validation failed");
|
|
39078
39087
|
}
|
|
39079
39088
|
};
|
|
39080
|
-
// ../../packages/warmhub-cli/src/manifest/shared-infra.ts
|
|
39081
|
-
var SHARED_INFRA_SHAPES = findSystemComponent(SYSTEM_COMPONENT_ID)?.shapes ?? [];
|
|
39082
|
-
|
|
39083
39089
|
// ../../packages/warmhub-cli/src/manifest/doctor.ts
|
|
39084
|
-
async function doctorComponent(client, org, repo,
|
|
39090
|
+
async function doctorComponent(client, org, repo, ref) {
|
|
39085
39091
|
const findings = [];
|
|
39086
|
-
let
|
|
39092
|
+
let detail;
|
|
39087
39093
|
try {
|
|
39088
|
-
|
|
39089
|
-
installData = thing.data && typeof thing.data === "object" ? thing.data : {};
|
|
39094
|
+
detail = await client.component.get(org, repo, ref);
|
|
39090
39095
|
findings.push({
|
|
39091
|
-
resource: "
|
|
39096
|
+
resource: "install",
|
|
39092
39097
|
status: "ok",
|
|
39093
39098
|
message: "Install record found"
|
|
39094
39099
|
});
|
|
39095
|
-
} catch {
|
|
39100
|
+
} catch (err) {
|
|
39101
|
+
const kind = isWarmHubError(err) ? err.kind : undefined;
|
|
39102
|
+
const notInstalled = kind === "NOT_FOUND";
|
|
39096
39103
|
return {
|
|
39097
|
-
componentId,
|
|
39098
|
-
componentName:
|
|
39099
|
-
state: "error",
|
|
39104
|
+
componentId: ref,
|
|
39105
|
+
componentName: ref,
|
|
39106
|
+
state: notInstalled ? "uninstalled" : "error",
|
|
39100
39107
|
findings: [
|
|
39101
39108
|
{
|
|
39102
|
-
resource: "
|
|
39109
|
+
resource: "install",
|
|
39103
39110
|
status: "missing",
|
|
39104
|
-
message: `
|
|
39111
|
+
message: notInstalled ? `Component "${ref}" is not actively installed` : `Failed to resolve component "${ref}"`
|
|
39105
39112
|
}
|
|
39106
39113
|
]
|
|
39107
39114
|
};
|
|
39108
39115
|
}
|
|
39109
|
-
const componentName =
|
|
39110
|
-
const
|
|
39111
|
-
|
|
39112
|
-
|
|
39113
|
-
resource: "ComponentInstall",
|
|
39114
|
-
status: "error",
|
|
39115
|
-
message: "Install record is missing registeredComponentRef"
|
|
39116
|
-
});
|
|
39117
|
-
return { componentId, componentName, state: "error", findings };
|
|
39118
|
-
}
|
|
39119
|
-
const existingState = typeof installData.state === "string" ? installData.state : undefined;
|
|
39120
|
-
if (existingState === "error") {
|
|
39121
|
-
findings.push({
|
|
39122
|
-
resource: "state",
|
|
39123
|
-
status: "error",
|
|
39124
|
-
message: "Component is in error state from a previous operation"
|
|
39125
|
-
});
|
|
39126
|
-
return { componentId, componentName, state: "error", findings };
|
|
39127
|
-
}
|
|
39128
|
-
if (existingState === "uninstalled") {
|
|
39129
|
-
findings.push({
|
|
39130
|
-
resource: "state",
|
|
39131
|
-
status: "inactive",
|
|
39132
|
-
message: "Component is uninstalled; reinstall to revive it"
|
|
39133
|
-
});
|
|
39134
|
-
return { componentId, componentName, state: "uninstalled", findings };
|
|
39135
|
-
}
|
|
39136
|
-
let manifest;
|
|
39137
|
-
try {
|
|
39138
|
-
const raw = typeof installData.manifest === "string" ? installData.manifest : undefined;
|
|
39139
|
-
manifest = raw ? JSON.parse(raw) : { shapes: [], subscriptions: [], credentials: [], seeds: [] };
|
|
39140
|
-
} catch {
|
|
39116
|
+
const componentName = detail.componentName;
|
|
39117
|
+
const componentId = detail.installComponentId ?? ref;
|
|
39118
|
+
const registeredComponentRef = detail.ref ?? ref;
|
|
39119
|
+
if (!detail.installedManifest || typeof detail.installedManifest !== "object") {
|
|
39141
39120
|
return {
|
|
39142
39121
|
componentId,
|
|
39143
39122
|
componentName,
|
|
@@ -39147,11 +39126,12 @@ async function doctorComponent(client, org, repo, componentId) {
|
|
|
39147
39126
|
{
|
|
39148
39127
|
resource: "manifest",
|
|
39149
39128
|
status: "error",
|
|
39150
|
-
message: "
|
|
39129
|
+
message: "Installed manifest unavailable from the registry"
|
|
39151
39130
|
}
|
|
39152
39131
|
]
|
|
39153
39132
|
};
|
|
39154
39133
|
}
|
|
39134
|
+
const manifest = detail.installedManifest;
|
|
39155
39135
|
for (const shape of manifest.shapes ?? []) {
|
|
39156
39136
|
try {
|
|
39157
39137
|
const s = await client.shape.get(org, repo, shape.name);
|
|
@@ -39282,6 +39262,19 @@ async function doctorComponent(client, org, repo, componentId) {
|
|
|
39282
39262
|
});
|
|
39283
39263
|
}
|
|
39284
39264
|
}
|
|
39265
|
+
if (detail.updateAvailable === true && detail.latestVersion) {
|
|
39266
|
+
findings.push({
|
|
39267
|
+
resource: "version",
|
|
39268
|
+
status: "warning",
|
|
39269
|
+
message: `Installed ${detail.version ?? "version"}; ${detail.latestVersion} available — run wh component update ${registeredComponentRef} --repo ${org}/${repo}`
|
|
39270
|
+
});
|
|
39271
|
+
} else if (detail.updateAvailable === false && detail.version) {
|
|
39272
|
+
findings.push({
|
|
39273
|
+
resource: "version",
|
|
39274
|
+
status: "ok",
|
|
39275
|
+
message: `Up to date (${detail.version})`
|
|
39276
|
+
});
|
|
39277
|
+
}
|
|
39285
39278
|
const hasMissing = findings.some((f) => f.status === "missing");
|
|
39286
39279
|
const hasInactive = findings.some((f) => f.status === "inactive" && !f.resource.startsWith("sub:"));
|
|
39287
39280
|
const hasShapeDrift = findings.some((f) => f.resource.startsWith("shape:") && f.status === "warning" && f.message.includes("differs from installed manifest"));
|
|
@@ -39294,22 +39287,6 @@ async function doctorComponent(client, org, repo, componentId) {
|
|
|
39294
39287
|
} else {
|
|
39295
39288
|
state = "ready";
|
|
39296
39289
|
}
|
|
39297
|
-
try {
|
|
39298
|
-
await client.commit.apply(org, repo, `Doctor: update ${componentName} state to ${state}`, [
|
|
39299
|
-
{
|
|
39300
|
-
operation: "revise",
|
|
39301
|
-
kind: "thing",
|
|
39302
|
-
name: `ComponentInstall/${componentId}`,
|
|
39303
|
-
data: { ...installData, state, checkedAt: new Date().toISOString() }
|
|
39304
|
-
}
|
|
39305
|
-
], { componentRef: SYSTEM_REGISTERED_COMPONENT_REF });
|
|
39306
|
-
} catch {
|
|
39307
|
-
findings.push({
|
|
39308
|
-
resource: "state-update",
|
|
39309
|
-
status: "warning",
|
|
39310
|
-
message: "Failed to persist computed state"
|
|
39311
|
-
});
|
|
39312
|
-
}
|
|
39313
39290
|
return { componentId, componentName, state, findings };
|
|
39314
39291
|
}
|
|
39315
39292
|
|
|
@@ -39320,8 +39297,7 @@ var handleDoctor = async (ctx, { args }) => {
|
|
|
39320
39297
|
usageError("Usage: wh component doctor <org/name> --repo org/repo", "wh component doctor warmhub/research-knowledge --repo myorg/myrepo");
|
|
39321
39298
|
}
|
|
39322
39299
|
const { org, repo } = parseOrgRepo(getRepoRef(ctx), ctx.config);
|
|
39323
|
-
const
|
|
39324
|
-
const result = await doctorComponent(ctx.client, org, repo, componentId);
|
|
39300
|
+
const result = await doctorComponent(ctx.client, org, repo, name);
|
|
39325
39301
|
writeOutput(ctx, result, () => renderDoctorResult(ctx, result));
|
|
39326
39302
|
};
|
|
39327
39303
|
var handleTeardown = async (ctx, { args }) => {
|
|
@@ -39426,7 +39402,8 @@ var handleList2 = async (ctx, { flags }) => {
|
|
|
39426
39402
|
const state = item.state ?? "unknown";
|
|
39427
39403
|
const source = item.source ?? "-";
|
|
39428
39404
|
const stateColor = stateToColor2(c, state);
|
|
39429
|
-
|
|
39405
|
+
const update = item.updateAvailable && item.latestVersion ? ` ${c.yellow}(${item.latestVersion} available)${c.reset}` : "";
|
|
39406
|
+
ctx.out(` ${c.cyan}${item.ref ?? item.componentName}${c.reset} ${stateColor}${state}${c.reset} ${c.dim}v${version}${c.reset}${update} ${source}`);
|
|
39430
39407
|
}
|
|
39431
39408
|
});
|
|
39432
39409
|
};
|
|
@@ -39451,16 +39428,11 @@ var handleSearch2 = async (ctx, { flags, args }) => {
|
|
|
39451
39428
|
};
|
|
39452
39429
|
function stateToColor2(c, state) {
|
|
39453
39430
|
switch (state) {
|
|
39454
|
-
case "
|
|
39431
|
+
case "active":
|
|
39455
39432
|
return c.green;
|
|
39456
|
-
case "paused":
|
|
39457
39433
|
case "uninstalled":
|
|
39458
39434
|
return c.yellow;
|
|
39459
|
-
case "
|
|
39460
|
-
return c.red;
|
|
39461
|
-
case "error":
|
|
39462
|
-
return c.red;
|
|
39463
|
-
case "installing":
|
|
39435
|
+
case "initiated":
|
|
39464
39436
|
return c.cyan;
|
|
39465
39437
|
default:
|
|
39466
39438
|
return c.dim;
|
|
@@ -45415,6 +45387,8 @@ async function dispatch(ctx) {
|
|
|
45415
45387
|
const hint = ctx._domainHint ? ` ${ctx._domainHint}` : "";
|
|
45416
45388
|
throw new CliError(2 /* UserInput */, "USER_INPUT", `Unknown command: ${command}`, undefined, hint.trim() || "Run 'wh help' for available commands.");
|
|
45417
45389
|
}
|
|
45390
|
+
// ../../packages/warmhub-cli/src/manifest/shared-infra.ts
|
|
45391
|
+
var SHARED_INFRA_SHAPES = findSystemComponent(SYSTEM_COMPONENT_ID)?.shapes ?? [];
|
|
45418
45392
|
// ../../packages/warmhub-cli/src/apply-global-flags.ts
|
|
45419
45393
|
function invokesRemovedVerb(ctx) {
|
|
45420
45394
|
return ctx.invocation.command === "credential" && ctx.invocation.positional[0] === "export";
|
|
@@ -45761,7 +45735,7 @@ function resolveLogLevel(flags, env) {
|
|
|
45761
45735
|
// package.json
|
|
45762
45736
|
var package_default3 = {
|
|
45763
45737
|
name: "@warmhub/cli",
|
|
45764
|
-
version: "0.
|
|
45738
|
+
version: "0.66.0",
|
|
45765
45739
|
private: false,
|
|
45766
45740
|
type: "module",
|
|
45767
45741
|
description: "The wh CLI for WarmHub — create repos, commit and query data, and compound knowledge with your AI agents.",
|
|
@@ -46416,4 +46390,4 @@ if (!updateCheckSuppressedByArgv && shouldRunUpdateCheck(updateEligibility)) {
|
|
|
46416
46390
|
var interceptedExitCode = await maybeHandleComponentShellBoundary(dispatchArgv);
|
|
46417
46391
|
process.exitCode = interceptedExitCode === undefined ? await runCli(dispatchArgv, { version: package_default3.version }) : interceptedExitCode;
|
|
46418
46392
|
|
|
46419
|
-
//# debugId=
|
|
46393
|
+
//# debugId=C5B05FE58189780B64756E2164756E21
|
package/package.json
CHANGED