@iseoane/agent-depot 0.6.7 → 0.6.8
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 +14 -0
- package/dist/src/package-bundles.js +3 -3
- package/dist/src/package-cli.js +7 -3
- package/dist/src/package-flow.js +20 -7
- package/dist/src/package-host-plans.js +18 -3
- package/dist/src/tui/installations-rows.js +1 -1
- package/dist/src/tui/package-rows.js +12 -8
- package/dist/src/tui/updates-panel.js +1 -1
- package/dist/src/tui/updates.js +4 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.6.8] - 2026-11-04
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- Versioned Claude Packages now follow the Host's literal plugin cache version,
|
|
15
|
+
with the plugin manifest taking precedence over marketplace metadata. A newer
|
|
16
|
+
Source commit at the same version is explained instead of offered as an update
|
|
17
|
+
Claude cannot apply. Successful literal-version changes are recognized even
|
|
18
|
+
when the commit is unchanged or the version strings normalize identically.
|
|
19
|
+
- Package comparisons and results in the CLI and TUI now show the observed Host
|
|
20
|
+
version and commit together. Remembered evidence is labelled as recorded;
|
|
21
|
+
Pi updates between different commits at the same manifest version remain
|
|
22
|
+
available when verified Source ancestry proves progress.
|
|
23
|
+
|
|
10
24
|
## [0.6.7] - 2026-11-04
|
|
11
25
|
|
|
12
26
|
### Fixed
|
|
@@ -56,8 +56,8 @@ export function parseClaudePluginManifest(raw, root) {
|
|
|
56
56
|
/**
|
|
57
57
|
* Reads one marketplace and returns a descriptor per `plugins` entry. The
|
|
58
58
|
* `readPluginManifest` resolver supplies the raw plugin.json for an in-repo
|
|
59
|
-
* entry
|
|
60
|
-
*
|
|
59
|
+
* entry. The plugin manifest owns the component inventory and, when declared,
|
|
60
|
+
* its version takes precedence over marketplace entry metadata, as in Claude.
|
|
61
61
|
* A `command` source and any source outside the repository yield a descriptor
|
|
62
62
|
* with a warning rather than a throw.
|
|
63
63
|
*/
|
|
@@ -330,7 +330,7 @@ function buildMarketplaceDescriptor(entry, label, marketplaceRoot, metadataPlugi
|
|
|
330
330
|
warnings.push(`marketplace entry name ${JSON.stringify(entryName)} differs from plugin manifest name ${JSON.stringify(plugin.name)}`);
|
|
331
331
|
}
|
|
332
332
|
const entryVersion = manifestVersionEvidence(entry.version, "marketplace-entry");
|
|
333
|
-
const version =
|
|
333
|
+
const version = plugin.version ?? entryVersion;
|
|
334
334
|
return Object.freeze({
|
|
335
335
|
host: "claude",
|
|
336
336
|
coordinates: Object.freeze({ host: "claude", marketplaceRoot, pluginName: entryName }),
|
package/dist/src/package-cli.js
CHANGED
|
@@ -92,7 +92,9 @@ export function packageSelectionMatches(selection, value) {
|
|
|
92
92
|
export function describePackageUpdateCheck(check) {
|
|
93
93
|
const available = check.available === undefined ? "unknown" : describeVersion(check.available);
|
|
94
94
|
const reason = check.reason === undefined ? "" : `; ${check.reason}`;
|
|
95
|
-
|
|
95
|
+
const installed = check.observed === undefined ? "unknown (host evidence unavailable)" : describeEvidence(check.observed);
|
|
96
|
+
const commit = check.available?.kind === "manifest-version" && check.availableCommit !== undefined ? `; commit ${check.availableCommit}` : "";
|
|
97
|
+
return `Package ${formatPackageSelection(check.installed.selection)}: ${check.status}; available ${available}${commit}${reason}; host ${installed}`;
|
|
96
98
|
}
|
|
97
99
|
export function describePackageResult(result) {
|
|
98
100
|
switch (result.status) {
|
|
@@ -318,7 +320,9 @@ function formatPackageRecord(record) {
|
|
|
318
320
|
function describeInspection(selection, inspection, output) {
|
|
319
321
|
output(`Package inspect: ${formatPackageSelection(selection)}`);
|
|
320
322
|
output(` installed: ${describeEvidence(inspection.installed)}`);
|
|
321
|
-
output(` available: ${inspection.available === undefined ? "unknown" : describeVersion(inspection.available)}`);
|
|
323
|
+
output(` available: ${inspection.available === undefined ? "unknown" : describeVersion(inspection.available)}${inspection.availableCommit === undefined || inspection.available?.kind === "git-commit" ? "" : `; commit ${inspection.availableCommit}`}`);
|
|
324
|
+
if (inspection.updateReason !== undefined)
|
|
325
|
+
output(` update: ${inspection.updateReason}`);
|
|
322
326
|
output(` approval: ${inspection.approval}`);
|
|
323
327
|
if (inspection.drift !== undefined) {
|
|
324
328
|
output(` drift: ${inspection.drift}`);
|
|
@@ -389,7 +393,7 @@ function describeEvidence(evidence) {
|
|
|
389
393
|
case "installed": {
|
|
390
394
|
if (evidence.version !== undefined) {
|
|
391
395
|
const qualifier = evidence.reason === undefined ? "" : " (HEAD; local changes)";
|
|
392
|
-
return `installed ${evidence.version}${qualifier}`;
|
|
396
|
+
return `installed ${evidence.version}${evidence.commit === undefined ? "" : ` (commit ${evidence.commit})`}${qualifier}`;
|
|
393
397
|
}
|
|
394
398
|
if (evidence.commit !== undefined) {
|
|
395
399
|
return `installed commit ${evidence.commit}`;
|
package/dist/src/package-flow.js
CHANGED
|
@@ -4,7 +4,7 @@ import { sameAppVersion } from "./app-version.js";
|
|
|
4
4
|
import { createPortableExecutableResolver } from "./executable-resolution.js";
|
|
5
5
|
import { claudeMarketplaceName, discoverBundlesInSnapshot } from "./package-bundles.js";
|
|
6
6
|
import { sourceBundleScope } from "./package-content.js";
|
|
7
|
-
import { affectedBy, classifyUpdate, hostInstallId, packageApprovalDigest, planHostSteps, PackagePlanError, } from "./package-host-plans.js";
|
|
7
|
+
import { affectedBy, classifyUpdate, claudeVersionUpdateNotice, hostInstallId, packageApprovalDigest, planHostSteps, PackagePlanError, } from "./package-host-plans.js";
|
|
8
8
|
import { findInstalledBundle, readHostInstallView } from "./package-host-state.js";
|
|
9
9
|
import { activeBundles as classifyActiveBundles, portableSkillConflicts, } from "./package-owned-skills.js";
|
|
10
10
|
import { bundleRoot, describeCoordinates, selectionKey, } from "./package-model.js";
|
|
@@ -174,7 +174,9 @@ export function createPackageOperations(environment = {}) {
|
|
|
174
174
|
const installedCommitIsAncestor = bundle?.resolvedCommit === undefined || installed.kind !== "installed" || installed.commit === undefined
|
|
175
175
|
? undefined
|
|
176
176
|
: await contentAccess.isCommitAncestor?.(bundle.source, installed.commit, bundle.resolvedCommit).catch(() => undefined);
|
|
177
|
+
const updateReason = claudeVersionUpdateNotice(selection.host, installed, bundle?.available, bundle?.resolvedCommit);
|
|
177
178
|
return Object.freeze({
|
|
179
|
+
...(updateReason === undefined ? {} : { updateReason }),
|
|
178
180
|
...(bundle === undefined ? {} : { descriptor: bundle.descriptor }),
|
|
179
181
|
installed,
|
|
180
182
|
...(bundle?.available === undefined ? {} : { available: bundle.available }),
|
|
@@ -187,13 +189,16 @@ export function createPackageOperations(environment = {}) {
|
|
|
187
189
|
async function checkOne(record) {
|
|
188
190
|
try {
|
|
189
191
|
const inspection = await inspect(record.selection);
|
|
190
|
-
const status = classifyUpdate(inspection.installed, inspection.available, inspection.availableCommit, inspection.installedCommitIsAncestor);
|
|
192
|
+
const status = classifyUpdate(inspection.installed, inspection.available, inspection.availableCommit, inspection.installedCommitIsAncestor, record.selection.host);
|
|
191
193
|
return Object.freeze({
|
|
192
194
|
installed: record,
|
|
195
|
+
observed: inspection.installed,
|
|
193
196
|
status,
|
|
194
197
|
...(inspection.available === undefined ? {} : { available: inspection.available }),
|
|
195
198
|
...(inspection.availableCommit === undefined ? {} : { availableCommit: inspection.availableCommit }),
|
|
196
|
-
...(status === "unknown"
|
|
199
|
+
...(status === "unknown"
|
|
200
|
+
? { reason: inspection.drift ?? describeEvidence(inspection.installed) }
|
|
201
|
+
: inspection.updateReason === undefined ? {} : { reason: inspection.updateReason }),
|
|
197
202
|
});
|
|
198
203
|
}
|
|
199
204
|
catch (error) {
|
|
@@ -234,7 +239,7 @@ export function createPackageOperations(environment = {}) {
|
|
|
234
239
|
if (contradiction !== undefined) {
|
|
235
240
|
return { status: "failed", reason: `${contradiction}; the selection record was left untouched` };
|
|
236
241
|
}
|
|
237
|
-
const change = installedEvidenceChange(context.previous, observed);
|
|
242
|
+
const change = installedEvidenceChange(context.previous, observed, context.selection.host, context.available);
|
|
238
243
|
if (change === "unknown") {
|
|
239
244
|
return {
|
|
240
245
|
status: "failed",
|
|
@@ -242,9 +247,10 @@ export function createPackageOperations(environment = {}) {
|
|
|
242
247
|
};
|
|
243
248
|
}
|
|
244
249
|
if (change === "unchanged") {
|
|
250
|
+
const notice = claudeVersionUpdateNotice(context.selection.host, observed, context.available, context.origin.resolvedCommit);
|
|
245
251
|
return {
|
|
246
252
|
status: "failed",
|
|
247
|
-
reason: `The observed version did not change (${describeEvidence(observed)}); the selection record was left untouched`,
|
|
253
|
+
reason: `The observed version did not change (${describeEvidence(observed)}); the selection record was left untouched${notice === undefined ? "" : `. ${notice}`}`,
|
|
248
254
|
};
|
|
249
255
|
}
|
|
250
256
|
await writeSelection(context, observed);
|
|
@@ -524,15 +530,22 @@ function planDifference(plan, fresh) {
|
|
|
524
530
|
/**
|
|
525
531
|
* Three outcomes, not two. `unknown` means the two observations carry no
|
|
526
532
|
* comparable evidence, and an update must not report that as a success. A host
|
|
527
|
-
* that had nothing installed and now reports an install has changed.
|
|
533
|
+
* that had nothing installed and now reports an install has changed. Versioned
|
|
534
|
+
* Claude plugins use literal cache versions, just as update eligibility does.
|
|
528
535
|
*/
|
|
529
|
-
function installedEvidenceChange(previous, observed) {
|
|
536
|
+
function installedEvidenceChange(previous, observed, host, available) {
|
|
530
537
|
if (observed.kind !== "installed" || previous === undefined || previous.kind === "unknown") {
|
|
531
538
|
return "unknown";
|
|
532
539
|
}
|
|
533
540
|
if (previous.kind === "absent") {
|
|
534
541
|
return "changed";
|
|
535
542
|
}
|
|
543
|
+
if (host === "claude" && available?.kind === "manifest-version") {
|
|
544
|
+
if (previous.version === undefined || observed.version === undefined
|
|
545
|
+
|| previous.reason !== undefined || observed.reason !== undefined)
|
|
546
|
+
return "unknown";
|
|
547
|
+
return previous.version === observed.version ? "unchanged" : "changed";
|
|
548
|
+
}
|
|
536
549
|
const previousCommit = previous.commit === undefined ? undefined : gitCommitId(previous.commit);
|
|
537
550
|
const observedCommit = observed.commit === undefined ? undefined : gitCommitId(observed.commit);
|
|
538
551
|
if (previousCommit !== undefined && observedCommit !== undefined) {
|
|
@@ -124,13 +124,19 @@ export function packageApprovalDigest(declaration) {
|
|
|
124
124
|
}
|
|
125
125
|
/**
|
|
126
126
|
* Compares installed evidence with available evidence. Manifest versions compare
|
|
127
|
-
* through `sameAppVersion` and `compareAppVersions
|
|
128
|
-
*
|
|
127
|
+
* through `sameAppVersion` and `compareAppVersions` for Pi. Claude's explicit
|
|
128
|
+
* plugin version keys its cache: only a different version installs a new copy.
|
|
129
|
+
* Unversioned bundles compare commits only with proven Source ancestry.
|
|
129
130
|
*/
|
|
130
|
-
export function classifyUpdate(installed, available, availableCommit, installedCommitIsAncestor) {
|
|
131
|
+
export function classifyUpdate(installed, available, availableCommit, installedCommitIsAncestor, host = "pi") {
|
|
131
132
|
if (installed.kind !== "installed" || installed.reason !== undefined || available === undefined) {
|
|
132
133
|
return "unknown";
|
|
133
134
|
}
|
|
135
|
+
if (host === "claude" && available.kind === "manifest-version") {
|
|
136
|
+
if (installed.version === undefined)
|
|
137
|
+
return "unknown";
|
|
138
|
+
return installed.version === available.version ? "current" : "update available";
|
|
139
|
+
}
|
|
134
140
|
if (installed.commit !== undefined) {
|
|
135
141
|
const sourceCommit = availableCommit ?? (available.kind === "git-commit" ? available.commit : undefined);
|
|
136
142
|
if (sourceCommit === undefined)
|
|
@@ -151,6 +157,15 @@ export function classifyUpdate(installed, available, availableCommit, installedC
|
|
|
151
157
|
}
|
|
152
158
|
return "unknown";
|
|
153
159
|
}
|
|
160
|
+
/** A different Source commit is not a deliverable update to Claude's versioned cache. */
|
|
161
|
+
export function claudeVersionUpdateNotice(host, installed, available, availableCommit) {
|
|
162
|
+
if (host !== "claude" || installed.kind !== "installed" || installed.reason !== undefined
|
|
163
|
+
|| available?.kind !== "manifest-version" || installed.version !== available.version
|
|
164
|
+
|| installed.commit === undefined || availableCommit === undefined
|
|
165
|
+
|| normalizeCommit(installed.commit) === normalizeCommit(availableCommit))
|
|
166
|
+
return undefined;
|
|
167
|
+
return `The Source commit differs, but Claude caches plugin version ${available.version}; the publisher must change the declared plugin version to deliver those changes.`;
|
|
168
|
+
}
|
|
154
169
|
/** Validates one host argv with the shared portable-command rules. */
|
|
155
170
|
export function assertValidHostArgv(argv, label) {
|
|
156
171
|
try {
|
|
@@ -15,7 +15,7 @@ function PackageDetails({ row }) {
|
|
|
15
15
|
const status = row.status.kind === "unknown" && row.status.reason === "local changes"
|
|
16
16
|
? "update not checked · local changes"
|
|
17
17
|
: row.status.kind === "unknown" ? "cannot assess" : row.status.kind === "current" ? "up to date" : "update available";
|
|
18
|
-
return (_jsxs(Text, { children: [_jsx(Text, { color: theme.legend, children: " " }), _jsxs(Text, { color: theme.value, children: [row.selection.host, " "] }), version === undefined ? _jsx(Text, { color: theme.warning, children: row.installed }) : _jsxs(_Fragment, { children: [_jsx(Text, { color: theme.value, children: installedPrefix }), _jsx(Text, { color: theme.version, children: version }), _jsx(Text, { color: theme.value, children: installedSuffix })] }), _jsx(Text, { color: theme.value, children: " available " }), _jsx(Text, { color: row.available === "unknown" ? theme.warning : theme.version, children: row.available }), _jsxs(Text, { color: theme.warning, children: [" ", status] }), row.drift === undefined ? null : _jsxs(Text, { color: theme.warning, children: [" drift: ", row.drift] })] }));
|
|
18
|
+
return (_jsxs(Text, { children: [_jsx(Text, { color: theme.legend, children: " " }), _jsxs(Text, { color: theme.value, children: [row.selection.host, " "] }), version === undefined ? _jsx(Text, { color: theme.warning, children: row.installed }) : _jsxs(_Fragment, { children: [_jsx(Text, { color: theme.value, children: installedPrefix }), _jsx(Text, { color: theme.version, children: version }), _jsx(Text, { color: theme.value, children: installedSuffix })] }), _jsx(Text, { color: theme.value, children: " available " }), _jsx(Text, { color: row.available === "unknown" ? theme.warning : theme.version, children: row.available }), _jsxs(Text, { color: theme.warning, children: [" ", status] }), row.updateReason === undefined ? null : _jsxs(Text, { color: theme.warning, children: [" ", row.updateReason] }), row.drift === undefined ? null : _jsxs(Text, { color: theme.warning, children: [" drift: ", row.drift] })] }));
|
|
19
19
|
}
|
|
20
20
|
/** One line of the Installations tree: cursor, indent, mark box, label and the leaf's details. */
|
|
21
21
|
export function TreeRowLine({ row, selected, marked }) {
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { classifyUpdate } from "../package-host-plans.js";
|
|
2
2
|
import { describeCoordinates, } from "../package-model.js";
|
|
3
3
|
/** Version evidence as a short label; `unknown` when the host or the bundle states none. */
|
|
4
|
-
export function packageVersionLabel(evidence) {
|
|
4
|
+
export function packageVersionLabel(evidence, commit) {
|
|
5
5
|
if (evidence === undefined)
|
|
6
6
|
return "unknown";
|
|
7
|
-
return evidence.kind === "manifest-version" ? evidence.version : evidence.commit.slice(0, 7);
|
|
7
|
+
return evidence.kind === "manifest-version" ? versionWithCommit(evidence.version, commit) : evidence.commit.slice(0, 7);
|
|
8
|
+
}
|
|
9
|
+
function versionWithCommit(version, commit) {
|
|
10
|
+
return `${version}${commit === undefined ? "" : ` (${commit.slice(0, 7)})`}`;
|
|
8
11
|
}
|
|
9
12
|
/** What the host reports about an install, as one phrase. Never a guess. */
|
|
10
13
|
export function installedEvidenceLabel(evidence) {
|
|
@@ -12,7 +15,7 @@ export function installedEvidenceLabel(evidence) {
|
|
|
12
15
|
case "installed": {
|
|
13
16
|
if (evidence.version !== undefined) {
|
|
14
17
|
const qualifier = evidence.reason === undefined ? "" : " (HEAD; local changes)";
|
|
15
|
-
return `installed ${evidence.version}${qualifier}`;
|
|
18
|
+
return `installed ${versionWithCommit(evidence.version, evidence.commit)}${qualifier}`;
|
|
16
19
|
}
|
|
17
20
|
if (evidence.reason !== undefined) {
|
|
18
21
|
const reason = evidence.reason.includes("local modifications") ? "local changes" : evidence.reason;
|
|
@@ -52,17 +55,18 @@ export function packageRow(record, inspection) {
|
|
|
52
55
|
name: inspection.descriptor?.name ?? describeCoordinates(record.selection),
|
|
53
56
|
installed: installedEvidenceLabel(inspection.installed),
|
|
54
57
|
...(inspection.installed.kind === "installed" && inspection.installed.version !== undefined
|
|
55
|
-
? { installedVersion: inspection.installed.version }
|
|
58
|
+
? { installedVersion: versionWithCommit(inspection.installed.version, inspection.installed.commit) }
|
|
56
59
|
: inspection.installed.kind === "installed" && inspection.installed.commit !== undefined
|
|
57
60
|
? { installedVersion: inspection.installed.commit.slice(0, 7) }
|
|
58
61
|
: {}),
|
|
59
|
-
available: packageVersionLabel(inspection.available),
|
|
60
|
-
status: packageRowStatus(inspection),
|
|
62
|
+
available: packageVersionLabel(inspection.available, inspection.availableCommit),
|
|
63
|
+
status: packageRowStatus(record.selection, inspection),
|
|
64
|
+
...(inspection.updateReason === undefined ? {} : { updateReason: inspection.updateReason }),
|
|
61
65
|
...(inspection.drift === undefined ? {} : { drift: inspection.drift }),
|
|
62
66
|
};
|
|
63
67
|
}
|
|
64
|
-
function packageRowStatus(inspection) {
|
|
65
|
-
const status = classifyUpdate(inspection.installed, inspection.available, inspection.availableCommit, inspection.installedCommitIsAncestor);
|
|
68
|
+
function packageRowStatus(selection, inspection) {
|
|
69
|
+
const status = classifyUpdate(inspection.installed, inspection.available, inspection.availableCommit, inspection.installedCommitIsAncestor, selection.host);
|
|
66
70
|
if (status === "unknown") {
|
|
67
71
|
return {
|
|
68
72
|
kind: "unknown",
|
|
@@ -24,7 +24,7 @@ function updateResultField(line, defaultOk) {
|
|
|
24
24
|
/** What the last check found out: its age, how the sources were refreshed, and what failed. */
|
|
25
25
|
export function CheckStatus({ data, now }) {
|
|
26
26
|
const errors = data.results.filter((result) => result.error !== undefined);
|
|
27
|
-
return (_jsxs(BorderPanel, { title: "Update check", children: [_jsxs(Text, { color: theme.field, children: ["checked ", _jsx(Text, { color: theme.value, children: formatAgo(now - data.checkedAt) }), _jsx(Text, { color: theme.legend, children: " \u00B7 " }), _jsx(Text, { color: theme.value, children: describeRefresh(data) })] }), data.refresh.failed.map((failure) => (_jsxs(Text, { children: [_jsx(Text, { color: theme.warning, children: "[WARN] " }), _jsx(FieldLine, { label: "Refresh failed for", value: `${failure.source}: ${failure.reason}` })] }, failure.source))), data.appError ? _jsxs(Text, { children: [_jsx(Text, { color: theme.error, children: "[FAIL] " }), _jsx(FieldLine, { label: "Error (Apps):", value: data.appError })] }) : null, data.packageError ? _jsxs(Text, { children: [_jsx(Text, { color: theme.error, children: "[FAIL] " }), _jsx(FieldLine, { label: "Error (Packages):", value: data.packageError })] }) : null, errors.map((result) => _jsxs(Text, { children: [_jsx(Text, { color: theme.error, children: "[FAIL] " }), _jsx(FieldLine, { label: `Error (${result.scope}):`, value: result.error ?? "" })] }, result.scope))] }));
|
|
27
|
+
return (_jsxs(BorderPanel, { title: "Update check", children: [_jsxs(Text, { color: theme.field, children: ["checked ", _jsx(Text, { color: theme.value, children: formatAgo(now - data.checkedAt) }), _jsx(Text, { color: theme.legend, children: " \u00B7 " }), _jsx(Text, { color: theme.value, children: describeRefresh(data) })] }), data.refresh.failed.map((failure) => (_jsxs(Text, { children: [_jsx(Text, { color: theme.warning, children: "[WARN] " }), _jsx(FieldLine, { label: "Refresh failed for", value: `${failure.source}: ${failure.reason}` })] }, failure.source))), data.appError ? _jsxs(Text, { children: [_jsx(Text, { color: theme.error, children: "[FAIL] " }), _jsx(FieldLine, { label: "Error (Apps):", value: data.appError })] }) : null, data.rows.filter(row => row.kind === "package" && row.check.status === "current" && row.check.reason !== undefined).map(row => (_jsxs(Text, { color: theme.warning, children: [row.path, ": ", row.reason] }, row.key))), data.packageError ? _jsxs(Text, { children: [_jsx(Text, { color: theme.error, children: "[FAIL] " }), _jsx(FieldLine, { label: "Error (Packages):", value: data.packageError })] }) : null, errors.map((result) => _jsxs(Text, { children: [_jsx(Text, { color: theme.error, children: "[FAIL] " }), _jsx(FieldLine, { label: `Error (${result.scope}):`, value: result.error ?? "" })] }, result.scope))] }));
|
|
28
28
|
}
|
|
29
29
|
/** One line of the list: an update, the fold of unassessable items, or one of those when unfolded. */
|
|
30
30
|
export function EntryLine({ entry, selected, checked, view, showUnknown }) {
|
package/dist/src/tui/updates.js
CHANGED
|
@@ -141,8 +141,10 @@ export async function loadUpdateRows(operations, environment, options) {
|
|
|
141
141
|
check,
|
|
142
142
|
path: `Package: ${describeCoordinates(check.installed.selection)}`,
|
|
143
143
|
policy: formatVersionPolicy(check.installed.selection.version),
|
|
144
|
-
installed:
|
|
145
|
-
|
|
144
|
+
installed: check.observed === undefined
|
|
145
|
+
? `${recordedVersionLabel(check.installed)} (recorded)`
|
|
146
|
+
: installedEvidenceLabel(check.observed).replace(/^installed (?:at )?/, ""),
|
|
147
|
+
available: check.available === undefined ? "?" : packageVersionLabel(check.available, check.availableCommit),
|
|
146
148
|
status: packageStatusLabel(check.status),
|
|
147
149
|
reason: check.reason ?? "the host reports no usable version evidence",
|
|
148
150
|
});
|