charness 3.3.2 → 3.5.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 +639 -0
- package/DEVELOPMENT.md +76 -0
- package/README.md +78 -7
- package/SETUP.md +65 -19
- package/dist/adapters/claudeCliAdapter.js +2 -2
- package/dist/adapters/claudeCliAdapter.js.map +1 -1
- package/dist/adapters/claudeConfigDir.d.ts +18 -0
- package/dist/adapters/claudeConfigDir.d.ts.map +1 -1
- package/dist/adapters/claudeJsonStreamAdapter.d.ts +8 -1
- package/dist/adapters/claudeJsonStreamAdapter.d.ts.map +1 -1
- package/dist/adapters/claudeJsonStreamAdapter.js +24 -6
- package/dist/adapters/claudeJsonStreamAdapter.js.map +1 -1
- package/dist/adapters/createAdapter.d.ts +2 -1
- package/dist/adapters/createAdapter.d.ts.map +1 -1
- package/dist/adapters/createAdapter.js +16 -0
- package/dist/adapters/createAdapter.js.map +1 -1
- package/dist/adapters/openCodeAdapter.d.ts +11 -0
- package/dist/adapters/openCodeAdapter.d.ts.map +1 -1
- package/dist/adapters/openCodeAdapter.js +24 -9
- package/dist/adapters/openCodeAdapter.js.map +1 -1
- package/dist/agentLogin/agentLogin.d.ts +19 -1
- package/dist/agentLogin/agentLogin.d.ts.map +1 -1
- package/dist/agentLogin/agentLogin.js +64 -18
- package/dist/agentLogin/agentLogin.js.map +1 -1
- package/dist/apiErrorRetry.d.ts +3 -1
- package/dist/apiErrorRetry.d.ts.map +1 -1
- package/dist/apiErrorRetry.js +11 -1
- package/dist/apiErrorRetry.js.map +1 -1
- package/dist/bot.d.ts +0 -3
- package/dist/bot.d.ts.map +1 -1
- package/dist/bot.js +487 -182
- package/dist/bot.js.map +1 -1
- package/dist/changelogEntries.d.ts +25 -0
- package/dist/changelogEntries.d.ts.map +1 -0
- package/dist/changelogEntries.js +66 -0
- package/dist/changelogEntries.js.map +1 -0
- package/dist/cli/bot.d.ts +6 -2
- package/dist/cli/bot.d.ts.map +1 -1
- package/dist/cli/bot.js +34 -2
- package/dist/cli/bot.js.map +1 -1
- package/dist/cli/claudeProfiles.d.ts +1 -1
- package/dist/cli/claudeProfiles.d.ts.map +1 -1
- package/dist/cli/claudeProfiles.js +11 -6
- package/dist/cli/claudeProfiles.js.map +1 -1
- package/dist/cli/hot.d.ts +7 -0
- package/dist/cli/hot.d.ts.map +1 -1
- package/dist/cli/hot.js +53 -3
- package/dist/cli/hot.js.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +8 -0
- package/dist/cli.js.map +1 -1
- package/dist/connectors/telegram/bindPicker.d.ts +64 -0
- package/dist/connectors/telegram/bindPicker.d.ts.map +1 -0
- package/dist/connectors/telegram/bindPicker.js +97 -0
- package/dist/connectors/telegram/bindPicker.js.map +1 -0
- package/dist/connectors/telegram/commands/claudeAccounts.d.ts +6 -2
- package/dist/connectors/telegram/commands/claudeAccounts.d.ts.map +1 -1
- package/dist/connectors/telegram/commands/claudeAccounts.js +127 -28
- package/dist/connectors/telegram/commands/claudeAccounts.js.map +1 -1
- package/dist/connectors/telegram/commands/fallbackChain.d.ts.map +1 -1
- package/dist/connectors/telegram/commands/fallbackChain.js +6 -2
- package/dist/connectors/telegram/commands/fallbackChain.js.map +1 -1
- package/dist/connectors/telegram/commands/selfUpdate.d.ts +16 -0
- package/dist/connectors/telegram/commands/selfUpdate.d.ts.map +1 -0
- package/dist/connectors/telegram/commands/selfUpdate.js +210 -0
- package/dist/connectors/telegram/commands/selfUpdate.js.map +1 -0
- package/dist/connectors/telegram/commands/stt.d.ts +1 -0
- package/dist/connectors/telegram/commands/stt.d.ts.map +1 -1
- package/dist/connectors/telegram/commands/stt.js +5 -0
- package/dist/connectors/telegram/commands/stt.js.map +1 -1
- package/dist/connectors/telegram/commands/topicCommand.d.ts +75 -0
- package/dist/connectors/telegram/commands/topicCommand.d.ts.map +1 -0
- package/dist/connectors/telegram/commands/topicCommand.js +391 -0
- package/dist/connectors/telegram/commands/topicCommand.js.map +1 -0
- package/dist/i18n/de.d.ts.map +1 -1
- package/dist/i18n/de.js +136 -3
- package/dist/i18n/de.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +136 -3
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/es.d.ts.map +1 -1
- package/dist/i18n/es.js +136 -3
- package/dist/i18n/es.js.map +1 -1
- package/dist/i18n/fr.d.ts.map +1 -1
- package/dist/i18n/fr.js +136 -3
- package/dist/i18n/fr.js.map +1 -1
- package/dist/i18n/hi.d.ts.map +1 -1
- package/dist/i18n/hi.js +136 -3
- package/dist/i18n/hi.js.map +1 -1
- package/dist/i18n/ja.d.ts.map +1 -1
- package/dist/i18n/ja.js +136 -3
- package/dist/i18n/ja.js.map +1 -1
- package/dist/i18n/ka.d.ts.map +1 -1
- package/dist/i18n/ka.js +136 -3
- package/dist/i18n/ka.js.map +1 -1
- package/dist/i18n/pt.d.ts.map +1 -1
- package/dist/i18n/pt.js +136 -3
- package/dist/i18n/pt.js.map +1 -1
- package/dist/i18n/ru.d.ts.map +1 -1
- package/dist/i18n/ru.js +136 -3
- package/dist/i18n/ru.js.map +1 -1
- package/dist/i18n/uk.d.ts.map +1 -1
- package/dist/i18n/uk.js +136 -3
- package/dist/i18n/uk.js.map +1 -1
- package/dist/i18n/uz.d.ts.map +1 -1
- package/dist/i18n/uz.js +136 -3
- package/dist/i18n/uz.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +136 -3
- package/dist/i18n/zh.js.map +1 -1
- package/dist/instanceSettings.d.ts +12 -1
- package/dist/instanceSettings.d.ts.map +1 -1
- package/dist/instanceSettings.js +40 -4
- package/dist/instanceSettings.js.map +1 -1
- package/dist/scheduler/mcpSurface.d.ts.map +1 -1
- package/dist/scheduler/mcpSurface.js +4 -2
- package/dist/scheduler/mcpSurface.js.map +1 -1
- package/dist/selfUpdate/bootRollback.d.ts +22 -0
- package/dist/selfUpdate/bootRollback.d.ts.map +1 -0
- package/dist/selfUpdate/bootRollback.js +79 -0
- package/dist/selfUpdate/bootRollback.js.map +1 -0
- package/dist/selfUpdate/commandRunner.d.ts +21 -0
- package/dist/selfUpdate/commandRunner.d.ts.map +1 -0
- package/dist/selfUpdate/commandRunner.js +32 -0
- package/dist/selfUpdate/commandRunner.js.map +1 -0
- package/dist/selfUpdate/constants.d.ts +26 -0
- package/dist/selfUpdate/constants.d.ts.map +1 -0
- package/dist/selfUpdate/constants.js +31 -0
- package/dist/selfUpdate/constants.js.map +1 -0
- package/dist/selfUpdate/gitSource.d.ts +58 -0
- package/dist/selfUpdate/gitSource.d.ts.map +1 -0
- package/dist/selfUpdate/gitSource.js +183 -0
- package/dist/selfUpdate/gitSource.js.map +1 -0
- package/dist/selfUpdate/hostLock.d.ts +16 -0
- package/dist/selfUpdate/hostLock.d.ts.map +1 -0
- package/dist/selfUpdate/hostLock.js +101 -0
- package/dist/selfUpdate/hostLock.js.map +1 -0
- package/dist/selfUpdate/hotSupervisor.d.ts +47 -0
- package/dist/selfUpdate/hotSupervisor.d.ts.map +1 -0
- package/dist/selfUpdate/hotSupervisor.js +125 -0
- package/dist/selfUpdate/hotSupervisor.js.map +1 -0
- package/dist/selfUpdate/installKind.d.ts +45 -0
- package/dist/selfUpdate/installKind.d.ts.map +1 -0
- package/dist/selfUpdate/installKind.js +99 -0
- package/dist/selfUpdate/installKind.js.map +1 -0
- package/dist/selfUpdate/launchEnvironment.d.ts +3 -0
- package/dist/selfUpdate/launchEnvironment.d.ts.map +1 -0
- package/dist/selfUpdate/launchEnvironment.js +16 -0
- package/dist/selfUpdate/launchEnvironment.js.map +1 -0
- package/dist/selfUpdate/npmSource.d.ts +34 -0
- package/dist/selfUpdate/npmSource.d.ts.map +1 -0
- package/dist/selfUpdate/npmSource.js +107 -0
- package/dist/selfUpdate/npmSource.js.map +1 -0
- package/dist/selfUpdate/releaseNotes.d.ts +33 -0
- package/dist/selfUpdate/releaseNotes.d.ts.map +1 -0
- package/dist/selfUpdate/releaseNotes.js +115 -0
- package/dist/selfUpdate/releaseNotes.js.map +1 -0
- package/dist/selfUpdate/restart.d.ts +33 -0
- package/dist/selfUpdate/restart.d.ts.map +1 -0
- package/dist/selfUpdate/restart.js +94 -0
- package/dist/selfUpdate/restart.js.map +1 -0
- package/dist/selfUpdate/selfCheck.d.ts +20 -0
- package/dist/selfUpdate/selfCheck.d.ts.map +1 -0
- package/dist/selfUpdate/selfCheck.js +126 -0
- package/dist/selfUpdate/selfCheck.js.map +1 -0
- package/dist/selfUpdate/semver.d.ts +24 -0
- package/dist/selfUpdate/semver.d.ts.map +1 -0
- package/dist/selfUpdate/semver.js +165 -0
- package/dist/selfUpdate/semver.js.map +1 -0
- package/dist/selfUpdate/types.d.ts +51 -0
- package/dist/selfUpdate/types.d.ts.map +1 -0
- package/dist/selfUpdate/types.js +3 -0
- package/dist/selfUpdate/types.js.map +1 -0
- package/dist/selfUpdate/updateEngine.d.ts +110 -0
- package/dist/selfUpdate/updateEngine.d.ts.map +1 -0
- package/dist/selfUpdate/updateEngine.js +727 -0
- package/dist/selfUpdate/updateEngine.js.map +1 -0
- package/dist/selfUpdate/updateMessages.d.ts +84 -0
- package/dist/selfUpdate/updateMessages.d.ts.map +1 -0
- package/dist/selfUpdate/updateMessages.js +115 -0
- package/dist/selfUpdate/updateMessages.js.map +1 -0
- package/dist/selfUpdate/updateModes.d.ts +17 -0
- package/dist/selfUpdate/updateModes.d.ts.map +1 -0
- package/dist/selfUpdate/updateModes.js +14 -0
- package/dist/selfUpdate/updateModes.js.map +1 -0
- package/dist/selfUpdate/updatePending.d.ts +76 -0
- package/dist/selfUpdate/updatePending.d.ts.map +1 -0
- package/dist/selfUpdate/updatePending.js +131 -0
- package/dist/selfUpdate/updatePending.js.map +1 -0
- package/dist/selfUpdate/updatePolicy.d.ts +115 -0
- package/dist/selfUpdate/updatePolicy.d.ts.map +1 -0
- package/dist/selfUpdate/updatePolicy.js +83 -0
- package/dist/selfUpdate/updatePolicy.js.map +1 -0
- package/dist/selfUpdate/updateRuntime.d.ts +22 -0
- package/dist/selfUpdate/updateRuntime.d.ts.map +1 -0
- package/dist/selfUpdate/updateRuntime.js +148 -0
- package/dist/selfUpdate/updateRuntime.js.map +1 -0
- package/dist/startupPromptBuffer.d.ts +2 -0
- package/dist/startupPromptBuffer.d.ts.map +1 -1
- package/dist/startupPromptBuffer.js +4 -0
- package/dist/startupPromptBuffer.js.map +1 -1
- package/dist/state.d.ts +43 -0
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +54 -0
- package/dist/state.js.map +1 -1
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/anthropicApiKeyCheck.d.ts +19 -0
- package/dist/utils/anthropicApiKeyCheck.d.ts.map +1 -0
- package/dist/utils/anthropicApiKeyCheck.js +41 -0
- package/dist/utils/anthropicApiKeyCheck.js.map +1 -0
- package/dist/utils/claudeAccountPickerPlan.d.ts +6 -1
- package/dist/utils/claudeAccountPickerPlan.d.ts.map +1 -1
- package/dist/utils/claudeAccountPickerPlan.js +5 -1
- package/dist/utils/claudeAccountPickerPlan.js.map +1 -1
- package/dist/utils/claudeApiKeyHelper.d.ts +19 -0
- package/dist/utils/claudeApiKeyHelper.d.ts.map +1 -0
- package/dist/utils/claudeApiKeyHelper.js +32 -0
- package/dist/utils/claudeApiKeyHelper.js.map +1 -0
- package/dist/utils/claudeApiSpend.d.ts +73 -0
- package/dist/utils/claudeApiSpend.d.ts.map +1 -0
- package/dist/utils/claudeApiSpend.js +82 -0
- package/dist/utils/claudeApiSpend.js.map +1 -0
- package/dist/utils/claudeCompactHook.d.ts +11 -6
- package/dist/utils/claudeCompactHook.d.ts.map +1 -1
- package/dist/utils/claudeCompactHook.js +28 -11
- package/dist/utils/claudeCompactHook.js.map +1 -1
- package/dist/utils/claudeLimitSwitch.d.ts +2 -1
- package/dist/utils/claudeLimitSwitch.d.ts.map +1 -1
- package/dist/utils/claudeLimitSwitch.js +3 -2
- package/dist/utils/claudeLimitSwitch.js.map +1 -1
- package/dist/utils/claudeProfileUsageLines.d.ts +18 -3
- package/dist/utils/claudeProfileUsageLines.d.ts.map +1 -1
- package/dist/utils/claudeProfileUsageLines.js +23 -2
- package/dist/utils/claudeProfileUsageLines.js.map +1 -1
- package/dist/utils/claudeProfiles.d.ts +57 -2
- package/dist/utils/claudeProfiles.d.ts.map +1 -1
- package/dist/utils/claudeProfiles.js +96 -3
- package/dist/utils/claudeProfiles.js.map +1 -1
- package/dist/utils/claudeStreamJson.d.ts +4 -1
- package/dist/utils/claudeStreamJson.d.ts.map +1 -1
- package/dist/utils/claudeStreamJson.js +6 -0
- package/dist/utils/claudeStreamJson.js.map +1 -1
- package/dist/utils/claudeTranscriptContent.d.ts +8 -0
- package/dist/utils/claudeTranscriptContent.d.ts.map +1 -1
- package/dist/utils/claudeTranscriptContent.js +44 -0
- package/dist/utils/claudeTranscriptContent.js.map +1 -1
- package/dist/utils/claudeUsage.d.ts +22 -6
- package/dist/utils/claudeUsage.d.ts.map +1 -1
- package/dist/utils/claudeUsage.js +12 -5
- package/dist/utils/claudeUsage.js.map +1 -1
- package/dist/utils/claudeUsageRefresher.d.ts +6 -0
- package/dist/utils/claudeUsageRefresher.d.ts.map +1 -1
- package/dist/utils/claudeUsageRefresher.js +2 -2
- package/dist/utils/claudeUsageRefresher.js.map +1 -1
- package/dist/utils/fallbackChain.d.ts +15 -8
- package/dist/utils/fallbackChain.d.ts.map +1 -1
- package/dist/utils/fallbackChain.js +30 -13
- package/dist/utils/fallbackChain.js.map +1 -1
- package/dist/utils/limitsBoardPlan.d.ts +4 -2
- package/dist/utils/limitsBoardPlan.d.ts.map +1 -1
- package/dist/utils/limitsBoardPlan.js +12 -5
- package/dist/utils/limitsBoardPlan.js.map +1 -1
- package/dist/utils/recvPreviewRedaction.d.ts +7 -2
- package/dist/utils/recvPreviewRedaction.d.ts.map +1 -1
- package/dist/utils/recvPreviewRedaction.js +10 -4
- package/dist/utils/recvPreviewRedaction.js.map +1 -1
- package/dist/utils/threadStatusReport.d.ts +12 -1
- package/dist/utils/threadStatusReport.d.ts.map +1 -1
- package/dist/utils/threadStatusReport.js +13 -4
- package/dist/utils/threadStatusReport.js.map +1 -1
- package/dist/utils/updateScreenPlan.d.ts +38 -0
- package/dist/utils/updateScreenPlan.d.ts.map +1 -0
- package/dist/utils/updateScreenPlan.js +143 -0
- package/dist/utils/updateScreenPlan.js.map +1 -0
- package/package.json +3 -1
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.npmManualCommand = void 0;
|
|
37
|
+
exports.detectInstallKind = detectInstallKind;
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const ephemeralFolderName = '_npx';
|
|
40
|
+
const nodeModulesFolderName = 'node_modules';
|
|
41
|
+
const gitEntryName = '.git';
|
|
42
|
+
const selfUpdateScriptRelativePath = path.join('scripts', 'self-update.sh');
|
|
43
|
+
const npmGlobalLibFolderName = 'lib';
|
|
44
|
+
const npmGlobalBinFolderName = 'bin';
|
|
45
|
+
/** Path fragments of the package managers whose global installs we do not drive. */
|
|
46
|
+
const foreignPackageManagerFragments = [
|
|
47
|
+
{ fragment: `${path.sep}.pnpm${path.sep}`, manualCommand: 'pnpm add -g charness@latest' },
|
|
48
|
+
{ fragment: `${path.sep}pnpm${path.sep}global${path.sep}`, manualCommand: 'pnpm add -g charness@latest' },
|
|
49
|
+
{ fragment: `${path.sep}.bun${path.sep}`, manualCommand: 'bun add -g charness@latest' },
|
|
50
|
+
{ fragment: `${path.sep}yarn${path.sep}global${path.sep}`, manualCommand: 'yarn global add charness@latest' },
|
|
51
|
+
{ fragment: `${path.sep}.yarn${path.sep}`, manualCommand: 'yarn global add charness@latest' },
|
|
52
|
+
];
|
|
53
|
+
exports.npmManualCommand = 'npm install -g charness@latest';
|
|
54
|
+
function getCheckoutManualCommand(root) {
|
|
55
|
+
return path.join(root, selfUpdateScriptRelativePath);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* The npm global prefix a package folder sits under: `<prefix>/lib/node_modules/charness` on POSIX,
|
|
59
|
+
* `<prefix>/node_modules/charness` on Windows. `null` when the folder is not directly inside a `node_modules`.
|
|
60
|
+
*/
|
|
61
|
+
function getNpmPrefix(packageRoot, platform) {
|
|
62
|
+
const nodeModulesDirectory = path.dirname(packageRoot);
|
|
63
|
+
if (path.basename(nodeModulesDirectory) !== nodeModulesFolderName)
|
|
64
|
+
return null;
|
|
65
|
+
const parent = path.dirname(nodeModulesDirectory);
|
|
66
|
+
if (platform === 'win32')
|
|
67
|
+
return { prefix: parent, isGlobalLayout: true };
|
|
68
|
+
return path.basename(parent) === npmGlobalLibFolderName
|
|
69
|
+
? { prefix: path.dirname(parent), isGlobalLayout: true }
|
|
70
|
+
: { prefix: parent, isGlobalLayout: false };
|
|
71
|
+
}
|
|
72
|
+
/** @description Decide the install kind of a package folder. */
|
|
73
|
+
function detectInstallKind({ packageRoot, fs: filesystem, platform, hasExecve }) {
|
|
74
|
+
if (packageRoot.split(path.sep).includes(ephemeralFolderName))
|
|
75
|
+
return { kind: 'ephemeral' };
|
|
76
|
+
if (filesystem.checkExists(path.join(packageRoot, gitEntryName))) {
|
|
77
|
+
const manualCommand = getCheckoutManualCommand(packageRoot);
|
|
78
|
+
if (!hasExecve)
|
|
79
|
+
return { kind: 'notifyOnly', reason: 'noExecve', manualCommand, isCheckout: true };
|
|
80
|
+
const canWrite = filesystem.checkIsWritable(packageRoot) && filesystem.checkExists(path.join(packageRoot, selfUpdateScriptRelativePath));
|
|
81
|
+
return canWrite ? { kind: 'checkout', root: packageRoot } : { kind: 'notifyOnly', reason: 'readOnlyCheckout', manualCommand, isCheckout: true };
|
|
82
|
+
}
|
|
83
|
+
const foreign = foreignPackageManagerFragments.find(({ fragment }) => `${packageRoot}${path.sep}`.includes(fragment));
|
|
84
|
+
if (foreign)
|
|
85
|
+
return { kind: 'notifyOnly', reason: 'packageManager', manualCommand: foreign.manualCommand, isCheckout: false };
|
|
86
|
+
const npmPrefix = getNpmPrefix(packageRoot, platform);
|
|
87
|
+
if (npmPrefix === null || !npmPrefix.isGlobalLayout) {
|
|
88
|
+
return { kind: 'notifyOnly', reason: 'localInstall', manualCommand: 'npm install charness@latest', isCheckout: false };
|
|
89
|
+
}
|
|
90
|
+
if (!hasExecve)
|
|
91
|
+
return { kind: 'notifyOnly', reason: 'noExecve', manualCommand: exports.npmManualCommand, isCheckout: false };
|
|
92
|
+
const nodeModulesDirectory = path.dirname(packageRoot);
|
|
93
|
+
const binDirectory = path.join(npmPrefix.prefix, npmGlobalBinFolderName);
|
|
94
|
+
const canWrite = filesystem.checkIsWritable(nodeModulesDirectory) && (platform === 'win32' || filesystem.checkIsWritable(binDirectory));
|
|
95
|
+
return canWrite
|
|
96
|
+
? { kind: 'npmGlobal', prefix: npmPrefix.prefix }
|
|
97
|
+
: { kind: 'notifyOnly', reason: 'readOnlyPrefix', manualCommand: exports.npmManualCommand, isCheckout: false };
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=installKind.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installKind.js","sourceRoot":"","sources":["../../src/selfUpdate/installKind.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launchEnvironment.d.ts","sourceRoot":"","sources":["../../src/selfUpdate/launchEnvironment.ts"],"names":[],"mappings":"AASA,4EAA4E;AAC5E,wBAAgB,oBAAoB,IAAI,MAAM,CAAC,UAAU,CAExD"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getLaunchEnvironment = getLaunchEnvironment;
|
|
4
|
+
/**
|
|
5
|
+
* The process environment as it was handed to this process — captured the moment this module first loads, which `cli.ts`
|
|
6
|
+
* makes its FIRST import, before any `.env` file is read into `process.env`. A re-exec (the updater's restart, the hot
|
|
7
|
+
* supervisor's re-exec) launches the new image with THIS, never with the live `process.env`: the new run then loads the
|
|
8
|
+
* `.env` files again, so a hand edit of them is honoured and a key removed from them is gone, instead of the old run's
|
|
9
|
+
* loaded values lingering.
|
|
10
|
+
*/
|
|
11
|
+
const launchEnvironment = { ...process.env };
|
|
12
|
+
/** @description A copy of the environment the process was launched with. */
|
|
13
|
+
function getLaunchEnvironment() {
|
|
14
|
+
return { ...launchEnvironment };
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=launchEnvironment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launchEnvironment.js","sourceRoot":"","sources":["../../src/selfUpdate/launchEnvironment.ts"],"names":[],"mappings":";;AAUA,oDAEC;AAZD;;;;;;GAMG;AACH,MAAM,iBAAiB,GAAsB,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAEhE,4EAA4E;AAC5E,SAAgB,oBAAoB;IAClC,OAAO,EAAE,GAAG,iBAAiB,EAAE,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type CommandRunner } from './commandRunner';
|
|
2
|
+
import type { NpmLatest } from './updatePolicy';
|
|
3
|
+
/** The package this updater follows. */
|
|
4
|
+
export declare const npmPackageName = "charness";
|
|
5
|
+
/** @description A source (registry, remote, installer) did not do what was asked; the message is for the operator. */
|
|
6
|
+
export declare class UpdateSourceError extends Error {
|
|
7
|
+
}
|
|
8
|
+
export interface NpmSourceDeps {
|
|
9
|
+
runCommand: CommandRunner;
|
|
10
|
+
/** The running `node`: its sibling `npm` is the one that installed this charness (nvm-safe), honouring the user's `.npmrc`. */
|
|
11
|
+
execPath: string;
|
|
12
|
+
/** The npm global prefix this install sits under. */
|
|
13
|
+
prefix: string;
|
|
14
|
+
env?: NodeJS.ProcessEnv;
|
|
15
|
+
}
|
|
16
|
+
export interface NpmSource {
|
|
17
|
+
/** What `latest` is now; throws {@link UpdateSourceError} when the registry does not answer. */
|
|
18
|
+
getLatest: () => Promise<NpmLatest>;
|
|
19
|
+
/** Install exactly `version` into the prefix; throws {@link UpdateSourceError} with the output's tail. */
|
|
20
|
+
install: (version: string, options?: {
|
|
21
|
+
isRollback?: boolean;
|
|
22
|
+
}) => Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
/** @description The `npm` next to a `node` binary. */
|
|
25
|
+
export declare function getNpmBinary(execPath: string): string;
|
|
26
|
+
/** @description Where the host-wide lock of an npm global install lives. */
|
|
27
|
+
export declare function getHostLockPath(prefix: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* @description Reads `npm view charness@latest version engines deprecated --json`. A package that names no `engines` or
|
|
30
|
+
* is not deprecated has no such key; `engines` is the `node` range, `deprecated` a message.
|
|
31
|
+
*/
|
|
32
|
+
export declare function parseNpmViewOutput(stdout: string): NpmLatest;
|
|
33
|
+
export declare function createNpmSource({ runCommand, execPath, prefix, env }: NpmSourceDeps): NpmSource;
|
|
34
|
+
//# sourceMappingURL=npmSource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npmSource.d.ts","sourceRoot":"","sources":["../../src/selfUpdate/npmSource.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,wCAAwC;AACxC,eAAO,MAAM,cAAc,aAAa,CAAC;AAKzC,sHAAsH;AACtH,qBAAa,iBAAkB,SAAQ,KAAK;CAAG;AAE/C,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,aAAa,CAAC;IAC1B,+HAA+H;IAC/H,QAAQ,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,gGAAgG;IAChG,SAAS,EAAE,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;IACpC,0GAA0G;IAC1G,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjF;AAED,sDAAsD;AACtD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtD;AAQD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAc5D;AAED,wBAAgB,eAAe,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,aAAa,GAAG,SAAS,CAwB/F"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.UpdateSourceError = exports.npmPackageName = void 0;
|
|
37
|
+
exports.getNpmBinary = getNpmBinary;
|
|
38
|
+
exports.getHostLockPath = getHostLockPath;
|
|
39
|
+
exports.parseNpmViewOutput = parseNpmViewOutput;
|
|
40
|
+
exports.createNpmSource = createNpmSource;
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const commandRunner_1 = require("./commandRunner");
|
|
43
|
+
const constants_1 = require("./constants");
|
|
44
|
+
/** The package this updater follows. */
|
|
45
|
+
exports.npmPackageName = 'charness';
|
|
46
|
+
const distTag = 'latest';
|
|
47
|
+
const hostLockFileName = '.charness-update.lock';
|
|
48
|
+
const nodeModulesRelativePath = path.join('lib', 'node_modules');
|
|
49
|
+
/** @description A source (registry, remote, installer) did not do what was asked; the message is for the operator. */
|
|
50
|
+
class UpdateSourceError extends Error {
|
|
51
|
+
}
|
|
52
|
+
exports.UpdateSourceError = UpdateSourceError;
|
|
53
|
+
/** @description The `npm` next to a `node` binary. */
|
|
54
|
+
function getNpmBinary(execPath) {
|
|
55
|
+
return path.join(path.dirname(execPath), 'npm');
|
|
56
|
+
}
|
|
57
|
+
/** @description Where the host-wide lock of an npm global install lives. */
|
|
58
|
+
function getHostLockPath(prefix) {
|
|
59
|
+
return path.join(prefix, nodeModulesRelativePath, hostLockFileName);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* @description Reads `npm view charness@latest version engines deprecated --json`. A package that names no `engines` or
|
|
63
|
+
* is not deprecated has no such key; `engines` is the `node` range, `deprecated` a message.
|
|
64
|
+
*/
|
|
65
|
+
function parseNpmViewOutput(stdout) {
|
|
66
|
+
let output;
|
|
67
|
+
try {
|
|
68
|
+
output = JSON.parse(stdout);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
throw new UpdateSourceError(`npm view printed something unreadable: ${stdout.slice(0, 200)}`);
|
|
72
|
+
}
|
|
73
|
+
if (typeof output?.version !== 'string')
|
|
74
|
+
throw new UpdateSourceError('npm view named no version');
|
|
75
|
+
const nodeRange = typeof output.engines === 'object' ? output.engines.node : undefined;
|
|
76
|
+
return {
|
|
77
|
+
version: output.version,
|
|
78
|
+
engines: typeof nodeRange === 'string' ? nodeRange : null,
|
|
79
|
+
isDeprecated: typeof output.deprecated === 'string' && output.deprecated !== '',
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function createNpmSource({ runCommand, execPath, prefix, env }) {
|
|
83
|
+
const npm = getNpmBinary(execPath);
|
|
84
|
+
// A quiet, prompt-free npm: no update notifier, no audit or fund noise on the install's output tail.
|
|
85
|
+
const commonArguments = ['--no-fund', '--no-audit', '--loglevel=error'];
|
|
86
|
+
return {
|
|
87
|
+
async getLatest() {
|
|
88
|
+
const result = await runCommand(npm, ['view', `${exports.npmPackageName}@${distTag}`, 'version', 'engines', 'deprecated', '--json', ...commonArguments], {
|
|
89
|
+
env,
|
|
90
|
+
timeoutMs: constants_1.queryTimeoutMs,
|
|
91
|
+
});
|
|
92
|
+
if (!result.ok) {
|
|
93
|
+
throw new UpdateSourceError(result.isTimedOut ? 'the registry did not answer in time' : `the registry did not answer: ${(0, commandRunner_1.getOutputTail)(result, 2)}`);
|
|
94
|
+
}
|
|
95
|
+
return parseNpmViewOutput(result.stdout);
|
|
96
|
+
},
|
|
97
|
+
async install(version, options = {}) {
|
|
98
|
+
// A rollback prefers what the npm cache already holds: the registry may be the very thing that is down.
|
|
99
|
+
const args = ['install', '-g', '--prefix', prefix, `${exports.npmPackageName}@${version}`, ...commonArguments, ...(options.isRollback ? ['--prefer-offline'] : [])];
|
|
100
|
+
const result = await runCommand(npm, args, { env, timeoutMs: constants_1.installTimeoutMs });
|
|
101
|
+
if (!result.ok) {
|
|
102
|
+
throw new UpdateSourceError(result.isTimedOut ? `npm install ${version} did not finish in time` : `npm install ${version} failed: ${(0, commandRunner_1.getOutputTail)(result)}`);
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=npmSource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npmSource.js","sourceRoot":"","sources":["../../src/selfUpdate/npmSource.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/** One version's headlines in a what's-new summary; `version` is `null` for a checkout, which has no versions to name. */
|
|
2
|
+
export interface WhatsNewGroup {
|
|
3
|
+
version: string | null;
|
|
4
|
+
headlines: string[];
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* What an update changed, ready to be worded: the entries an operator must act on (`### Upgrading`) first, then the
|
|
8
|
+
* headline of every other entry grouped by version, capped — `moreCount` entries did not fit.
|
|
9
|
+
*/
|
|
10
|
+
export interface WhatsNewSummary {
|
|
11
|
+
todo: string[];
|
|
12
|
+
groups: WhatsNewGroup[];
|
|
13
|
+
moreCount: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* @description The headline of a CHANGELOG entry: its bold first sentence, links reduced to their text, code marks
|
|
17
|
+
* dropped. An entry without a bold lead (an old section) falls back to its first sentence, cut at a sentence end or at
|
|
18
|
+
* {@link fallbackHeadlineMaxLength} characters.
|
|
19
|
+
*/
|
|
20
|
+
export declare function getEntryHeadline(entryText: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* @description The summary of the released versions after `fromVersion` up to and including `toVersion` — every version
|
|
23
|
+
* the update skipped over — read from the installed `CHANGELOG.md`, oldest version first. `null` when the range holds no
|
|
24
|
+
* entry (an old package without a CHANGELOG, or without sections for these versions).
|
|
25
|
+
*/
|
|
26
|
+
export declare function getNpmReleaseNotes(changelogText: string, fromVersion: string, toVersion: string, limit?: number): WhatsNewSummary | null;
|
|
27
|
+
/**
|
|
28
|
+
* @description The summary of what a checkout's update ADDED to `CHANGELOG.md`, read from `git diff` of the file with the
|
|
29
|
+
* whole file as context (so an entry added under an existing `### Upgrading` is still known as one). An entry counts when
|
|
30
|
+
* its first line is an added line; a reworded entry counts as new. `null` when nothing was added.
|
|
31
|
+
*/
|
|
32
|
+
export declare function getCheckoutReleaseNotes(diffText: string, limit?: number): WhatsNewSummary | null;
|
|
33
|
+
//# sourceMappingURL=releaseNotes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"releaseNotes.d.ts","sourceRoot":"","sources":["../../src/selfUpdate/releaseNotes.ts"],"names":[],"mappings":"AAIA,0HAA0H;AAC1H,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAgBD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAO1D;AA6CD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,KAAK,GAAE,MAA0B,GAChC,eAAe,GAAG,IAAI,CAYxB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,GAAE,MAA0B,GAAG,eAAe,GAAG,IAAI,CAenH"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getEntryHeadline = getEntryHeadline;
|
|
4
|
+
exports.getNpmReleaseNotes = getNpmReleaseNotes;
|
|
5
|
+
exports.getCheckoutReleaseNotes = getCheckoutReleaseNotes;
|
|
6
|
+
const changelogEntries_1 = require("../changelogEntries");
|
|
7
|
+
const constants_1 = require("./constants");
|
|
8
|
+
const semver_1 = require("./semver");
|
|
9
|
+
const upgradingSubsection = 'upgrading';
|
|
10
|
+
const versionHeadingPattern = /^## (\d+\.\d+\.\d+)(?:\s|$)/;
|
|
11
|
+
const boldLeadPattern = /^\*\*(?=\S)([\s\S]*?\S)\*\*/;
|
|
12
|
+
const linkPattern = /\[([^\]]*)\]\([^)]*\)/g;
|
|
13
|
+
const fallbackHeadlineMaxLength = 200;
|
|
14
|
+
const sentenceEndPattern = /[.!?](?:\s|$)/;
|
|
15
|
+
const diffAddedPrefix = '+';
|
|
16
|
+
const diffContextPrefix = ' ';
|
|
17
|
+
const diffFileHeaderPattern = /^(?:diff --git|index |--- |\+\+\+ |@@ |\\)/;
|
|
18
|
+
function reduceMarkdown(text) {
|
|
19
|
+
return text.replace(linkPattern, '$1').replaceAll('`', '').replace(/\s+/g, ' ').trim();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* @description The headline of a CHANGELOG entry: its bold first sentence, links reduced to their text, code marks
|
|
23
|
+
* dropped. An entry without a bold lead (an old section) falls back to its first sentence, cut at a sentence end or at
|
|
24
|
+
* {@link fallbackHeadlineMaxLength} characters.
|
|
25
|
+
*/
|
|
26
|
+
function getEntryHeadline(entryText) {
|
|
27
|
+
const bold = boldLeadPattern.exec(entryText);
|
|
28
|
+
if (bold)
|
|
29
|
+
return reduceMarkdown(bold[1]);
|
|
30
|
+
const plain = reduceMarkdown(entryText);
|
|
31
|
+
const sentenceEnd = sentenceEndPattern.exec(plain);
|
|
32
|
+
const sentence = sentenceEnd ? plain.slice(0, sentenceEnd.index + 1) : plain;
|
|
33
|
+
return sentence.length > fallbackHeadlineMaxLength ? `${sentence.slice(0, fallbackHeadlineMaxLength - 1)}…` : sentence;
|
|
34
|
+
}
|
|
35
|
+
/** Caps the entries at `limit` in display order (to-do items first, then versions in the order given). */
|
|
36
|
+
function createSummary(entries, limit) {
|
|
37
|
+
if (entries.length === 0)
|
|
38
|
+
return null;
|
|
39
|
+
const todoEntries = entries.filter((entry) => entry.isUpgrading);
|
|
40
|
+
const otherEntries = entries.filter((entry) => !entry.isUpgrading);
|
|
41
|
+
const kept = [...todoEntries, ...otherEntries].slice(0, limit);
|
|
42
|
+
const groups = [];
|
|
43
|
+
for (const entry of kept.filter((candidate) => !candidate.isUpgrading)) {
|
|
44
|
+
const group = groups.find((candidate) => candidate.version === entry.version);
|
|
45
|
+
if (group)
|
|
46
|
+
group.headlines.push(entry.headline);
|
|
47
|
+
else
|
|
48
|
+
groups.push({ version: entry.version, headlines: [entry.headline] });
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
todo: kept.filter((entry) => entry.isUpgrading).map((entry) => entry.headline),
|
|
52
|
+
groups,
|
|
53
|
+
moreCount: entries.length - kept.length,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/** The `## X.Y.Z` sections of a CHANGELOG, each with its body text. */
|
|
57
|
+
function getVersionSections(changelogText) {
|
|
58
|
+
const sections = [];
|
|
59
|
+
let current = null;
|
|
60
|
+
for (const line of changelogText.split('\n')) {
|
|
61
|
+
const heading = versionHeadingPattern.exec(line);
|
|
62
|
+
if (heading) {
|
|
63
|
+
current = { version: heading[1], lines: [] };
|
|
64
|
+
sections.push(current);
|
|
65
|
+
}
|
|
66
|
+
else if (line.startsWith('## ')) {
|
|
67
|
+
current = null;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
current?.lines.push(line);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return sections.map((section) => ({ version: section.version, body: section.lines.join('\n') }));
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* @description The summary of the released versions after `fromVersion` up to and including `toVersion` — every version
|
|
77
|
+
* the update skipped over — read from the installed `CHANGELOG.md`, oldest version first. `null` when the range holds no
|
|
78
|
+
* entry (an old package without a CHANGELOG, or without sections for these versions).
|
|
79
|
+
*/
|
|
80
|
+
function getNpmReleaseNotes(changelogText, fromVersion, toVersion, limit = constants_1.whatsNewItemLimit) {
|
|
81
|
+
const inRange = getVersionSections(changelogText)
|
|
82
|
+
.filter(({ version }) => ((0, semver_1.compareVersionTexts)(version, fromVersion) ?? -1) > 0 && ((0, semver_1.compareVersionTexts)(version, toVersion) ?? 1) <= 0)
|
|
83
|
+
.sort((left, right) => (0, semver_1.compareVersionTexts)(left.version, right.version) ?? 0);
|
|
84
|
+
const entries = inRange.flatMap(({ version, body }) => (0, changelogEntries_1.getChangelogEntries)(body).map((entry) => ({
|
|
85
|
+
version,
|
|
86
|
+
headline: getEntryHeadline(entry.text),
|
|
87
|
+
isUpgrading: entry.subsection?.toLowerCase() === upgradingSubsection,
|
|
88
|
+
})));
|
|
89
|
+
return createSummary(entries, limit);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* @description The summary of what a checkout's update ADDED to `CHANGELOG.md`, read from `git diff` of the file with the
|
|
93
|
+
* whole file as context (so an entry added under an existing `### Upgrading` is still known as one). An entry counts when
|
|
94
|
+
* its first line is an added line; a reworded entry counts as new. `null` when nothing was added.
|
|
95
|
+
*/
|
|
96
|
+
function getCheckoutReleaseNotes(diffText, limit = constants_1.whatsNewItemLimit) {
|
|
97
|
+
const fileLines = [];
|
|
98
|
+
for (const line of diffText.split('\n')) {
|
|
99
|
+
if (diffFileHeaderPattern.test(line))
|
|
100
|
+
continue;
|
|
101
|
+
if (line.startsWith(diffAddedPrefix))
|
|
102
|
+
fileLines.push({ text: line.slice(1), isAdded: true });
|
|
103
|
+
else if (line.startsWith(diffContextPrefix))
|
|
104
|
+
fileLines.push({ text: line.slice(1), isAdded: false });
|
|
105
|
+
}
|
|
106
|
+
const entries = (0, changelogEntries_1.getChangelogEntries)(fileLines.map((line) => line.text).join('\n'))
|
|
107
|
+
.filter((entry) => fileLines[entry.leadLineIndex]?.isAdded)
|
|
108
|
+
.map((entry) => ({
|
|
109
|
+
version: null,
|
|
110
|
+
headline: getEntryHeadline(entry.text),
|
|
111
|
+
isUpgrading: entry.subsection?.toLowerCase() === upgradingSubsection,
|
|
112
|
+
}));
|
|
113
|
+
return createSummary(entries, limit);
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=releaseNotes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"releaseNotes.js","sourceRoot":"","sources":["../../src/selfUpdate/releaseNotes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Replacing the running process with a fresh image of the same charness: `process.execve` — the SAME pid, so systemd,
|
|
3
|
+
* pm2, nohup or a foreground terminal see nothing happen. The new image gets the launch environment (see
|
|
4
|
+
* `launchEnvironment.ts`) and the original arguments; the agents are external processes and are re-adopted as on any restart.
|
|
5
|
+
*/
|
|
6
|
+
/** `EX_TEMPFAIL`: the restart could not be done now, a supervisor may try again. */
|
|
7
|
+
export declare const restartFailedExitCode = 75;
|
|
8
|
+
export interface ReexecTarget {
|
|
9
|
+
file: string;
|
|
10
|
+
args: string[];
|
|
11
|
+
}
|
|
12
|
+
/** @description The command line of a re-exec: `node <packageRoot>/dist/cli.js <the original arguments>`. */
|
|
13
|
+
export declare function getReexecTarget(options: {
|
|
14
|
+
execPath: string;
|
|
15
|
+
packageRoot: string;
|
|
16
|
+
argv: readonly string[];
|
|
17
|
+
}): ReexecTarget;
|
|
18
|
+
/** @description What would make a re-exec fail, found BEFORE anything is shut down: a missing node, a missing `dist/cli.js`. */
|
|
19
|
+
export declare function getReexecProblems(target: ReexecTarget, checkExists?: (target: string) => boolean): string[];
|
|
20
|
+
export interface ReexecDeps {
|
|
21
|
+
execve: ((file: string, args: readonly string[], env: NodeJS.ProcessEnv) => never) | undefined;
|
|
22
|
+
exit: (code: number) => void;
|
|
23
|
+
log: (line: string) => void;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* @description Replace this process with `target`. Never returns on success. A missing `process.execve` or an error from it
|
|
27
|
+
* is logged and ends the process with {@link restartFailedExitCode}, so a supervisor sees a failed restart rather than a bot
|
|
28
|
+
* that is silently gone.
|
|
29
|
+
*/
|
|
30
|
+
export declare function reexecProcess(target: ReexecTarget, env: NodeJS.ProcessEnv, deps: ReexecDeps): void;
|
|
31
|
+
/** @description The real dependencies of {@link reexecProcess}. */
|
|
32
|
+
export declare function createDefaultReexecDeps(): ReexecDeps;
|
|
33
|
+
//# sourceMappingURL=restart.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart.d.ts","sourceRoot":"","sources":["../../src/selfUpdate/restart.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AAEH,oFAAoF;AACpF,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,6GAA6G;AAC7G,wBAAgB,eAAe,CAAC,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAAG,YAAY,CAIzH;AAED,gIAAgI;AAChI,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,GAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAuB,GAAG,MAAM,EAAE,CAM1H;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,KAAK,KAAK,CAAC,GAAG,SAAS,CAAC;IAC/F,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CAYlG;AAED,mEAAmE;AACnE,wBAAgB,uBAAuB,IAAI,UAAU,CAOpD"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.restartFailedExitCode = void 0;
|
|
37
|
+
exports.getReexecTarget = getReexecTarget;
|
|
38
|
+
exports.getReexecProblems = getReexecProblems;
|
|
39
|
+
exports.reexecProcess = reexecProcess;
|
|
40
|
+
exports.createDefaultReexecDeps = createDefaultReexecDeps;
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
/**
|
|
44
|
+
* Replacing the running process with a fresh image of the same charness: `process.execve` — the SAME pid, so systemd,
|
|
45
|
+
* pm2, nohup or a foreground terminal see nothing happen. The new image gets the launch environment (see
|
|
46
|
+
* `launchEnvironment.ts`) and the original arguments; the agents are external processes and are re-adopted as on any restart.
|
|
47
|
+
*/
|
|
48
|
+
/** `EX_TEMPFAIL`: the restart could not be done now, a supervisor may try again. */
|
|
49
|
+
exports.restartFailedExitCode = 75;
|
|
50
|
+
/** @description The command line of a re-exec: `node <packageRoot>/dist/cli.js <the original arguments>`. */
|
|
51
|
+
function getReexecTarget(options) {
|
|
52
|
+
const cliPath = path.join(options.packageRoot, 'dist', 'cli.js');
|
|
53
|
+
// argv[0] of the new image is the executable itself; `process.argv` here is [node, script, ...arguments].
|
|
54
|
+
return { file: options.execPath, args: [options.execPath, cliPath, ...options.argv.slice(2)] };
|
|
55
|
+
}
|
|
56
|
+
/** @description What would make a re-exec fail, found BEFORE anything is shut down: a missing node, a missing `dist/cli.js`. */
|
|
57
|
+
function getReexecProblems(target, checkExists = fs.existsSync) {
|
|
58
|
+
const problems = [];
|
|
59
|
+
if (!checkExists(target.file))
|
|
60
|
+
problems.push(`the node executable ${target.file} is gone`);
|
|
61
|
+
const cliPath = target.args[1];
|
|
62
|
+
if (!checkExists(cliPath))
|
|
63
|
+
problems.push(`${cliPath} is gone`);
|
|
64
|
+
return problems;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* @description Replace this process with `target`. Never returns on success. A missing `process.execve` or an error from it
|
|
68
|
+
* is logged and ends the process with {@link restartFailedExitCode}, so a supervisor sees a failed restart rather than a bot
|
|
69
|
+
* that is silently gone.
|
|
70
|
+
*/
|
|
71
|
+
function reexecProcess(target, env, deps) {
|
|
72
|
+
if (!deps.execve) {
|
|
73
|
+
deps.log('[update] this Node has no process.execve — cannot restart in place');
|
|
74
|
+
deps.exit(exports.restartFailedExitCode);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
deps.execve(target.file, target.args, env);
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
deps.log(`[update] execve failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
82
|
+
deps.exit(exports.restartFailedExitCode);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/** @description The real dependencies of {@link reexecProcess}. */
|
|
86
|
+
function createDefaultReexecDeps() {
|
|
87
|
+
const nativeExecve = process.execve;
|
|
88
|
+
return {
|
|
89
|
+
execve: nativeExecve ? (file, args, env) => nativeExecve.call(process, file, args, env) : undefined,
|
|
90
|
+
exit: (code) => process.exit(code),
|
|
91
|
+
log: (line) => console.error(line),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=restart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart.js","sourceRoot":"","sources":["../../src/selfUpdate/restart.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,0CAIC;AAGD,8CAMC;AAaD,sCAYC;AAGD,0DAOC;AAlED,uCAAyB;AACzB,2CAA6B;AAE7B;;;;GAIG;AAEH,oFAAoF;AACvE,QAAA,qBAAqB,GAAG,EAAE,CAAC;AAOxC,6GAA6G;AAC7G,SAAgB,eAAe,CAAC,OAA2E;IACzG,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACjE,0GAA0G;IAC1G,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACjG,CAAC;AAED,gIAAgI;AAChI,SAAgB,iBAAiB,CAAC,MAAoB,EAAE,cAA2C,EAAE,CAAC,UAAU;IAC9G,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;QAAE,QAAQ,CAAC,IAAI,CAAC,uBAAuB,MAAM,CAAC,IAAI,UAAU,CAAC,CAAC;IAC3F,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;QAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,UAAU,CAAC,CAAC;IAC/D,OAAO,QAAQ,CAAC;AAClB,CAAC;AAQD;;;;GAIG;AACH,SAAgB,aAAa,CAAC,MAAoB,EAAE,GAAsB,EAAE,IAAgB;IAC1F,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,IAAI,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC;QAC/E,IAAI,CAAC,IAAI,CAAC,6BAAqB,CAAC,CAAC;QACjC,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,GAAG,CAAC,2BAA2B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9F,IAAI,CAAC,IAAI,CAAC,6BAAqB,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,mEAAmE;AACnE,SAAgB,uBAAuB;IACrC,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IACpC,OAAO;QACL,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;QACnG,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;QAClC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;KACnC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface SelfCheckResult {
|
|
2
|
+
/** The package version, whatever else failed. */
|
|
3
|
+
version: string;
|
|
4
|
+
/** What is wrong; empty = the install is sound. */
|
|
5
|
+
problems: string[];
|
|
6
|
+
}
|
|
7
|
+
/** @description The built modules a self-check imports: every `.js` under `dist/` except entry points and tests, relative paths. */
|
|
8
|
+
export declare function listImportableModules(distDirectory: string): string[];
|
|
9
|
+
/**
|
|
10
|
+
* @description Check the install at `packageRoot` (the folder holding `package.json` and `dist/`). Importing the modules
|
|
11
|
+
* may resolve paths under `DATA_DIR` at import time, so the check runs with a throwaway one and removes it.
|
|
12
|
+
* `loadNativeBinding` loads `node-pty` (a parameter so a test can make it fail).
|
|
13
|
+
*/
|
|
14
|
+
export declare function runSelfCheck(packageRoot: string, expectVersion: string | null, loadNativeBinding?: () => Promise<object>): Promise<SelfCheckResult>;
|
|
15
|
+
/**
|
|
16
|
+
* @description The CLI face: version on stdout, every problem on stderr, exit 1 when there is one. `packageRoot` is the
|
|
17
|
+
* folder this module's own `dist/` belongs to.
|
|
18
|
+
*/
|
|
19
|
+
export declare function runSelfCheckCli(args: string[], packageRoot: string): Promise<number>;
|
|
20
|
+
//# sourceMappingURL=selfCheck.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selfCheck.d.ts","sourceRoot":"","sources":["../../src/selfUpdate/selfCheck.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,eAAe;IAC9B,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,oIAAoI;AACpI,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,CAMrE;AAOD;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,GAAG,IAAI,EAC5B,iBAAiB,GAAE,MAAM,OAAO,CAAC,MAAM,CAA4B,GAClE,OAAO,CAAC,eAAe,CAAC,CAsC1B;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO1F"}
|