chainlesschain 0.45.1 → 0.45.2

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chainlesschain",
3
- "version": "0.45.1",
3
+ "version": "0.45.2",
4
4
  "description": "CLI for ChainlessChain - install, configure, and manage your personal AI management system",
5
5
  "type": "module",
6
6
  "bin": {
@@ -94,6 +94,37 @@ export function registerUpdateCommand(program) {
94
94
  return;
95
95
  }
96
96
 
97
+ // When update source is npm-only (GitHub Release CI still building),
98
+ // skip desktop app download and only update the CLI package
99
+ if (result.source === "npm") {
100
+ logger.info(
101
+ `GitHub Release for v${result.latestVersion} is not yet available (CI may still be building).`,
102
+ );
103
+ logger.info(`Updating CLI package from npm...`);
104
+
105
+ const doUpdate = await askConfirm(
106
+ `Update CLI to v${result.latestVersion} via npm?`,
107
+ true,
108
+ );
109
+ if (!doUpdate) {
110
+ logger.info("Update cancelled");
111
+ return;
112
+ }
113
+
114
+ const cliUpdated = await selfUpdateCli(result.latestVersion);
115
+ if (cliUpdated) {
116
+ logger.success(`CLI updated to v${result.latestVersion}`);
117
+ logger.info(
118
+ `Desktop app update will be available once GitHub Release CI completes.`,
119
+ );
120
+ } else {
121
+ logger.warn(
122
+ `CLI self-update failed. Please run manually:\n npm install -g chainlesschain@${result.latestVersion}`,
123
+ );
124
+ }
125
+ return;
126
+ }
127
+
97
128
  const doUpdate = await askConfirm(
98
129
  `Download v${result.latestVersion}?`,
99
130
  true,
@@ -2,48 +2,76 @@ import semver from "semver";
2
2
  import { GITHUB_RELEASES_URL, VERSION } from "../constants.js";
3
3
  import logger from "./logger.js";
4
4
 
5
+ const NPM_REGISTRY_URL = "https://registry.npmjs.org/chainlesschain/latest";
6
+
5
7
  export async function checkForUpdates(options = {}) {
6
8
  const channel = options.channel || "stable";
7
9
  const currentVersion = options.currentVersion || VERSION;
8
10
 
11
+ // Try GitHub releases first (has full release notes and assets)
9
12
  try {
10
13
  const releases = await fetchReleases();
11
14
  const filtered = filterByChannel(releases, channel);
12
15
 
13
- if (filtered.length === 0) {
16
+ if (filtered.length > 0) {
17
+ const latest = filtered[0];
18
+ const latestVersion = latest.tag_name.replace(/^v/, "");
19
+ const updateAvailable = semver.gt(latestVersion, currentVersion);
20
+
14
21
  return {
15
- updateAvailable: false,
22
+ updateAvailable,
16
23
  currentVersion,
17
- latestVersion: currentVersion,
24
+ latestVersion,
25
+ releaseUrl: latest.html_url,
26
+ publishedAt: latest.published_at,
27
+ releaseNotes: latest.body,
28
+ assets: latest.assets.map((a) => ({
29
+ name: a.name,
30
+ size: a.size,
31
+ downloadUrl: a.browser_download_url,
32
+ })),
18
33
  };
19
34
  }
35
+ } catch (err) {
36
+ logger.verbose(`GitHub release check failed: ${err.message}`);
37
+ }
20
38
 
21
- const latest = filtered[0];
22
- const latestVersion = latest.tag_name.replace(/^v/, "");
23
- const updateAvailable = semver.gt(latestVersion, currentVersion);
24
-
25
- return {
26
- updateAvailable,
27
- currentVersion,
28
- latestVersion,
29
- releaseUrl: latest.html_url,
30
- publishedAt: latest.published_at,
31
- releaseNotes: latest.body,
32
- assets: latest.assets.map((a) => ({
33
- name: a.name,
34
- size: a.size,
35
- downloadUrl: a.browser_download_url,
36
- })),
37
- };
39
+ // Fallback: check npm registry for CLI package version
40
+ // This catches cases where the GitHub Release CI is still building but npm is already published
41
+ try {
42
+ const npmVersion = await fetchNpmVersion();
43
+ if (npmVersion) {
44
+ const updateAvailable = semver.gt(npmVersion, currentVersion);
45
+ return {
46
+ updateAvailable,
47
+ currentVersion,
48
+ latestVersion: npmVersion,
49
+ releaseUrl: `https://www.npmjs.com/package/chainlesschain/v/${npmVersion}`,
50
+ source: "npm",
51
+ };
52
+ }
38
53
  } catch (err) {
39
- logger.verbose(`Update check failed: ${err.message}`);
40
- return {
41
- updateAvailable: false,
42
- currentVersion,
43
- latestVersion: currentVersion,
44
- error: err.message,
45
- };
54
+ logger.verbose(`npm registry check failed: ${err.message}`);
55
+ }
56
+
57
+ return {
58
+ updateAvailable: false,
59
+ currentVersion,
60
+ latestVersion: currentVersion,
61
+ error:
62
+ "Unable to check for updates (GitHub releases and npm registry both unavailable)",
63
+ };
64
+ }
65
+
66
+ async function fetchNpmVersion() {
67
+ const response = await fetch(NPM_REGISTRY_URL, {
68
+ headers: { Accept: "application/json" },
69
+ });
70
+ if (!response.ok) {
71
+ throw new Error(`npm registry error: HTTP ${response.status}`);
46
72
  }
73
+ const data = await response.json();
74
+ return data.version || null;
47
75
  }
48
76
 
49
77
  async function fetchReleases() {