@doist/outline-cli 0.0.1 → 1.0.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 +17 -0
- package/README.md +130 -29
- package/dist/commands/auth.d.ts +2 -0
- package/dist/commands/auth.js +179 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/collection.d.ts +2 -0
- package/dist/commands/collection.js +120 -0
- package/dist/commands/collection.js.map +1 -0
- package/dist/commands/document.d.ts +2 -0
- package/dist/commands/document.js +209 -0
- package/dist/commands/document.js.map +1 -0
- package/dist/commands/search.d.ts +2 -0
- package/dist/commands/search.js +42 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/skill.d.ts +2 -0
- package/dist/commands/skill.js +82 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +14 -0
- package/dist/lib/api.js +62 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/auth.d.ts +6 -0
- package/dist/lib/auth.js +70 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/markdown.d.ts +1 -0
- package/dist/lib/markdown.js +7 -0
- package/dist/lib/markdown.js.map +1 -0
- package/dist/lib/oauth-server.d.ts +14 -0
- package/dist/lib/oauth-server.js +203 -0
- package/dist/lib/oauth-server.js.map +1 -0
- package/dist/lib/oauth.d.ts +17 -0
- package/dist/lib/oauth.js +38 -0
- package/dist/lib/oauth.js.map +1 -0
- package/dist/lib/output.d.ts +11 -0
- package/dist/lib/output.js +60 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/pkce.d.ts +3 -0
- package/dist/lib/pkce.js +20 -0
- package/dist/lib/pkce.js.map +1 -0
- package/dist/lib/refs.d.ts +33 -0
- package/dist/lib/refs.js +180 -0
- package/dist/lib/refs.js.map +1 -0
- package/dist/lib/skills/content.d.ts +3 -0
- package/dist/lib/skills/content.js +100 -0
- package/dist/lib/skills/content.js.map +1 -0
- package/dist/lib/skills/create-installer.d.ts +8 -0
- package/dist/lib/skills/create-installer.js +77 -0
- package/dist/lib/skills/create-installer.js.map +1 -0
- package/dist/lib/skills/index.d.ts +5 -0
- package/dist/lib/skills/index.js +40 -0
- package/dist/lib/skills/index.js.map +1 -0
- package/dist/lib/skills/types.d.ts +10 -0
- package/dist/lib/skills/types.js +2 -0
- package/dist/lib/skills/types.js.map +1 -0
- package/dist/lib/skills/update-installed.d.ts +6 -0
- package/dist/lib/skills/update-installed.js +23 -0
- package/dist/lib/skills/update-installed.js.map +1 -0
- package/dist/lib/spinner.d.ts +13 -0
- package/dist/lib/spinner.js +58 -0
- package/dist/lib/spinner.js.map +1 -0
- package/dist/postinstall.d.ts +1 -0
- package/dist/postinstall.js +3 -0
- package/dist/postinstall.js.map +1 -0
- package/package.json +61 -8
- package/scripts/postinstall.js +12 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# 1.0.0 (2026-03-25)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* broaden CI detection to handle all truthy values ([7dc2806](https://github.com/Doist/outline-cli/commit/7dc2806a344d8be841fb9fae80dce59dc6667fac))
|
|
7
|
+
* exclude dist from biome checks ([0dc49a3](https://github.com/Doist/outline-cli/commit/0dc49a38515ae75005f253413b171c6c6b48e99a))
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
### Features
|
|
11
|
+
|
|
12
|
+
* add API Spinner Proxy ([#17](https://github.com/Doist/outline-cli/issues/17)) ([a3bc75a](https://github.com/Doist/outline-cli/commit/a3bc75afaf81b684703b0e821d5fec0cf05a29cb))
|
|
13
|
+
* add fuzzy reference resolution ([#19](https://github.com/Doist/outline-cli/issues/19)) ([6c1c6f9](https://github.com/Doist/outline-cli/commit/6c1c6f97762809ddf3e4d912892c3582cf9f8b36))
|
|
14
|
+
* add npm publishing, new agent skills, and skill auto-update ([#36](https://github.com/Doist/outline-cli/issues/36)) ([bcb2e75](https://github.com/Doist/outline-cli/commit/bcb2e7593447ca35069316636cbfda02bb86fb91)), closes [Doist/todoist-cli#176](https://github.com/Doist/todoist-cli/issues/176) [Doist/bob-cli#17](https://github.com/Doist/bob-cli/issues/17) [Doist/twist-cli#101](https://github.com/Doist/twist-cli/issues/101)
|
|
15
|
+
* add structured error formatting with codes and hints ([#18](https://github.com/Doist/outline-cli/issues/18)) ([17658d2](https://github.com/Doist/outline-cli/commit/17658d2a66d30939146b1fb5625782df122ff315))
|
|
16
|
+
* implement OAuth PKCE browser login ([#20](https://github.com/Doist/outline-cli/issues/20)) ([b7f6eec](https://github.com/Doist/outline-cli/commit/b7f6eec84250b6d8ceea5e5f1b282bdb550b8092)), closes [#7](https://github.com/Doist/outline-cli/issues/7) [outline/outline#11254](https://github.com/outline/outline/issues/11254)
|
|
17
|
+
* improve oauth login inputs and callback UX ([#31](https://github.com/Doist/outline-cli/issues/31)) ([3011b28](https://github.com/Doist/outline-cli/commit/3011b28a2f3a0b04460ad8def9ed39426b7a1df3))
|
package/README.md
CHANGED
|
@@ -1,45 +1,146 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Outline CLI
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
CLI for the [Outline](https://www.getoutline.com) wiki/knowledge base API.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## Installation
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
> ```bash
|
|
8
|
+
> npm install -g @doist/outline-cli
|
|
9
|
+
> ```
|
|
8
10
|
|
|
9
|
-
|
|
11
|
+
### Agent Skills
|
|
10
12
|
|
|
11
|
-
|
|
12
|
-
1. Configure OIDC trusted publishing for the package name `@doist/outline-cli`
|
|
13
|
-
2. Enable secure, token-less publishing from CI/CD workflows
|
|
14
|
-
3. Establish provenance for packages published under this name
|
|
13
|
+
Install skills for your coding agent:
|
|
15
14
|
|
|
16
|
-
|
|
15
|
+
```bash
|
|
16
|
+
ol skill install claude-code
|
|
17
|
+
ol skill install codex
|
|
18
|
+
ol skill install cursor
|
|
19
|
+
ol skill install gemini
|
|
20
|
+
ol skill install pi
|
|
21
|
+
ol skill install universal
|
|
22
|
+
```
|
|
17
23
|
|
|
18
|
-
|
|
24
|
+
Skills are installed to `~/<agent-dir>/skills/outline-cli/SKILL.md` (e.g. `~/.claude/` for claude-code, `~/.agents/` for universal, etc.). When updating the CLI, installed skills are updated automatically. The `universal` agent is compatible with Amp, OpenCode, and other agents that read from `~/.agents/`.
|
|
19
25
|
|
|
20
|
-
|
|
26
|
+
```bash
|
|
27
|
+
ol skill list
|
|
28
|
+
ol skill uninstall <agent>
|
|
29
|
+
```
|
|
21
30
|
|
|
22
|
-
|
|
31
|
+
## Uninstallation
|
|
23
32
|
|
|
24
|
-
|
|
25
|
-
2. Configure the trusted publisher (e.g., GitHub Actions)
|
|
26
|
-
3. Specify the repository and workflow that should be allowed to publish
|
|
27
|
-
4. Use the configured workflow to publish your actual package
|
|
33
|
+
First, remove any installed agent skills:
|
|
28
34
|
|
|
29
|
-
|
|
35
|
+
```bash
|
|
36
|
+
ol skill uninstall <agent>
|
|
37
|
+
```
|
|
30
38
|
|
|
31
|
-
|
|
32
|
-
- Contains no executable code
|
|
33
|
-
- Provides no functionality
|
|
34
|
-
- Should not be installed as a dependency
|
|
35
|
-
- Exists only for administrative purposes
|
|
39
|
+
Then uninstall the CLI:
|
|
36
40
|
|
|
37
|
-
|
|
41
|
+
```bash
|
|
42
|
+
npm uninstall -g @doist/outline-cli
|
|
43
|
+
```
|
|
38
44
|
|
|
39
|
-
|
|
40
|
-
- [npm Trusted Publishing Documentation](https://docs.npmjs.com/generating-provenance-statements)
|
|
41
|
-
- [GitHub Actions OIDC Documentation](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect)
|
|
45
|
+
## Local Setup
|
|
42
46
|
|
|
43
|
-
|
|
47
|
+
```bash
|
|
48
|
+
git clone https://github.com/Doist/outline-cli.git
|
|
49
|
+
cd outline-cli
|
|
50
|
+
npm install
|
|
51
|
+
npm run build
|
|
52
|
+
npm link
|
|
53
|
+
```
|
|
44
54
|
|
|
45
|
-
|
|
55
|
+
## Setup
|
|
56
|
+
|
|
57
|
+
### OAuth login (recommended)
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
ol auth login
|
|
61
|
+
ol auth login --base-url <your-outline-url>
|
|
62
|
+
ol auth login --client-id <your-client-id>
|
|
63
|
+
ol auth login --callback-port 54969
|
|
64
|
+
ol auth status
|
|
65
|
+
ol auth logout
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**Setup:**
|
|
69
|
+
|
|
70
|
+
1. Create a public OAuth app in Outline (Settings → Applications)
|
|
71
|
+
2. Set the redirect URI to `http://localhost:54969/callback`
|
|
72
|
+
3. Run `ol auth login` and enter your OAuth client ID when prompted
|
|
73
|
+
(or pass it directly with `--client-id <your-client-id>`)
|
|
74
|
+
4. If needed, pass `--base-url <your-outline-url>` or set `OUTLINE_URL`
|
|
75
|
+
(for self-hosted instances or non-default URLs)
|
|
76
|
+
5. If needed, pass `--callback-port <port>` or set `OUTLINE_OAUTH_CALLBACK_PORT`
|
|
77
|
+
and register `http://localhost:<port>/callback` in your OAuth app
|
|
78
|
+
|
|
79
|
+
The client ID is saved for future logins. You can also set `OUTLINE_OAUTH_CLIENT_ID`
|
|
80
|
+
for your local environment.
|
|
81
|
+
|
|
82
|
+
### Manual token login
|
|
83
|
+
|
|
84
|
+
If you prefer using an API token directly:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
ol auth login --token <your-api-token>
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Generate a token in Outline under Settings → API Tokens.
|
|
91
|
+
|
|
92
|
+
### Configuration
|
|
93
|
+
|
|
94
|
+
Token resolution: `OUTLINE_API_TOKEN` env var → `~/.config/outline-cli/config.json`.
|
|
95
|
+
|
|
96
|
+
Base URL resolution: `OUTLINE_URL` env var → config file → `https://app.getoutline.com`.
|
|
97
|
+
|
|
98
|
+
Callback port resolution for OAuth login:
|
|
99
|
+
`--callback-port` → `OUTLINE_OAUTH_CALLBACK_PORT` → `54969`.
|
|
100
|
+
|
|
101
|
+
Self-hosted instances: pass `--base-url` or set `OUTLINE_URL` (you can still provide it interactively).
|
|
102
|
+
|
|
103
|
+
## Commands
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
# Search
|
|
107
|
+
ol search "query" --limit 10 --collection <id> --status published
|
|
108
|
+
|
|
109
|
+
# Documents (alias: ol doc)
|
|
110
|
+
ol document list --collection <id> --sort updatedAt --direction DESC
|
|
111
|
+
ol document get <urlId> # renders markdown for terminal
|
|
112
|
+
ol document get <urlId> --raw # outputs raw markdown
|
|
113
|
+
ol document open <urlId> # opens in browser
|
|
114
|
+
ol document create --title "Title" --collection <id> --file doc.md --publish
|
|
115
|
+
ol document update <urlId> --file updated.md
|
|
116
|
+
ol document delete <urlId> --confirm
|
|
117
|
+
ol document move <urlId> --collection <target-id>
|
|
118
|
+
ol document archive <urlId>
|
|
119
|
+
ol document unarchive <urlId>
|
|
120
|
+
|
|
121
|
+
# Collections (alias: ol col)
|
|
122
|
+
ol collection list
|
|
123
|
+
ol collection get <id>
|
|
124
|
+
ol collection create --name "Engineering" --color "#4CAF50"
|
|
125
|
+
ol collection update <id> --name "New Name"
|
|
126
|
+
ol collection delete <id> --confirm
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Output modes
|
|
130
|
+
|
|
131
|
+
All commands support:
|
|
132
|
+
|
|
133
|
+
- Default: colored human-readable output
|
|
134
|
+
- `--json`: pretty-printed JSON (essential fields)
|
|
135
|
+
- `--json --full`: all fields
|
|
136
|
+
- `--ndjson`: one JSON object per line (for piping)
|
|
137
|
+
|
|
138
|
+
## Development
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
npm install
|
|
142
|
+
npm run dev # watch mode
|
|
143
|
+
npm run type-check # typecheck without emitting
|
|
144
|
+
npm run test # run tests
|
|
145
|
+
npm run build # compile to dist/
|
|
146
|
+
```
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { createInterface } from "node:readline/promises";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import open from "open";
|
|
4
|
+
import { apiRequest } from "../lib/api.js";
|
|
5
|
+
import { clearConfig, getBaseUrl, getOAuthClientId, getTokenSource, saveConfig, } from "../lib/auth.js";
|
|
6
|
+
import { buildAuthorizationUrl, exchangeCodeForToken } from "../lib/oauth.js";
|
|
7
|
+
import { DEFAULT_OAUTH_CALLBACK_PORT, startOAuthCallbackServer, } from "../lib/oauth-server.js";
|
|
8
|
+
import { formatError } from "../lib/output.js";
|
|
9
|
+
import { generateCodeChallenge, generateCodeVerifier, generateState, } from "../lib/pkce.js";
|
|
10
|
+
async function prompt(question) {
|
|
11
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
12
|
+
try {
|
|
13
|
+
return await rl.question(question);
|
|
14
|
+
}
|
|
15
|
+
finally {
|
|
16
|
+
rl.close();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function parseCallbackPort(rawPort) {
|
|
20
|
+
const parsed = Number(rawPort);
|
|
21
|
+
if (!Number.isInteger(parsed) || parsed < 1 || parsed > 65_535) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
return parsed;
|
|
25
|
+
}
|
|
26
|
+
export function registerAuthCommand(program) {
|
|
27
|
+
const auth = program.command("auth").description("Manage authentication");
|
|
28
|
+
auth
|
|
29
|
+
.command("login")
|
|
30
|
+
.description("Authenticate with an Outline instance")
|
|
31
|
+
.option("--token <token>", "Authenticate using a personal API token")
|
|
32
|
+
.option("--base-url <url>", "Outline base URL to use for this login (saved for future logins)")
|
|
33
|
+
.option("--client-id <clientId>", "OAuth client ID to use for this login (saved for future logins)")
|
|
34
|
+
.option("--callback-port <port>", `Local OAuth callback port (default: ${DEFAULT_OAUTH_CALLBACK_PORT})`)
|
|
35
|
+
.action(async (options) => {
|
|
36
|
+
const configuredBaseUrl = getBaseUrl();
|
|
37
|
+
const optionBaseUrl = options.baseUrl?.trim();
|
|
38
|
+
const envBaseUrl = process.env.OUTLINE_URL?.trim();
|
|
39
|
+
let url = optionBaseUrl || envBaseUrl;
|
|
40
|
+
if (!url) {
|
|
41
|
+
const baseUrlInput = await prompt(`Base URL (default: ${configuredBaseUrl}): `);
|
|
42
|
+
url = baseUrlInput.trim() || configuredBaseUrl;
|
|
43
|
+
}
|
|
44
|
+
url = url.replace(/\/$/, "");
|
|
45
|
+
const optionClientId = options.clientId?.trim();
|
|
46
|
+
const optionCallbackPort = options.callbackPort?.trim();
|
|
47
|
+
const envCallbackPort = process.env.OUTLINE_OAUTH_CALLBACK_PORT?.trim();
|
|
48
|
+
const rawCallbackPort = optionCallbackPort || envCallbackPort;
|
|
49
|
+
let callbackPort = DEFAULT_OAUTH_CALLBACK_PORT;
|
|
50
|
+
if (rawCallbackPort) {
|
|
51
|
+
const parsedPort = parseCallbackPort(rawCallbackPort);
|
|
52
|
+
if (!parsedPort) {
|
|
53
|
+
console.error(formatError("OAUTH_CALLBACK_PORT_INVALID", `Invalid callback port: ${rawCallbackPort}`, [
|
|
54
|
+
"Use an integer between 1 and 65535",
|
|
55
|
+
"Set via --callback-port or OUTLINE_OAUTH_CALLBACK_PORT",
|
|
56
|
+
]));
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
callbackPort = parsedPort;
|
|
60
|
+
}
|
|
61
|
+
if (options.token) {
|
|
62
|
+
saveConfig(options.token.trim(), url, optionClientId);
|
|
63
|
+
try {
|
|
64
|
+
const { data } = await apiRequest("auth.info");
|
|
65
|
+
console.log(chalk.green(`Authenticated to ${data.team.name} as ${data.user.name}`));
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
console.log(chalk.yellow("Token saved, but could not verify:"), err.message);
|
|
69
|
+
}
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const existingClientId = getOAuthClientId();
|
|
73
|
+
let clientId = optionClientId || existingClientId;
|
|
74
|
+
if (!clientId) {
|
|
75
|
+
const clientIdInput = await prompt("OAuth Client ID: ");
|
|
76
|
+
clientId = clientIdInput.trim();
|
|
77
|
+
}
|
|
78
|
+
if (!clientId) {
|
|
79
|
+
console.error(formatError("OAUTH_CLIENT_ID_REQUIRED", "OAuth client ID is required.", [
|
|
80
|
+
"Create a public OAuth app in Outline settings",
|
|
81
|
+
"Use --client-id <id> for this login",
|
|
82
|
+
"Set OUTLINE_OAUTH_CLIENT_ID or enter it here",
|
|
83
|
+
]));
|
|
84
|
+
process.exit(1);
|
|
85
|
+
}
|
|
86
|
+
const codeVerifier = generateCodeVerifier();
|
|
87
|
+
const codeChallenge = generateCodeChallenge(codeVerifier);
|
|
88
|
+
const state = generateState();
|
|
89
|
+
let callbackServer;
|
|
90
|
+
try {
|
|
91
|
+
callbackServer = await startOAuthCallbackServer({
|
|
92
|
+
state,
|
|
93
|
+
port: callbackPort,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
const error = err;
|
|
98
|
+
const hints = [
|
|
99
|
+
`Ensure http://localhost:${callbackPort}/callback is reachable from your browser`,
|
|
100
|
+
"Re-run with 'ol auth login --token <token>' for manual auth",
|
|
101
|
+
];
|
|
102
|
+
if (error.code === "EADDRINUSE") {
|
|
103
|
+
hints.unshift(`Port ${callbackPort} is already in use. Close the other process using it.`);
|
|
104
|
+
}
|
|
105
|
+
console.error(formatError("OAUTH_CALLBACK_SERVER_FAILED", `Could not start local OAuth callback server: ${error.message}`, hints));
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
108
|
+
const authorizationUrl = buildAuthorizationUrl({
|
|
109
|
+
baseUrl: url,
|
|
110
|
+
clientId,
|
|
111
|
+
redirectUri: callbackServer.redirectUri,
|
|
112
|
+
codeChallenge,
|
|
113
|
+
state,
|
|
114
|
+
});
|
|
115
|
+
try {
|
|
116
|
+
await open(authorizationUrl);
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
console.log(chalk.yellow("Could not open browser automatically."), chalk.dim(authorizationUrl));
|
|
120
|
+
console.log(chalk.dim(err.message));
|
|
121
|
+
}
|
|
122
|
+
console.log(chalk.dim("Waiting for OAuth authorization..."));
|
|
123
|
+
try {
|
|
124
|
+
const code = await callbackServer.waitForCode;
|
|
125
|
+
const token = await exchangeCodeForToken({
|
|
126
|
+
baseUrl: url,
|
|
127
|
+
clientId,
|
|
128
|
+
redirectUri: callbackServer.redirectUri,
|
|
129
|
+
codeVerifier,
|
|
130
|
+
code,
|
|
131
|
+
});
|
|
132
|
+
saveConfig(token, url, clientId);
|
|
133
|
+
const { data } = await apiRequest("auth.info");
|
|
134
|
+
console.log(chalk.green(`Authenticated to ${data.team.name} as ${data.user.name}`));
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
callbackServer.close();
|
|
138
|
+
console.error(formatError("OAUTH_LOGIN_FAILED", `OAuth login failed: ${err.message}`, [
|
|
139
|
+
"Confirm the OAuth app redirect URI matches the CLI callback",
|
|
140
|
+
"Verify --base-url or OUTLINE_URL points to your Outline instance",
|
|
141
|
+
"Re-run with 'ol auth login --token' for manual auth",
|
|
142
|
+
]));
|
|
143
|
+
process.exit(1);
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
auth
|
|
147
|
+
.command("status")
|
|
148
|
+
.description("Show current authentication state")
|
|
149
|
+
.action(async () => {
|
|
150
|
+
const source = getTokenSource();
|
|
151
|
+
if (!source) {
|
|
152
|
+
console.log(chalk.yellow("Not authenticated. Run: ol auth login"));
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
console.log(chalk.dim(`Token source: ${source}`));
|
|
156
|
+
console.log(chalk.dim(`Base URL: ${getBaseUrl()}`));
|
|
157
|
+
try {
|
|
158
|
+
const { data } = await apiRequest("auth.info");
|
|
159
|
+
console.log(`Team: ${chalk.bold(data.team.name)}`);
|
|
160
|
+
console.log(`User: ${data.user.name} (${data.user.email})`);
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
console.error(formatError("AUTH_VERIFICATION_FAILED", `Could not fetch auth info: ${err.message}`, [
|
|
164
|
+
"Check that your API token is valid",
|
|
165
|
+
"Verify the base URL is correct",
|
|
166
|
+
"Run 'ol auth login' to re-authenticate",
|
|
167
|
+
]));
|
|
168
|
+
process.exit(1);
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
auth
|
|
172
|
+
.command("logout")
|
|
173
|
+
.description("Clear saved authentication")
|
|
174
|
+
.action(() => {
|
|
175
|
+
clearConfig();
|
|
176
|
+
console.log("Logged out.");
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { apiRequest } from "../lib/api.js";
|
|
3
|
+
import { formatError, getOutputOptions, outputItem, outputList, } from "../lib/output.js";
|
|
4
|
+
import { resolveCollectionId, resolveCollectionRef } from "../lib/refs.js";
|
|
5
|
+
const essentialKeys = [
|
|
6
|
+
"id",
|
|
7
|
+
"name",
|
|
8
|
+
"description",
|
|
9
|
+
"color",
|
|
10
|
+
"documentCount",
|
|
11
|
+
];
|
|
12
|
+
function formatCollection(col) {
|
|
13
|
+
const name = chalk.bold(col.name);
|
|
14
|
+
const id = chalk.dim(col.id);
|
|
15
|
+
const count = chalk.dim(`${col.documentCount} docs`);
|
|
16
|
+
return `${name} ${id} ${count}`;
|
|
17
|
+
}
|
|
18
|
+
export function registerCollectionCommand(program) {
|
|
19
|
+
const col = program
|
|
20
|
+
.command("collection")
|
|
21
|
+
.alias("col")
|
|
22
|
+
.description("Manage collections");
|
|
23
|
+
col
|
|
24
|
+
.command("list")
|
|
25
|
+
.description("List collections")
|
|
26
|
+
.option("--limit <n>", "Max results", "25")
|
|
27
|
+
.option("--offset <n>", "Pagination offset", "0")
|
|
28
|
+
.option("--json", "Output JSON")
|
|
29
|
+
.option("--ndjson", "Output NDJSON")
|
|
30
|
+
.option("--full", "Include all fields in JSON output")
|
|
31
|
+
.action(async (opts) => {
|
|
32
|
+
const { data, pagination } = await apiRequest("collections.list", {
|
|
33
|
+
limit: Number(opts.limit),
|
|
34
|
+
offset: Number(opts.offset),
|
|
35
|
+
});
|
|
36
|
+
outputList(data, formatCollection, essentialKeys, getOutputOptions(opts), pagination);
|
|
37
|
+
});
|
|
38
|
+
col
|
|
39
|
+
.command("get <id>")
|
|
40
|
+
.description("Get collection details by ID or name")
|
|
41
|
+
.option("--json", "Output JSON")
|
|
42
|
+
.option("--full", "Include all fields in JSON output")
|
|
43
|
+
.action(async (id, opts) => {
|
|
44
|
+
const resolved = await resolveCollectionRef(id);
|
|
45
|
+
// If resolved from name search (collections.list), some fields may be missing
|
|
46
|
+
let data;
|
|
47
|
+
if (resolved.documentCount !== undefined) {
|
|
48
|
+
data = resolved;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
const response = await apiRequest("collections.info", {
|
|
52
|
+
id: resolved.id,
|
|
53
|
+
});
|
|
54
|
+
data = response.data;
|
|
55
|
+
}
|
|
56
|
+
outputItem(data, formatCollection, essentialKeys, getOutputOptions(opts));
|
|
57
|
+
});
|
|
58
|
+
col
|
|
59
|
+
.command("create")
|
|
60
|
+
.description("Create a collection")
|
|
61
|
+
.requiredOption("--name <name>", "Collection name")
|
|
62
|
+
.option("--description <text>", "Description")
|
|
63
|
+
.option("--color <hex>", "Color hex code")
|
|
64
|
+
.option("--private", "Make private")
|
|
65
|
+
.option("--json", "Output JSON")
|
|
66
|
+
.action(async (opts) => {
|
|
67
|
+
const body = { name: opts.name };
|
|
68
|
+
if (opts.description)
|
|
69
|
+
body.description = opts.description;
|
|
70
|
+
if (opts.color)
|
|
71
|
+
body.color = opts.color;
|
|
72
|
+
if (opts.private)
|
|
73
|
+
body.permission = "";
|
|
74
|
+
const { data } = await apiRequest("collections.create", body);
|
|
75
|
+
if (opts.json) {
|
|
76
|
+
outputItem(data, formatCollection, essentialKeys, { json: true });
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
console.log(chalk.green(`Created: ${data.name}`), chalk.dim(data.id));
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
col
|
|
83
|
+
.command("update <id>")
|
|
84
|
+
.description("Update a collection")
|
|
85
|
+
.option("--name <name>", "New name")
|
|
86
|
+
.option("--description <text>", "New description")
|
|
87
|
+
.option("--color <hex>", "New color")
|
|
88
|
+
.option("--json", "Output JSON")
|
|
89
|
+
.action(async (id, opts) => {
|
|
90
|
+
const resolvedId = await resolveCollectionId(id);
|
|
91
|
+
const body = { id: resolvedId };
|
|
92
|
+
if (opts.name)
|
|
93
|
+
body.name = opts.name;
|
|
94
|
+
if (opts.description)
|
|
95
|
+
body.description = opts.description;
|
|
96
|
+
if (opts.color)
|
|
97
|
+
body.color = opts.color;
|
|
98
|
+
const { data } = await apiRequest("collections.update", body);
|
|
99
|
+
if (opts.json) {
|
|
100
|
+
outputItem(data, formatCollection, essentialKeys, { json: true });
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
console.log(chalk.green(`Updated: ${data.name}`), chalk.dim(data.id));
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
col
|
|
107
|
+
.command("delete <id>")
|
|
108
|
+
.description("Delete a collection")
|
|
109
|
+
.option("--confirm", "Skip confirmation")
|
|
110
|
+
.action(async (id, opts) => {
|
|
111
|
+
if (!opts.confirm) {
|
|
112
|
+
console.error(formatError("CONFIRMATION_REQUIRED", "Delete operation requires confirmation.", ["Use --confirm flag to proceed with deletion"]));
|
|
113
|
+
process.exit(1);
|
|
114
|
+
}
|
|
115
|
+
const resolvedId = await resolveCollectionId(id);
|
|
116
|
+
await apiRequest("collections.delete", { id: resolvedId });
|
|
117
|
+
console.log("Deleted.");
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=collection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collection.js","sourceRoot":"","sources":["../../src/commands/collection.ts"],"names":[],"mappings":"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"}
|