@doist/outline-cli 1.3.0 → 1.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 +12 -0
- package/dist/commands/changelog.d.ts +7 -0
- package/dist/commands/changelog.js +95 -0
- package/dist/commands/changelog.js.map +1 -0
- package/dist/commands/update/action.d.ts +3 -0
- package/dist/commands/update/action.js +139 -0
- package/dist/commands/update/action.js.map +1 -0
- package/dist/commands/update/channel.d.ts +1 -0
- package/dist/commands/update/channel.js +12 -0
- package/dist/commands/update/channel.js.map +1 -0
- package/dist/commands/{update.d.ts → update/index.d.ts} +0 -3
- package/dist/commands/update/index.js +18 -0
- package/dist/commands/update/index.js.map +1 -0
- package/dist/commands/update/switch.d.ts +4 -0
- package/dist/commands/update/switch.js +29 -0
- package/dist/commands/update/switch.js.map +1 -0
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/skills/content.d.ts +1 -1
- package/dist/lib/skills/content.js +7 -4
- package/dist/lib/skills/content.js.map +1 -1
- package/dist/lib/update-config.d.ts +3 -0
- package/dist/lib/update-config.js +31 -0
- package/dist/lib/update-config.js.map +1 -0
- package/package.json +1 -1
- package/dist/commands/update.js +0 -92
- package/dist/commands/update.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
## [1.5.0](https://github.com/Doist/outline-cli/compare/v1.4.0...v1.5.0) (2026-04-02)
|
|
2
|
+
|
|
3
|
+
### Features
|
|
4
|
+
|
|
5
|
+
* allow switching between stable and pre-release update channels ([#52](https://github.com/Doist/outline-cli/issues/52)) ([6834688](https://github.com/Doist/outline-cli/commit/683468819423e93b3f1ca8b38af9ce6788a2e675))
|
|
6
|
+
|
|
7
|
+
## [1.4.0](https://github.com/Doist/outline-cli/compare/v1.3.0...v1.4.0) (2026-04-02)
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* add `ol changelog` command ([#50](https://github.com/Doist/outline-cli/issues/50)) ([60656e5](https://github.com/Doist/outline-cli/commit/60656e5d816af6080f5084e3f44d0d9763e6c354))
|
|
12
|
+
|
|
1
13
|
## [1.3.0](https://github.com/Doist/outline-cli/compare/v1.2.1...v1.3.0) (2026-04-02)
|
|
2
14
|
|
|
3
15
|
### Features
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import packageJson from '../../package.json' with { type: 'json' };
|
|
6
|
+
const CHANGELOG_PATH = join(dirname(fileURLToPath(import.meta.url)), '..', '..', 'CHANGELOG.md');
|
|
7
|
+
const CHANGELOG_URL = `https://github.com/Doist/outline-cli/blob/v${packageJson.version}/CHANGELOG.md`;
|
|
8
|
+
function formatInline(text) {
|
|
9
|
+
return text
|
|
10
|
+
.replace(/\*\*([^*]+)\*\*/g, (_, content) => chalk.bold(content))
|
|
11
|
+
.replace(/`([^`]+)`/g, (_, code) => chalk.cyan(code));
|
|
12
|
+
}
|
|
13
|
+
function formatForTerminal(text) {
|
|
14
|
+
return text
|
|
15
|
+
.split('\n')
|
|
16
|
+
.map((line) => {
|
|
17
|
+
// Version headers: ## 1.25.0 (date) → bold green
|
|
18
|
+
if (line.startsWith('## ')) {
|
|
19
|
+
return chalk.green.bold(line.slice(3));
|
|
20
|
+
}
|
|
21
|
+
// Section headers: ### Features → bold
|
|
22
|
+
if (line.startsWith('### ')) {
|
|
23
|
+
return chalk.bold(line.slice(4));
|
|
24
|
+
}
|
|
25
|
+
// Bullet items: * or - description → dimmed bullet + text
|
|
26
|
+
if (line.startsWith('* ')) {
|
|
27
|
+
return ` ${chalk.dim('•')} ${formatInline(line.slice(2))}`;
|
|
28
|
+
}
|
|
29
|
+
if (line.startsWith('- ')) {
|
|
30
|
+
return ` ${chalk.dim('•')} ${formatInline(line.slice(2))}`;
|
|
31
|
+
}
|
|
32
|
+
return formatInline(line);
|
|
33
|
+
})
|
|
34
|
+
.join('\n');
|
|
35
|
+
}
|
|
36
|
+
function cleanChangelog(text) {
|
|
37
|
+
return (text
|
|
38
|
+
// Version headers: ## [1.25.0](https://...) (date) → ## 1.25.0 (date)
|
|
39
|
+
.replace(/## \[([^\]]+)\]\([^)]*\)/g, '## $1')
|
|
40
|
+
// Remove commit hash links: ([abc1234](https://...))
|
|
41
|
+
.replace(/ \([a-f0-9]{7}\)/g, '')
|
|
42
|
+
.replace(/ \(\[[a-f0-9]{7}\]\([^)]*\)\)/g, '')
|
|
43
|
+
// Issue/PR links: [#151](https://...) → #151
|
|
44
|
+
.replace(/\[#(\d+)\]\([^)]*\)/g, '#$1')
|
|
45
|
+
// Remove **deps:** dependency update lines (not useful to end users)
|
|
46
|
+
.replace(/^[*-] \*\*deps:\*\*.*$/gm, '')
|
|
47
|
+
// Remove **scope:** prefixes but keep the text: **task:** foo → foo
|
|
48
|
+
.replace(/\*\*[\w-]+:\*\* /g, '')
|
|
49
|
+
// Clean up blank lines left by removed dep lines
|
|
50
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
51
|
+
// Remove section headers left empty after filtering (e.g. ### Bug Fixes with no items)
|
|
52
|
+
.replace(/### [\w ]+\n\n(?=#|$)/gm, ''));
|
|
53
|
+
}
|
|
54
|
+
function parseChangelog(content, count) {
|
|
55
|
+
const sections = content.split(/\n(?=## (?:\d|\[))/);
|
|
56
|
+
const versionSections = sections.filter((s) => /^## (?:\d|\[)/.test(s));
|
|
57
|
+
const selected = versionSections.slice(0, count);
|
|
58
|
+
if (selected.length === 0) {
|
|
59
|
+
return { text: 'No changelog entries found.', hasMore: false };
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
text: cleanChangelog(selected.join('\n').trimEnd()),
|
|
63
|
+
hasMore: versionSections.length > count,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
export async function changelogAction(options) {
|
|
67
|
+
const count = Number(options.count);
|
|
68
|
+
if (!Number.isInteger(count) || count < 1) {
|
|
69
|
+
console.error(chalk.red('Error:'), 'Count must be a positive number');
|
|
70
|
+
process.exitCode = 1;
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
let content;
|
|
74
|
+
try {
|
|
75
|
+
content = await readFile(CHANGELOG_PATH, 'utf-8');
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
console.error(chalk.red('Error:'), 'Could not read changelog file');
|
|
79
|
+
process.exitCode = 1;
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const { text, hasMore } = parseChangelog(content, count);
|
|
83
|
+
console.log(formatForTerminal(text));
|
|
84
|
+
if (hasMore) {
|
|
85
|
+
console.log(chalk.dim(`\nView full changelog: ${CHANGELOG_URL}`));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
export function registerChangelogCommand(program) {
|
|
89
|
+
program
|
|
90
|
+
.command('changelog')
|
|
91
|
+
.description('Show recent changelog entries')
|
|
92
|
+
.option('-n, --count <number>', 'Number of versions to show', '5')
|
|
93
|
+
.action(changelogAction);
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=changelog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changelog.js","sourceRoot":"","sources":["../../src/commands/changelog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import packageJson from '../../../package.json' with { type: 'json' };
|
|
4
|
+
import { withSpinner } from '../../lib/spinner.js';
|
|
5
|
+
import { getUpdateChannel } from '../../lib/update-config.js';
|
|
6
|
+
import { fetchWithRetry } from '../../transport/fetch-with-retry.js';
|
|
7
|
+
const PACKAGE_NAME = '@doist/outline-cli';
|
|
8
|
+
function getInstallTag(channel) {
|
|
9
|
+
return channel === 'pre-release' ? 'next' : 'latest';
|
|
10
|
+
}
|
|
11
|
+
function parseVersion(version) {
|
|
12
|
+
const [core, ...rest] = version.split('-');
|
|
13
|
+
const [major, minor, patch] = core.split('.').map(Number);
|
|
14
|
+
return { major, minor, patch, prerelease: rest.length > 0 ? rest.join('-') : undefined };
|
|
15
|
+
}
|
|
16
|
+
/** Returns true when `candidate` is strictly newer than `current` per semver. */
|
|
17
|
+
function isNewer(current, candidate) {
|
|
18
|
+
const a = parseVersion(current);
|
|
19
|
+
const b = parseVersion(candidate);
|
|
20
|
+
// Compare major.minor.patch
|
|
21
|
+
for (const key of ['major', 'minor', 'patch']) {
|
|
22
|
+
if (b[key] !== a[key])
|
|
23
|
+
return b[key] > a[key];
|
|
24
|
+
}
|
|
25
|
+
// Equal core: release > pre-release
|
|
26
|
+
if (!a.prerelease && b.prerelease)
|
|
27
|
+
return false;
|
|
28
|
+
if (a.prerelease && !b.prerelease)
|
|
29
|
+
return true;
|
|
30
|
+
// Both pre-release: numeric-aware comparison (handles "next.10" > "next.2" etc.)
|
|
31
|
+
if (a.prerelease && b.prerelease)
|
|
32
|
+
return b.prerelease.localeCompare(a.prerelease, undefined, { numeric: true }) > 0;
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
async function fetchVersion(channel) {
|
|
36
|
+
const tag = getInstallTag(channel);
|
|
37
|
+
const url = `https://registry.npmjs.org/${PACKAGE_NAME}/${tag}`;
|
|
38
|
+
const response = await fetchWithRetry({ url });
|
|
39
|
+
if (!response.ok) {
|
|
40
|
+
throw new Error(`Registry request failed (HTTP ${response.status})`);
|
|
41
|
+
}
|
|
42
|
+
const data = (await response.json());
|
|
43
|
+
return data.version;
|
|
44
|
+
}
|
|
45
|
+
function detectPackageManager() {
|
|
46
|
+
const execPath = process.env.npm_execpath || process.argv[1] || '';
|
|
47
|
+
if (execPath.includes('pnpm'))
|
|
48
|
+
return 'pnpm';
|
|
49
|
+
return 'npm';
|
|
50
|
+
}
|
|
51
|
+
function runInstall(pm, tag) {
|
|
52
|
+
const command = pm === 'pnpm' ? 'add' : 'install';
|
|
53
|
+
return new Promise((resolve, reject) => {
|
|
54
|
+
const child = spawn(pm, [command, '-g', `${PACKAGE_NAME}@${tag}`], {
|
|
55
|
+
stdio: ['ignore', 'ignore', 'pipe'],
|
|
56
|
+
shell: process.platform === 'win32',
|
|
57
|
+
});
|
|
58
|
+
let stderr = '';
|
|
59
|
+
child.stderr?.on('data', (data) => {
|
|
60
|
+
stderr += data.toString();
|
|
61
|
+
});
|
|
62
|
+
child.on('error', reject);
|
|
63
|
+
child.on('close', (code) => resolve({ exitCode: code ?? 1, stderr }));
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
function channelLabel(channel) {
|
|
67
|
+
return channel === 'pre-release' ? ` ${chalk.magenta('(pre-release)')}` : '';
|
|
68
|
+
}
|
|
69
|
+
export async function updateAction(options) {
|
|
70
|
+
const channel = getUpdateChannel();
|
|
71
|
+
const tag = getInstallTag(channel);
|
|
72
|
+
const label = channelLabel(channel);
|
|
73
|
+
const currentVersion = packageJson.version;
|
|
74
|
+
let latestVersion;
|
|
75
|
+
try {
|
|
76
|
+
latestVersion = await withSpinner({ text: `Checking for updates${label}...`, color: 'blue' }, () => fetchVersion(channel));
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
80
|
+
console.error(chalk.red('Error:'), `Failed to check for updates: ${message}`);
|
|
81
|
+
process.exitCode = 1;
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const updateAvailable = isNewer(currentVersion, latestVersion);
|
|
85
|
+
if (options.check) {
|
|
86
|
+
const channelLine = channel === 'pre-release'
|
|
87
|
+
? ` Channel: ${chalk.magenta('pre-release')}`
|
|
88
|
+
: ` Channel: ${chalk.green('stable')}`;
|
|
89
|
+
if (updateAvailable) {
|
|
90
|
+
console.log(`Update available: ${chalk.dim(`v${currentVersion}`)} → ${chalk.green(`v${latestVersion}`)}`);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
console.log(chalk.green('✓'), `Already up to date (v${currentVersion})`);
|
|
94
|
+
}
|
|
95
|
+
console.log(channelLine);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (currentVersion === latestVersion) {
|
|
99
|
+
console.log(chalk.green('✓'), `Already up to date${label} (v${currentVersion})`);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (updateAvailable) {
|
|
103
|
+
console.log(`Update available${label}: ${chalk.dim(`v${currentVersion}`)} → ${chalk.green(`v${latestVersion}`)}`);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
console.log(chalk.yellow('Note:'), `v${latestVersion}${label} is older than your current v${currentVersion}`);
|
|
107
|
+
}
|
|
108
|
+
const pm = detectPackageManager();
|
|
109
|
+
let result;
|
|
110
|
+
try {
|
|
111
|
+
result = await withSpinner({ text: `Updating to v${latestVersion}${label}...`, color: 'blue' }, () => runInstall(pm, tag));
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
115
|
+
console.error(chalk.red('Error:'), `Install failed: ${message}`);
|
|
116
|
+
process.exitCode = 1;
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
if (result.exitCode !== 0) {
|
|
120
|
+
if (result.stderr &&
|
|
121
|
+
(result.stderr.includes('EACCES') || result.stderr.includes('EPERM'))) {
|
|
122
|
+
console.error(chalk.red('Error:'), 'Permission denied. Try running with sudo:');
|
|
123
|
+
console.error(chalk.dim(` sudo ${pm} ${pm === 'pnpm' ? 'add' : 'install'} -g ${PACKAGE_NAME}@${tag}`));
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
console.error(chalk.red('Error:'), `${pm} exited with code ${result.exitCode}`);
|
|
127
|
+
if (result.stderr) {
|
|
128
|
+
console.error(chalk.dim(result.stderr.trim()));
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
process.exitCode = 1;
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
console.log(chalk.green('✓'), `Updated to v${latestVersion}${label}`);
|
|
135
|
+
if (channel === 'stable') {
|
|
136
|
+
console.log(chalk.dim(' Run'), chalk.cyan('ol changelog'), chalk.dim('to see what changed'));
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action.js","sourceRoot":"","sources":["../../../src/commands/update/action.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function showChannel(): void;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { getUpdateChannel } from '../../lib/update-config.js';
|
|
3
|
+
export function showChannel() {
|
|
4
|
+
const channel = getUpdateChannel();
|
|
5
|
+
if (channel === 'pre-release') {
|
|
6
|
+
console.log(`Update channel: ${chalk.magenta('pre-release')}`);
|
|
7
|
+
}
|
|
8
|
+
else {
|
|
9
|
+
console.log(`Update channel: ${chalk.green('stable')}`);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=channel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../../../src/commands/update/channel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAE7D,MAAM,UAAU,WAAW;IACvB,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAA;IAElC,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;IAClE,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC3D,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { updateAction } from './action.js';
|
|
2
|
+
import { showChannel } from './channel.js';
|
|
3
|
+
import { switchChannel } from './switch.js';
|
|
4
|
+
export function registerUpdateCommand(program) {
|
|
5
|
+
const update = program
|
|
6
|
+
.command('update')
|
|
7
|
+
.description('Update the CLI to the latest version for the configured channel')
|
|
8
|
+
.option('--check', 'Check for updates without installing')
|
|
9
|
+
.action(updateAction);
|
|
10
|
+
update.command('channel').description('Show the current update channel').action(showChannel);
|
|
11
|
+
update
|
|
12
|
+
.command('switch')
|
|
13
|
+
.description('Switch update channel between stable and pre-release')
|
|
14
|
+
.option('--stable', 'Use the stable release channel')
|
|
15
|
+
.option('--pre-release', 'Use the pre-release (next) channel')
|
|
16
|
+
.action(switchChannel);
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/update/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IAClD,MAAM,MAAM,GAAG,OAAO;SACjB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,iEAAiE,CAAC;SAC9E,MAAM,CAAC,SAAS,EAAE,sCAAsC,CAAC;SACzD,MAAM,CAAC,YAAY,CAAC,CAAA;IAEzB,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,iCAAiC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IAE5F,MAAM;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,sDAAsD,CAAC;SACnE,MAAM,CAAC,UAAU,EAAE,gCAAgC,CAAC;SACpD,MAAM,CAAC,eAAe,EAAE,oCAAoC,CAAC;SAC7D,MAAM,CAAC,aAAa,CAAC,CAAA;AAC9B,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { setUpdateChannel } from '../../lib/update-config.js';
|
|
3
|
+
export function switchChannel(options) {
|
|
4
|
+
if (options.stable && options.preRelease) {
|
|
5
|
+
console.error(chalk.red('Error:'), 'Specify either --stable or --pre-release, not both.');
|
|
6
|
+
process.exitCode = 1;
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
if (!options.stable && !options.preRelease) {
|
|
10
|
+
console.error(chalk.red('Error:'), 'Specify --stable or --pre-release.');
|
|
11
|
+
process.exitCode = 1;
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const channel = options.preRelease ? 'pre-release' : 'stable';
|
|
15
|
+
setUpdateChannel(channel);
|
|
16
|
+
if (channel === 'pre-release') {
|
|
17
|
+
console.log(chalk.green('✓'), `Update channel set to ${chalk.magenta('pre-release')}`);
|
|
18
|
+
console.log();
|
|
19
|
+
console.log(chalk.yellow('Note:'), 'Pre-release updates follow the', chalk.cyan('next'), 'branch.');
|
|
20
|
+
console.log('When pre-release changes are merged into a stable release, no further');
|
|
21
|
+
console.log('pre-release updates will be published until a new pre-release cycle begins.');
|
|
22
|
+
console.log('Remember to switch back to stable when done:');
|
|
23
|
+
console.log(chalk.dim(' ol update switch --stable'));
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
console.log(chalk.green('✓'), 'Update channel set to stable');
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=switch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"switch.js","sourceRoot":"","sources":["../../../src/commands/update/switch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,gBAAgB,EAAsB,MAAM,4BAA4B,CAAA;AAEjF,MAAM,UAAU,aAAa,CAAC,OAAmD;IAC7E,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,qDAAqD,CAAC,CAAA;QACzF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;QACpB,OAAM;IACV,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACzC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,oCAAoC,CAAC,CAAA;QACxE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;QACpB,OAAM;IACV,CAAC;IAED,MAAM,OAAO,GAAkB,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAA;IAE5E,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAEzB,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,yBAAyB,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;QACtF,OAAO,CAAC,GAAG,EAAE,CAAA;QACb,OAAO,CAAC,GAAG,CACP,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EACrB,gCAAgC,EAChC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAClB,SAAS,CACZ,CAAA;QACD,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAA;QACpF,OAAO,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAA;QAC1F,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAA;QAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAA;IACzD,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,8BAA8B,CAAC,CAAA;IACjE,CAAC;AACL,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { Command } from 'commander';
|
|
3
3
|
import { registerAuthCommand } from './commands/auth.js';
|
|
4
|
+
import { registerChangelogCommand } from './commands/changelog.js';
|
|
4
5
|
import { registerCollectionCommand } from './commands/collection.js';
|
|
5
6
|
import { registerDocumentCommand } from './commands/document.js';
|
|
6
7
|
import { registerSearchCommand } from './commands/search.js';
|
|
7
8
|
import { registerSkillCommand } from './commands/skill.js';
|
|
8
|
-
import { registerUpdateCommand } from './commands/update.js';
|
|
9
|
+
import { registerUpdateCommand } from './commands/update/index.js';
|
|
9
10
|
const program = new Command();
|
|
10
11
|
program
|
|
11
12
|
.name('ol')
|
|
@@ -21,6 +22,7 @@ registerSearchCommand(program);
|
|
|
21
22
|
registerDocumentCommand(program);
|
|
22
23
|
registerCollectionCommand(program);
|
|
23
24
|
registerSkillCommand(program);
|
|
25
|
+
registerChangelogCommand(program);
|
|
24
26
|
registerUpdateCommand(program);
|
|
25
27
|
program.parseAsync().catch((err) => {
|
|
26
28
|
console.error(err.message);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAA;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAA;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAA;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAElE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACF,IAAI,CAAC,IAAI,CAAC;KACV,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,6CAA6C,CAAC;KAC1D,MAAM,CAAC,cAAc,EAAE,4BAA4B,CAAC;KACpD,WAAW,CACR,OAAO,EACP;;;kEAG0D,CAC7D,CAAA;AAEL,mBAAmB,CAAC,OAAO,CAAC,CAAA;AAC5B,qBAAqB,CAAC,OAAO,CAAC,CAAA;AAC9B,uBAAuB,CAAC,OAAO,CAAC,CAAA;AAChC,yBAAyB,CAAC,OAAO,CAAC,CAAA;AAClC,oBAAoB,CAAC,OAAO,CAAC,CAAA;AAC7B,wBAAwB,CAAC,OAAO,CAAC,CAAA;AACjC,qBAAqB,CAAC,OAAO,CAAC,CAAA;AAE9B,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;IACtC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACnB,CAAC,CAAC,CAAA"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export declare const SKILL_NAME = "outline-cli";
|
|
2
2
|
export declare const SKILL_DESCRIPTION = "Search and manage Outline wiki documents and collections via the ol CLI";
|
|
3
|
-
export declare const SKILL_CONTENT = "# Outline CLI (ol)\n\nUse this skill when the user wants to interact with their Outline wiki/knowledge base.\n\n## Quick Reference\n\n- `ol search \"query\"` - Search documents\n- `ol doc list` - List documents\n- `ol doc get <id>` - Read a document\n- `ol doc open <id>` - Open document in browser\n- `ol doc create --title \"Title\" --collection <id>` - Create document\n- `ol col list` - List collections\n\n## Output Formats\n\nAll list commands support:\n- `--json` - JSON output (essential fields)\n- `--ndjson` - Newline-delimited JSON (streaming)\n- `--full` - Include all fields in JSON\n\n## Document References\n\nDocuments can be referenced by:\n- URL ID (the slug suffix after the last hyphen)\n- Full Outline URL (auto-extracted)\n- Document ID\n\n## Commands\n\n### Search\n```bash\nol search \"query\"\nol search \"query\" --limit 10\nol search \"query\" --collection <id>\nol search \"query\" --status published\nol search \"query\" --json\n```\n\n### Documents\n```bash\nol doc list --collection <id> --limit 25\nol doc list --sort title --direction ASC\nol doc get <id> # Rendered markdown\nol doc get <id> --raw # Raw markdown\nol doc get <id> --json\nol doc open <id> # Open in browser\nol doc create --title \"Title\" --collection <id> --text \"# Content\"\nol doc create --title \"Title\" --parent <ref> --text \"# Content\" # Nest under parent (collection inferred)\nol doc create --title \"Title\" --collection <id> --file ./doc.md\nol doc update <id> --title \"New Title\"\nol doc update <id> --file ./updated.md\nol doc move <id> --collection <target-id> # Move to collection root\nol doc move <id> --parent <ref> # Nest under parent (collection inferred)\nol doc archive <id>\nol doc unarchive <id>\nol doc delete <id> --confirm\n```\n\n### Collections\n```bash\nol col list\nol col get <id>\nol col create --name \"Name\" --description \"Desc\" --color \"#hex\"\nol col create --name \"Private\" --private\nol col update <id> --name \"New Name\"\nol col delete <id> --confirm\n```\n\n### Authentication\n```bash\nol auth login # Configure API token and base URL\nol auth status # Show current auth state\nol auth logout # Clear saved credentials\n```\n\n### Update & Changelog\n```bash\nol update
|
|
3
|
+
export declare const SKILL_CONTENT = "# Outline CLI (ol)\n\nUse this skill when the user wants to interact with their Outline wiki/knowledge base.\n\n## Quick Reference\n\n- `ol search \"query\"` - Search documents\n- `ol doc list` - List documents\n- `ol doc get <id>` - Read a document\n- `ol doc open <id>` - Open document in browser\n- `ol doc create --title \"Title\" --collection <id>` - Create document\n- `ol col list` - List collections\n\n## Output Formats\n\nAll list commands support:\n- `--json` - JSON output (essential fields)\n- `--ndjson` - Newline-delimited JSON (streaming)\n- `--full` - Include all fields in JSON\n\n## Document References\n\nDocuments can be referenced by:\n- URL ID (the slug suffix after the last hyphen)\n- Full Outline URL (auto-extracted)\n- Document ID\n\n## Commands\n\n### Search\n```bash\nol search \"query\"\nol search \"query\" --limit 10\nol search \"query\" --collection <id>\nol search \"query\" --status published\nol search \"query\" --json\n```\n\n### Documents\n```bash\nol doc list --collection <id> --limit 25\nol doc list --sort title --direction ASC\nol doc get <id> # Rendered markdown\nol doc get <id> --raw # Raw markdown\nol doc get <id> --json\nol doc open <id> # Open in browser\nol doc create --title \"Title\" --collection <id> --text \"# Content\"\nol doc create --title \"Title\" --parent <ref> --text \"# Content\" # Nest under parent (collection inferred)\nol doc create --title \"Title\" --collection <id> --file ./doc.md\nol doc update <id> --title \"New Title\"\nol doc update <id> --file ./updated.md\nol doc move <id> --collection <target-id> # Move to collection root\nol doc move <id> --parent <ref> # Nest under parent (collection inferred)\nol doc archive <id>\nol doc unarchive <id>\nol doc delete <id> --confirm\n```\n\n### Collections\n```bash\nol col list\nol col get <id>\nol col create --name \"Name\" --description \"Desc\" --color \"#hex\"\nol col create --name \"Private\" --private\nol col update <id> --name \"New Name\"\nol col delete <id> --confirm\n```\n\n### Authentication\n```bash\nol auth login # Configure API token and base URL\nol auth status # Show current auth state\nol auth logout # Clear saved credentials\n```\n\n### Update & Changelog\n```bash\nol update # Update CLI to latest version\nol update --check # Check for updates without installing, show channel\nol update channel # Show current update channel\nol update switch --stable # Switch to stable release channel\nol update switch --pre-release # Switch to pre-release (next) channel\nol changelog # Show recent changelog entries\nol changelog -n 3 # Show last 3 versions\n```\n\n## Examples\n\n### Find and read a document\n```bash\nol search \"onboarding\" --json | jq '.[0].document.urlId'\nol doc get <urlId>\n```\n\n### Create a document from a file\n```bash\nol doc create --title \"Meeting Notes\" --collection <id> --file ./notes.md --publish\n```\n\n### List all collections and their documents\n```bash\nol col list --json\nol doc list --collection <id> --sort title --direction ASC\n```\n\n### Bulk export with ndjson\n```bash\nol doc list --ndjson --full | jq -r '.title'\n```\n";
|
|
@@ -77,10 +77,13 @@ ol auth logout # Clear saved credentials
|
|
|
77
77
|
|
|
78
78
|
### Update & Changelog
|
|
79
79
|
\`\`\`bash
|
|
80
|
-
ol update
|
|
81
|
-
ol update --check
|
|
82
|
-
ol
|
|
83
|
-
ol
|
|
80
|
+
ol update # Update CLI to latest version
|
|
81
|
+
ol update --check # Check for updates without installing, show channel
|
|
82
|
+
ol update channel # Show current update channel
|
|
83
|
+
ol update switch --stable # Switch to stable release channel
|
|
84
|
+
ol update switch --pre-release # Switch to pre-release (next) channel
|
|
85
|
+
ol changelog # Show recent changelog entries
|
|
86
|
+
ol changelog -n 3 # Show last 3 versions
|
|
84
87
|
\`\`\`
|
|
85
88
|
|
|
86
89
|
## Examples
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content.js","sourceRoot":"","sources":["../../../src/lib/skills/content.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,aAAa,CAAA;AACvC,MAAM,CAAC,MAAM,iBAAiB,GAC1B,yEAAyE,CAAA;AAE7E,MAAM,CAAC,MAAM,aAAa,GAAG
|
|
1
|
+
{"version":3,"file":"content.js","sourceRoot":"","sources":["../../../src/lib/skills/content.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,aAAa,CAAA;AACvC,MAAM,CAAC,MAAM,iBAAiB,GAC1B,yEAAyE,CAAA;AAE7E,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6G5B,CAAA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
const CONFIG_DIR = join(homedir(), '.config', 'outline-cli');
|
|
5
|
+
const CONFIG_PATH = join(CONFIG_DIR, 'config.json');
|
|
6
|
+
export function getUpdateChannel() {
|
|
7
|
+
if (!existsSync(CONFIG_PATH))
|
|
8
|
+
return 'stable';
|
|
9
|
+
try {
|
|
10
|
+
const config = JSON.parse(readFileSync(CONFIG_PATH, 'utf-8'));
|
|
11
|
+
return config.update_channel ?? 'stable';
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return 'stable';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function setUpdateChannel(channel) {
|
|
18
|
+
let existing = {};
|
|
19
|
+
if (existsSync(CONFIG_PATH)) {
|
|
20
|
+
try {
|
|
21
|
+
existing = JSON.parse(readFileSync(CONFIG_PATH, 'utf-8'));
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// ignore
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
existing.update_channel = channel;
|
|
28
|
+
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
29
|
+
writeFileSync(CONFIG_PATH, `${JSON.stringify(existing, null, 2)}\n`);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=update-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-config.js","sourceRoot":"","sources":["../../src/lib/update-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC5E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAShC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,aAAa,CAAC,CAAA;AAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAA;AAEnD,MAAM,UAAU,gBAAgB;IAC5B,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,QAAQ,CAAA;IAC7C,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAiB,CAAA;QAC7E,OAAO,MAAM,CAAC,cAAc,IAAI,QAAQ,CAAA;IAC5C,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,QAAQ,CAAA;IACnB,CAAC;AACL,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAsB;IACnD,IAAI,QAAQ,GAA4B,EAAE,CAAA;IAC1C,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC;YACD,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAA4B,CAAA;QACxF,CAAC;QAAC,MAAM,CAAC;YACL,SAAS;QACb,CAAC;IACL,CAAC;IACD,QAAQ,CAAC,cAAc,GAAG,OAAO,CAAA;IACjC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC1C,aAAa,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;AACxE,CAAC"}
|
package/package.json
CHANGED
package/dist/commands/update.js
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import { spawn } from 'node:child_process';
|
|
2
|
-
import chalk from 'chalk';
|
|
3
|
-
import packageJson from '../../package.json' with { type: 'json' };
|
|
4
|
-
import { withSpinner } from '../lib/spinner.js';
|
|
5
|
-
import { fetchWithRetry } from '../transport/fetch-with-retry.js';
|
|
6
|
-
const PACKAGE_NAME = '@doist/outline-cli';
|
|
7
|
-
const REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`;
|
|
8
|
-
async function fetchLatestVersion() {
|
|
9
|
-
const response = await fetchWithRetry({ url: REGISTRY_URL });
|
|
10
|
-
if (!response.ok) {
|
|
11
|
-
throw new Error(`Registry request failed (HTTP ${response.status})`);
|
|
12
|
-
}
|
|
13
|
-
const data = (await response.json());
|
|
14
|
-
return data.version;
|
|
15
|
-
}
|
|
16
|
-
function detectPackageManager() {
|
|
17
|
-
const execPath = process.env.npm_execpath || process.argv[1] || '';
|
|
18
|
-
if (execPath.includes('pnpm'))
|
|
19
|
-
return 'pnpm';
|
|
20
|
-
return 'npm';
|
|
21
|
-
}
|
|
22
|
-
function runInstall(pm) {
|
|
23
|
-
const command = pm === 'pnpm' ? 'add' : 'install';
|
|
24
|
-
return new Promise((resolve, reject) => {
|
|
25
|
-
const child = spawn(pm, [command, '-g', `${PACKAGE_NAME}@latest`], {
|
|
26
|
-
stdio: ['ignore', 'ignore', 'pipe'],
|
|
27
|
-
shell: process.platform === 'win32',
|
|
28
|
-
});
|
|
29
|
-
let stderr = '';
|
|
30
|
-
child.stderr?.on('data', (data) => {
|
|
31
|
-
stderr += data.toString();
|
|
32
|
-
});
|
|
33
|
-
child.on('error', reject);
|
|
34
|
-
child.on('close', (code) => resolve({ exitCode: code ?? 1, stderr }));
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
export async function updateAction(options) {
|
|
38
|
-
const currentVersion = packageJson.version;
|
|
39
|
-
let latestVersion;
|
|
40
|
-
try {
|
|
41
|
-
latestVersion = await withSpinner({ text: 'Checking for updates...', color: 'blue' }, fetchLatestVersion);
|
|
42
|
-
}
|
|
43
|
-
catch (error) {
|
|
44
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
45
|
-
console.error(chalk.red('Error:'), `Failed to check for updates: ${message}`);
|
|
46
|
-
process.exitCode = 1;
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
if (currentVersion === latestVersion) {
|
|
50
|
-
console.log(chalk.green('✓'), `Already up to date (v${currentVersion})`);
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
console.log(`Update available: ${chalk.dim(`v${currentVersion}`)} → ${chalk.green(`v${latestVersion}`)}`);
|
|
54
|
-
if (options.check) {
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
const pm = detectPackageManager();
|
|
58
|
-
let result;
|
|
59
|
-
try {
|
|
60
|
-
result = await withSpinner({ text: `Updating to v${latestVersion}...`, color: 'blue' }, () => runInstall(pm));
|
|
61
|
-
}
|
|
62
|
-
catch (error) {
|
|
63
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
64
|
-
console.error(chalk.red('Error:'), `Install failed: ${message}`);
|
|
65
|
-
process.exitCode = 1;
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
if (result.exitCode !== 0) {
|
|
69
|
-
if (result.stderr &&
|
|
70
|
-
(result.stderr.includes('EACCES') || result.stderr.includes('EPERM'))) {
|
|
71
|
-
console.error(chalk.red('Error:'), 'Permission denied. Try running with sudo:');
|
|
72
|
-
console.error(chalk.dim(` sudo ${pm} ${pm === 'pnpm' ? 'add' : 'install'} -g ${PACKAGE_NAME}@latest`));
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
console.error(chalk.red('Error:'), `${pm} exited with code ${result.exitCode}`);
|
|
76
|
-
if (result.stderr) {
|
|
77
|
-
console.error(chalk.dim(result.stderr.trim()));
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
process.exitCode = 1;
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
console.log(chalk.green('✓'), `Updated to v${latestVersion}`);
|
|
84
|
-
}
|
|
85
|
-
export function registerUpdateCommand(program) {
|
|
86
|
-
program
|
|
87
|
-
.command('update')
|
|
88
|
-
.description('Update the CLI to the latest version')
|
|
89
|
-
.option('--check', 'Check for updates without installing')
|
|
90
|
-
.action(updateAction);
|
|
91
|
-
}
|
|
92
|
-
//# sourceMappingURL=update.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
|