@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.
Files changed (67) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +130 -29
  3. package/dist/commands/auth.d.ts +2 -0
  4. package/dist/commands/auth.js +179 -0
  5. package/dist/commands/auth.js.map +1 -0
  6. package/dist/commands/collection.d.ts +2 -0
  7. package/dist/commands/collection.js +120 -0
  8. package/dist/commands/collection.js.map +1 -0
  9. package/dist/commands/document.d.ts +2 -0
  10. package/dist/commands/document.js +209 -0
  11. package/dist/commands/document.js.map +1 -0
  12. package/dist/commands/search.d.ts +2 -0
  13. package/dist/commands/search.js +42 -0
  14. package/dist/commands/search.js.map +1 -0
  15. package/dist/commands/skill.d.ts +2 -0
  16. package/dist/commands/skill.js +82 -0
  17. package/dist/commands/skill.js.map +1 -0
  18. package/dist/index.d.ts +2 -0
  19. package/dist/index.js +27 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/lib/api.d.ts +14 -0
  22. package/dist/lib/api.js +62 -0
  23. package/dist/lib/api.js.map +1 -0
  24. package/dist/lib/auth.d.ts +6 -0
  25. package/dist/lib/auth.js +70 -0
  26. package/dist/lib/auth.js.map +1 -0
  27. package/dist/lib/markdown.d.ts +1 -0
  28. package/dist/lib/markdown.js +7 -0
  29. package/dist/lib/markdown.js.map +1 -0
  30. package/dist/lib/oauth-server.d.ts +14 -0
  31. package/dist/lib/oauth-server.js +203 -0
  32. package/dist/lib/oauth-server.js.map +1 -0
  33. package/dist/lib/oauth.d.ts +17 -0
  34. package/dist/lib/oauth.js +38 -0
  35. package/dist/lib/oauth.js.map +1 -0
  36. package/dist/lib/output.d.ts +11 -0
  37. package/dist/lib/output.js +60 -0
  38. package/dist/lib/output.js.map +1 -0
  39. package/dist/lib/pkce.d.ts +3 -0
  40. package/dist/lib/pkce.js +20 -0
  41. package/dist/lib/pkce.js.map +1 -0
  42. package/dist/lib/refs.d.ts +33 -0
  43. package/dist/lib/refs.js +180 -0
  44. package/dist/lib/refs.js.map +1 -0
  45. package/dist/lib/skills/content.d.ts +3 -0
  46. package/dist/lib/skills/content.js +100 -0
  47. package/dist/lib/skills/content.js.map +1 -0
  48. package/dist/lib/skills/create-installer.d.ts +8 -0
  49. package/dist/lib/skills/create-installer.js +77 -0
  50. package/dist/lib/skills/create-installer.js.map +1 -0
  51. package/dist/lib/skills/index.d.ts +5 -0
  52. package/dist/lib/skills/index.js +40 -0
  53. package/dist/lib/skills/index.js.map +1 -0
  54. package/dist/lib/skills/types.d.ts +10 -0
  55. package/dist/lib/skills/types.js +2 -0
  56. package/dist/lib/skills/types.js.map +1 -0
  57. package/dist/lib/skills/update-installed.d.ts +6 -0
  58. package/dist/lib/skills/update-installed.js +23 -0
  59. package/dist/lib/skills/update-installed.js.map +1 -0
  60. package/dist/lib/spinner.d.ts +13 -0
  61. package/dist/lib/spinner.js +58 -0
  62. package/dist/lib/spinner.js.map +1 -0
  63. package/dist/postinstall.d.ts +1 -0
  64. package/dist/postinstall.js +3 -0
  65. package/dist/postinstall.js.map +1 -0
  66. package/package.json +61 -8
  67. 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,8 @@
1
+ import type { SkillInstaller } from "./types.js";
2
+ interface InstallerConfig {
3
+ name: string;
4
+ description: string;
5
+ dirName: string;
6
+ }
7
+ export declare function createInstaller(config: InstallerConfig): SkillInstaller;
8
+ export {};
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/skills/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ export interface UpdateAllResult {
2
+ updated: string[];
3
+ skipped: string[];
4
+ errors: string[];
5
+ }
6
+ export declare function updateAllInstalledSkills(local: boolean): Promise<UpdateAllResult>;
@@ -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,3 @@
1
+ import { updateAllInstalledSkills } from "./lib/skills/update-installed.js";
2
+ updateAllInstalledSkills(false).catch(() => { });
3
+ //# sourceMappingURL=postinstall.js.map
@@ -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
- "name": "@doist/outline-cli",
3
- "version": "0.0.1",
4
- "description": "OIDC trusted publishing setup package for @doist/outline-cli",
5
- "keywords": [
6
- "oidc",
7
- "trusted-publishing",
8
- "setup"
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
+ });