@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
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
export const SKILL_NAME = "outline";
|
|
2
|
+
export const SKILL_DESCRIPTION = "Search and manage Outline wiki documents and collections via the ol CLI";
|
|
3
|
+
export const SKILL_CONTENT = `# Outline CLI (ol)
|
|
4
|
+
|
|
5
|
+
Use this skill when the user wants to interact with their Outline wiki/knowledge base.
|
|
6
|
+
|
|
7
|
+
## Quick Reference
|
|
8
|
+
|
|
9
|
+
- \`ol search "query"\` - Search documents
|
|
10
|
+
- \`ol doc list\` - List documents
|
|
11
|
+
- \`ol doc get <id>\` - Read a document
|
|
12
|
+
- \`ol doc open <id>\` - Open document in browser
|
|
13
|
+
- \`ol doc create --title "Title" --collection <id>\` - Create document
|
|
14
|
+
- \`ol col list\` - List collections
|
|
15
|
+
|
|
16
|
+
## Output Formats
|
|
17
|
+
|
|
18
|
+
All list commands support:
|
|
19
|
+
- \`--json\` - JSON output (essential fields)
|
|
20
|
+
- \`--ndjson\` - Newline-delimited JSON (streaming)
|
|
21
|
+
- \`--full\` - Include all fields in JSON
|
|
22
|
+
|
|
23
|
+
## Document References
|
|
24
|
+
|
|
25
|
+
Documents can be referenced by:
|
|
26
|
+
- URL ID (the slug suffix after the last hyphen)
|
|
27
|
+
- Full Outline URL (auto-extracted)
|
|
28
|
+
- Document ID
|
|
29
|
+
|
|
30
|
+
## Commands
|
|
31
|
+
|
|
32
|
+
### Search
|
|
33
|
+
\`\`\`bash
|
|
34
|
+
ol search "query"
|
|
35
|
+
ol search "query" --limit 10
|
|
36
|
+
ol search "query" --collection <id>
|
|
37
|
+
ol search "query" --status published
|
|
38
|
+
ol search "query" --json
|
|
39
|
+
\`\`\`
|
|
40
|
+
|
|
41
|
+
### Documents
|
|
42
|
+
\`\`\`bash
|
|
43
|
+
ol doc list --collection <id> --limit 25
|
|
44
|
+
ol doc list --sort title --direction ASC
|
|
45
|
+
ol doc get <id> # Rendered markdown
|
|
46
|
+
ol doc get <id> --raw # Raw markdown
|
|
47
|
+
ol doc get <id> --json
|
|
48
|
+
ol doc open <id> # Open in browser
|
|
49
|
+
ol doc create --title "Title" --collection <id> --text "# Content"
|
|
50
|
+
ol doc create --title "Title" --collection <id> --file ./doc.md
|
|
51
|
+
ol doc update <id> --title "New Title"
|
|
52
|
+
ol doc update <id> --file ./updated.md
|
|
53
|
+
ol doc move <id> --collection <target-id>
|
|
54
|
+
ol doc archive <id>
|
|
55
|
+
ol doc unarchive <id>
|
|
56
|
+
ol doc delete <id> --confirm
|
|
57
|
+
\`\`\`
|
|
58
|
+
|
|
59
|
+
### Collections
|
|
60
|
+
\`\`\`bash
|
|
61
|
+
ol col list
|
|
62
|
+
ol col get <id>
|
|
63
|
+
ol col create --name "Name" --description "Desc" --color "#hex"
|
|
64
|
+
ol col create --name "Private" --private
|
|
65
|
+
ol col update <id> --name "New Name"
|
|
66
|
+
ol col delete <id> --confirm
|
|
67
|
+
\`\`\`
|
|
68
|
+
|
|
69
|
+
### Authentication
|
|
70
|
+
\`\`\`bash
|
|
71
|
+
ol auth login # Configure API token and base URL
|
|
72
|
+
ol auth status # Show current auth state
|
|
73
|
+
ol auth logout # Clear saved credentials
|
|
74
|
+
\`\`\`
|
|
75
|
+
|
|
76
|
+
## Examples
|
|
77
|
+
|
|
78
|
+
### Find and read a document
|
|
79
|
+
\`\`\`bash
|
|
80
|
+
ol search "onboarding" --json | jq '.[0].document.urlId'
|
|
81
|
+
ol doc get <urlId>
|
|
82
|
+
\`\`\`
|
|
83
|
+
|
|
84
|
+
### Create a document from a file
|
|
85
|
+
\`\`\`bash
|
|
86
|
+
ol doc create --title "Meeting Notes" --collection <id> --file ./notes.md --publish
|
|
87
|
+
\`\`\`
|
|
88
|
+
|
|
89
|
+
### List all collections and their documents
|
|
90
|
+
\`\`\`bash
|
|
91
|
+
ol col list --json
|
|
92
|
+
ol doc list --collection <id> --sort title --direction ASC
|
|
93
|
+
\`\`\`
|
|
94
|
+
|
|
95
|
+
### Bulk export with ndjson
|
|
96
|
+
\`\`\`bash
|
|
97
|
+
ol doc list --ndjson --full | jq -r '.title'
|
|
98
|
+
\`\`\`
|
|
99
|
+
`;
|
|
100
|
+
//# sourceMappingURL=content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content.js","sourceRoot":"","sources":["../../../src/lib/skills/content.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC;AACpC,MAAM,CAAC,MAAM,iBAAiB,GAC7B,yEAAyE,CAAC;AAE3E,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgG5B,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { access, mkdir, readdir, rmdir, unlink, writeFile, } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { SKILL_CONTENT, SKILL_DESCRIPTION, SKILL_NAME } from "./content.js";
|
|
5
|
+
function generateSkillFile() {
|
|
6
|
+
const frontmatter = `---
|
|
7
|
+
name: ${SKILL_NAME}
|
|
8
|
+
description: ${SKILL_DESCRIPTION}
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
`;
|
|
12
|
+
return frontmatter + SKILL_CONTENT;
|
|
13
|
+
}
|
|
14
|
+
export function createInstaller(config) {
|
|
15
|
+
function getInstallPath(local) {
|
|
16
|
+
const base = local ? process.cwd() : homedir();
|
|
17
|
+
return join(base, config.dirName, "skills", "outline-cli", "SKILL.md");
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
name: config.name,
|
|
21
|
+
description: config.description,
|
|
22
|
+
getInstallPath,
|
|
23
|
+
generateContent() {
|
|
24
|
+
return generateSkillFile();
|
|
25
|
+
},
|
|
26
|
+
async isInstalled(local) {
|
|
27
|
+
try {
|
|
28
|
+
await access(getInstallPath(local));
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
async install(local, force) {
|
|
36
|
+
if (!local && config.dirName !== ".agents") {
|
|
37
|
+
const agentDir = join(homedir(), config.dirName);
|
|
38
|
+
try {
|
|
39
|
+
await access(agentDir);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
throw new Error(`${config.name} does not appear to be installed (${agentDir} not found)`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const filepath = getInstallPath(local);
|
|
46
|
+
const exists = await this.isInstalled(local);
|
|
47
|
+
if (exists && !force) {
|
|
48
|
+
throw new Error(`Skill file already exists at ${filepath}. Use --force to overwrite.`);
|
|
49
|
+
}
|
|
50
|
+
await mkdir(dirname(filepath), { recursive: true });
|
|
51
|
+
await writeFile(filepath, this.generateContent(), "utf-8");
|
|
52
|
+
},
|
|
53
|
+
async update(local) {
|
|
54
|
+
const filepath = getInstallPath(local);
|
|
55
|
+
await writeFile(filepath, this.generateContent(), "utf-8");
|
|
56
|
+
},
|
|
57
|
+
async uninstall(local) {
|
|
58
|
+
const filepath = getInstallPath(local);
|
|
59
|
+
const exists = await this.isInstalled(local);
|
|
60
|
+
if (!exists) {
|
|
61
|
+
throw new Error(`Skill file not found at ${filepath}`);
|
|
62
|
+
}
|
|
63
|
+
await unlink(filepath);
|
|
64
|
+
const dir = dirname(filepath);
|
|
65
|
+
try {
|
|
66
|
+
const files = await readdir(dir);
|
|
67
|
+
if (files.length === 0) {
|
|
68
|
+
await rmdir(dir);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// ignore errors when cleaning up empty directory
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=create-installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-installer.js","sourceRoot":"","sources":["../../../src/lib/skills/create-installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { SkillInstaller } from "./types.js";
|
|
2
|
+
export declare const skillInstallers: Record<string, SkillInstaller>;
|
|
3
|
+
export declare function getInstaller(agent: string): SkillInstaller | undefined;
|
|
4
|
+
export declare function listAgents(): string[];
|
|
5
|
+
export type { SkillInstaller } from "./types.js";
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { createInstaller } from "./create-installer.js";
|
|
2
|
+
export const skillInstallers = {
|
|
3
|
+
"claude-code": createInstaller({
|
|
4
|
+
name: "claude-code",
|
|
5
|
+
description: "Claude Code skill for Outline CLI",
|
|
6
|
+
dirName: ".claude",
|
|
7
|
+
}),
|
|
8
|
+
codex: createInstaller({
|
|
9
|
+
name: "codex",
|
|
10
|
+
description: "Codex skill for Outline CLI",
|
|
11
|
+
dirName: ".codex",
|
|
12
|
+
}),
|
|
13
|
+
cursor: createInstaller({
|
|
14
|
+
name: "cursor",
|
|
15
|
+
description: "Cursor skill for Outline CLI",
|
|
16
|
+
dirName: ".cursor",
|
|
17
|
+
}),
|
|
18
|
+
gemini: createInstaller({
|
|
19
|
+
name: "gemini",
|
|
20
|
+
description: "Gemini CLI skill for Outline CLI",
|
|
21
|
+
dirName: ".gemini",
|
|
22
|
+
}),
|
|
23
|
+
pi: createInstaller({
|
|
24
|
+
name: "pi",
|
|
25
|
+
description: "Pi skill for Outline CLI",
|
|
26
|
+
dirName: ".pi",
|
|
27
|
+
}),
|
|
28
|
+
universal: createInstaller({
|
|
29
|
+
name: "universal",
|
|
30
|
+
description: "Universal agent skill for Outline CLI",
|
|
31
|
+
dirName: ".agents",
|
|
32
|
+
}),
|
|
33
|
+
};
|
|
34
|
+
export function getInstaller(agent) {
|
|
35
|
+
return skillInstallers[agent];
|
|
36
|
+
}
|
|
37
|
+
export function listAgents() {
|
|
38
|
+
return Object.keys(skillInstallers);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/skills/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGxD,MAAM,CAAC,MAAM,eAAe,GAAmC;IAC9D,aAAa,EAAE,eAAe,CAAC;QAC9B,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,mCAAmC;QAChD,OAAO,EAAE,SAAS;KAClB,CAAC;IACF,KAAK,EAAE,eAAe,CAAC;QACtB,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,6BAA6B;QAC1C,OAAO,EAAE,QAAQ;KACjB,CAAC;IACF,MAAM,EAAE,eAAe,CAAC;QACvB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,8BAA8B;QAC3C,OAAO,EAAE,SAAS;KAClB,CAAC;IACF,MAAM,EAAE,eAAe,CAAC;QACvB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,kCAAkC;QAC/C,OAAO,EAAE,SAAS;KAClB,CAAC;IACF,EAAE,EAAE,eAAe,CAAC;QACnB,IAAI,EAAE,IAAI;QACV,WAAW,EAAE,0BAA0B;QACvC,OAAO,EAAE,KAAK;KACd,CAAC;IACF,SAAS,EAAE,eAAe,CAAC;QAC1B,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,uCAAuC;QACpD,OAAO,EAAE,SAAS;KAClB,CAAC;CACF,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,KAAa;IACzC,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,UAAU;IACzB,OAAO,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface SkillInstaller {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
getInstallPath(local: boolean): string;
|
|
5
|
+
generateContent(): string;
|
|
6
|
+
isInstalled(local: boolean): Promise<boolean>;
|
|
7
|
+
install(local: boolean, force: boolean): Promise<void>;
|
|
8
|
+
update(local: boolean): Promise<void>;
|
|
9
|
+
uninstall(local: boolean): Promise<void>;
|
|
10
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/skills/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { skillInstallers } from "./index.js";
|
|
2
|
+
export async function updateAllInstalledSkills(local) {
|
|
3
|
+
const updated = [];
|
|
4
|
+
const skipped = [];
|
|
5
|
+
const errors = [];
|
|
6
|
+
for (const [name, installer] of Object.entries(skillInstallers)) {
|
|
7
|
+
try {
|
|
8
|
+
const isInstalled = await installer.isInstalled(local);
|
|
9
|
+
if (isInstalled) {
|
|
10
|
+
await installer.update(local);
|
|
11
|
+
updated.push(name);
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
skipped.push(name);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
errors.push(name);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return { updated, skipped, errors };
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=update-installed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-installed.js","sourceRoot":"","sources":["../../../src/lib/skills/update-installed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAQ7C,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC7C,KAAc;IAEd,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;QACjE,IAAI,CAAC;YACJ,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACvD,IAAI,WAAW,EAAE,CAAC;gBACjB,MAAM,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC9B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACP,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACF,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface SpinnerOptions {
|
|
2
|
+
text: string;
|
|
3
|
+
color?: "green" | "yellow" | "blue" | "red";
|
|
4
|
+
noSpinner?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare class LoadingSpinner {
|
|
7
|
+
private spinnerInstance;
|
|
8
|
+
start(options: SpinnerOptions): this;
|
|
9
|
+
succeed(text?: string): void;
|
|
10
|
+
fail(text?: string): void;
|
|
11
|
+
stop(): void;
|
|
12
|
+
}
|
|
13
|
+
export declare function withSpinner<T>(options: SpinnerOptions, asyncOperation: () => Promise<T>): Promise<T>;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import yoctoSpinner from "yocto-spinner";
|
|
3
|
+
function shouldDisableSpinner() {
|
|
4
|
+
if (process.env.OL_SPINNER === "false")
|
|
5
|
+
return true;
|
|
6
|
+
if (process.env.CI)
|
|
7
|
+
return true;
|
|
8
|
+
const args = process.argv;
|
|
9
|
+
if (args.includes("--json") ||
|
|
10
|
+
args.includes("--ndjson") ||
|
|
11
|
+
args.includes("--no-spinner")) {
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
export class LoadingSpinner {
|
|
17
|
+
spinnerInstance = null;
|
|
18
|
+
start(options) {
|
|
19
|
+
if (!process.stdout.isTTY || options.noSpinner || shouldDisableSpinner()) {
|
|
20
|
+
return this;
|
|
21
|
+
}
|
|
22
|
+
const colorFn = chalk[options.color || "blue"];
|
|
23
|
+
this.spinnerInstance = yoctoSpinner({ text: colorFn(options.text) });
|
|
24
|
+
this.spinnerInstance.start();
|
|
25
|
+
return this;
|
|
26
|
+
}
|
|
27
|
+
succeed(text) {
|
|
28
|
+
if (this.spinnerInstance) {
|
|
29
|
+
this.spinnerInstance.success(text ? chalk.green(`✓ ${text}`) : undefined);
|
|
30
|
+
this.spinnerInstance = null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
fail(text) {
|
|
34
|
+
if (this.spinnerInstance) {
|
|
35
|
+
this.spinnerInstance.error(text ? chalk.red(`✗ ${text}`) : undefined);
|
|
36
|
+
this.spinnerInstance = null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
stop() {
|
|
40
|
+
if (this.spinnerInstance) {
|
|
41
|
+
this.spinnerInstance.stop();
|
|
42
|
+
this.spinnerInstance = null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export async function withSpinner(options, asyncOperation) {
|
|
47
|
+
const spinner = new LoadingSpinner().start(options);
|
|
48
|
+
try {
|
|
49
|
+
const result = await asyncOperation();
|
|
50
|
+
spinner.stop();
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
spinner.fail();
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/lib/spinner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,YAAY,MAAM,eAAe,CAAC;AAQzC,SAAS,oBAAoB;IAC5B,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACpD,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAEhC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,IACC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;QACzB,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAC5B,CAAC;QACF,OAAO,IAAI,CAAC;IACb,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC;AAED,MAAM,OAAO,cAAc;IAClB,eAAe,GAA2C,IAAI,CAAC;IAEvE,KAAK,CAAC,OAAuB;QAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,SAAS,IAAI,oBAAoB,EAAE,EAAE,CAAC;YAC1E,OAAO,IAAI,CAAC;QACb,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,eAAe,GAAG,YAAY,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACb,CAAC;IAED,OAAO,CAAC,IAAa;QACpB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAC1E,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC7B,CAAC;IACF,CAAC;IAED,IAAI,CAAC,IAAa;QACjB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACtE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC7B,CAAC;IACF,CAAC;IAED,IAAI;QACH,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC7B,CAAC;IACF,CAAC;CACD;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAChC,OAAuB,EACvB,cAAgC;IAEhC,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAEpD,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;QACtC,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,MAAM,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,KAAK,CAAC;IACb,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postinstall.js","sourceRoot":"","sources":["../src/postinstall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,wBAAwB,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,63 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
2
|
+
"name": "@doist/outline-cli",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "CLI for the Outline wiki/knowledge base API",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"ol": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "https://github.com/Doist/outline-cli.git"
|
|
12
|
+
},
|
|
13
|
+
"publishConfig": {
|
|
14
|
+
"access": "public",
|
|
15
|
+
"provenance": true
|
|
16
|
+
},
|
|
17
|
+
"homepage": "https://github.com/Doist/outline-cli#readme",
|
|
18
|
+
"bugs": {
|
|
19
|
+
"url": "https://github.com/Doist/outline-cli/issues"
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist",
|
|
23
|
+
"scripts",
|
|
24
|
+
"CHANGELOG.md"
|
|
25
|
+
],
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsc",
|
|
28
|
+
"dev": "tsc --watch",
|
|
29
|
+
"type-check": "tsc --noEmit",
|
|
30
|
+
"format": "biome check --write",
|
|
31
|
+
"test": "vitest run",
|
|
32
|
+
"test:watch": "vitest",
|
|
33
|
+
"postinstall": "node scripts/postinstall.js"
|
|
34
|
+
},
|
|
35
|
+
"keywords": [
|
|
36
|
+
"outline",
|
|
37
|
+
"wiki",
|
|
38
|
+
"cli"
|
|
39
|
+
],
|
|
40
|
+
"license": "MIT",
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"chalk": "5.6.2",
|
|
43
|
+
"commander": "14.0.2",
|
|
44
|
+
"marked": "15.0.12",
|
|
45
|
+
"marked-terminal": "7.3.0",
|
|
46
|
+
"open": "10.2.0",
|
|
47
|
+
"yocto-spinner": "1.0.0"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@biomejs/biome": "2.3.12",
|
|
51
|
+
"@semantic-release/changelog": "6.0.3",
|
|
52
|
+
"@semantic-release/exec": "7.1.0",
|
|
53
|
+
"@semantic-release/git": "10.0.1",
|
|
54
|
+
"@semantic-release/github": "12.0.6",
|
|
55
|
+
"@semantic-release/npm": "13.1.5",
|
|
56
|
+
"@semantic-release/release-notes-generator": "14.1.0",
|
|
57
|
+
"@types/node": "25.0.10",
|
|
58
|
+
"lefthook": "2.0.15",
|
|
59
|
+
"semantic-release": "25.0.3",
|
|
60
|
+
"typescript": "5.9.3",
|
|
61
|
+
"vitest": "4.0.18"
|
|
62
|
+
}
|
|
10
63
|
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Postinstall script that updates installed skills after package installation.
|
|
5
|
+
* Silently succeeds when dist/ hasn't been built yet (e.g., during local development).
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import("../dist/postinstall.js").catch((err) => {
|
|
9
|
+
if (err.code !== "ERR_MODULE_NOT_FOUND") {
|
|
10
|
+
console.error(err);
|
|
11
|
+
}
|
|
12
|
+
});
|