@dynamik-dev/refdocs 0.1.1 → 0.4.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 (40) hide show
  1. package/README.md +39 -28
  2. package/dist/src/add.d.ts +29 -0
  3. package/dist/src/add.d.ts.map +1 -0
  4. package/dist/src/add.js +142 -0
  5. package/dist/src/add.js.map +1 -0
  6. package/dist/src/config.d.ts +8 -0
  7. package/dist/src/config.d.ts.map +1 -1
  8. package/dist/src/config.js +73 -2
  9. package/dist/src/config.js.map +1 -1
  10. package/dist/src/github.d.ts +9 -0
  11. package/dist/src/github.d.ts.map +1 -0
  12. package/dist/src/github.js +51 -0
  13. package/dist/src/github.js.map +1 -0
  14. package/dist/src/index.js +281 -21
  15. package/dist/src/index.js.map +1 -1
  16. package/dist/src/indexer.js +1 -1
  17. package/dist/src/indexer.js.map +1 -1
  18. package/dist/src/search.d.ts +1 -0
  19. package/dist/src/search.d.ts.map +1 -1
  20. package/dist/src/search.js +5 -0
  21. package/dist/src/search.js.map +1 -1
  22. package/dist/src/types.d.ts +10 -0
  23. package/dist/src/types.d.ts.map +1 -1
  24. package/dist/tests/add.test.d.ts +2 -0
  25. package/dist/tests/add.test.d.ts.map +1 -0
  26. package/dist/tests/add.test.js +332 -0
  27. package/dist/tests/add.test.js.map +1 -0
  28. package/dist/tests/config.test.js +42 -1
  29. package/dist/tests/config.test.js.map +1 -1
  30. package/dist/tests/github.test.d.ts +2 -0
  31. package/dist/tests/github.test.d.ts.map +1 -0
  32. package/dist/tests/github.test.js +73 -0
  33. package/dist/tests/github.test.js.map +1 -0
  34. package/dist/tests/global.test.d.ts +2 -0
  35. package/dist/tests/global.test.d.ts.map +1 -0
  36. package/dist/tests/global.test.js +160 -0
  37. package/dist/tests/global.test.js.map +1 -0
  38. package/dist/tests/indexer.test.js +19 -0
  39. package/dist/tests/indexer.test.js.map +1 -1
  40. package/package.json +4 -2
package/README.md CHANGED
@@ -1,12 +1,39 @@
1
1
  # refdocs
2
2
 
3
+ ![refdoc-cli](refdoc-cli.png)
4
+
5
+ [![Tests](https://github.com/dynamik-dev/refdoc-cli/actions/workflows/test.yml/badge.svg)](https://github.com/dynamik-dev/refdoc-cli/actions/workflows/test.yml)
6
+ [![Publish to npm](https://github.com/dynamik-dev/refdoc-cli/actions/workflows/publish.yml/badge.svg)](https://github.com/dynamik-dev/refdoc-cli/actions/workflows/publish.yml)
7
+ [![npm](https://img.shields.io/npm/v/@dynamik-dev/refdocs)](https://www.npmjs.com/package/@dynamik-dev/refdocs)
8
+
3
9
  Index your markdown docs. Search them fast. Get back only what matters.
4
10
 
5
- Built for LLM coding agents that need token-conscious access to project documentation — no network calls, no API keys, no MCP servers. Just a single binary and a JSON index file.
11
+ Built for LLM coding agents that need token-conscious access to project documentation — no network calls, no API keys, no MCP servers. Just a local CLI and a JSON index file.
12
+
13
+ ## Install
6
14
 
7
15
  ```bash
8
- $ refdocs search "database connections"
16
+ npm install -g @dynamik-dev/refdocs
17
+ ```
9
18
 
19
+ ## Quick start
20
+
21
+ ```bash
22
+ # Initialize config in your project
23
+ cd your-project
24
+ refdocs init
25
+
26
+ # Add your docs (local path or GitHub URL)
27
+ refdocs add ./docs
28
+ refdocs add https://github.com/laravel/docs --branch 11.x
29
+
30
+ # Search
31
+ refdocs search "database connections"
32
+ ```
33
+
34
+ Output:
35
+
36
+ ```
10
37
  # [1] config/database.md:12-34
11
38
  # Configuration > Database > Connections
12
39
 
@@ -25,33 +52,13 @@ is running and the host/port in your config matches...
25
52
 
26
53
  refdocs chunks markdown at heading boundaries into 100-800 token pieces, indexes them with fuzzy search, and returns only the relevant chunks — not entire files.
27
54
 
28
- ## Install
29
-
30
- ```bash
31
- npm install -g @dynamik-dev/refdocs
32
- ```
33
-
34
- Or build from source:
55
+ ## Commands
35
56
 
36
57
  ```bash
37
- bun install && bun run build
38
- ```
39
-
40
- Produces a standalone `./refdocs` binary. Or run directly:
41
-
42
- ```bash
43
- bun src/index.ts <command>
44
- ```
45
-
46
- ## Usage
47
-
48
- ```bash
49
- # Point at your docs directory
50
- echo '{ "paths": ["docs"] }' > .refdocs.json
51
-
52
- # Build the index
53
- refdocs index
54
- # Indexed 42 files -> 156 chunks (45.2 KB, 320ms)
58
+ # Setup
59
+ refdocs init # create .refdocs.json with defaults
60
+ refdocs add ./docs # add a local docs directory
61
+ refdocs add https://github.com/org/repo # add docs from GitHub
55
62
 
56
63
  # Search
57
64
  refdocs search "authentication"
@@ -60,9 +67,12 @@ refdocs search "api" -f "api/**/*.md" # filter by file glob
60
67
  refdocs search "hooks" --json # structured output
61
68
  refdocs search "auth" --raw # body only, for piping
62
69
 
63
- # Inspect the index
70
+ # Manage
71
+ refdocs index # rebuild the search index
64
72
  refdocs list # files and chunk counts
65
73
  refdocs info "api/auth.md" # chunks in a specific file
74
+ refdocs update # re-pull GitHub sources
75
+ refdocs remove ref-docs/laravel # remove a path from config
66
76
  ```
67
77
 
68
78
  ## How it works
@@ -105,5 +115,6 @@ All fields optional. See [Configuration](docs/configuration.md) for details.
105
115
  | [Commander](https://github.com/tj/commander.js) | CLI framework |
106
116
  | [mdast-util-from-markdown](https://github.com/syntax-tree/mdast-util-from-markdown) | Markdown AST parsing |
107
117
  | [picomatch](https://github.com/micromatch/picomatch) | Glob pattern matching |
118
+ | [tar-stream](https://github.com/mafintosh/tar-stream) | Tarball extraction for `add` command |
108
119
 
109
120
  Zero external services. Works offline, in containers, on planes.
@@ -0,0 +1,29 @@
1
+ import type { RefdocsConfig, Source } from "./types.js";
2
+ export interface AddOptions {
3
+ path?: string;
4
+ branch?: string;
5
+ token?: string;
6
+ }
7
+ export interface AddResult {
8
+ filesWritten: number;
9
+ localPath: string;
10
+ source: Source;
11
+ }
12
+ export interface UpdateResult {
13
+ source: Source;
14
+ filesWritten: number;
15
+ }
16
+ export declare function addFromUrl(url: string, options: AddOptions, configDir: string, config: RefdocsConfig): Promise<AddResult>;
17
+ export declare function updateSources(config: RefdocsConfig, configDir: string, token?: string): Promise<UpdateResult[]>;
18
+ export interface AddLocalResult {
19
+ localPath: string;
20
+ }
21
+ export declare function addLocalPath(inputPath: string, configDir: string, config: RefdocsConfig): AddLocalResult;
22
+ export interface RemoveResult {
23
+ removed: boolean;
24
+ sourceRemoved: boolean;
25
+ }
26
+ export declare function removePath(inputPath: string, configDir: string, config: RefdocsConfig): RemoveResult;
27
+ export declare function extractMarkdownFiles(tarballBuffer: Buffer, subpath: string, outputDir: string): Promise<number>;
28
+ export declare function isPathCovered(existingPaths: string[], newPath: string): boolean;
29
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/add.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,SAAS,CAAC,CAoCpB;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,aAAa,EACrB,SAAS,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,YAAY,EAAE,CAAC,CAmBzB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,aAAa,GACpB,cAAc,CAqBhB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,UAAU,CACxB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,aAAa,GACpB,YAAY,CAkBd;AAaD,wBAAsB,oBAAoB,CACxC,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CA6CjB;AAOD,wBAAgB,aAAa,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAI/E"}
@@ -0,0 +1,142 @@
1
+ import { mkdirSync, writeFileSync, existsSync, readdirSync, statSync } from "node:fs";
2
+ import { join, dirname, resolve, relative } from "node:path";
3
+ import { Readable } from "node:stream";
4
+ import { pipeline } from "node:stream/promises";
5
+ import { createGunzip } from "node:zlib";
6
+ import tar from "tar-stream";
7
+ import { parseGitHubUrl, downloadTarball } from "./github.js";
8
+ import { saveConfig } from "./config.js";
9
+ export async function addFromUrl(url, options, configDir, config) {
10
+ const parsed = parseGitHubUrl(url);
11
+ const branch = options.branch ?? parsed.branch ?? undefined;
12
+ const token = options.token ?? process.env.GITHUB_TOKEN ?? undefined;
13
+ const defaultPath = parsed.subpath
14
+ ? `ref-docs/${parsed.owner}/${parsed.repo}/${parsed.subpath}`
15
+ : `ref-docs/${parsed.owner}/${parsed.repo}`;
16
+ const localPath = options.path ?? defaultPath;
17
+ const tarball = await downloadTarball(parsed.owner, parsed.repo, branch, token);
18
+ const filesWritten = await extractMarkdownFiles(Buffer.from(tarball), parsed.subpath, join(configDir, localPath));
19
+ const source = {
20
+ url,
21
+ owner: parsed.owner,
22
+ repo: parsed.repo,
23
+ branch: branch ?? "HEAD",
24
+ subpath: parsed.subpath,
25
+ localPath,
26
+ addedAt: new Date().toISOString(),
27
+ };
28
+ const paths = isPathCovered(config.paths, localPath)
29
+ ? config.paths
30
+ : [...config.paths, localPath];
31
+ const sources = upsertSource(config.sources ?? [], source);
32
+ saveConfig({ paths, sources }, configDir);
33
+ return { filesWritten, localPath, source };
34
+ }
35
+ export async function updateSources(config, configDir, token) {
36
+ const sources = config.sources ?? [];
37
+ if (sources.length === 0) {
38
+ throw new Error("No sources configured. Add a source first with `refdocs add <url>`.");
39
+ }
40
+ const results = [];
41
+ for (const source of sources) {
42
+ const ref = source.branch === "HEAD" ? undefined : source.branch;
43
+ const tarball = await downloadTarball(source.owner, source.repo, ref, token);
44
+ const filesWritten = await extractMarkdownFiles(Buffer.from(tarball), source.subpath, join(configDir, source.localPath));
45
+ results.push({ source, filesWritten });
46
+ }
47
+ return results;
48
+ }
49
+ export function addLocalPath(inputPath, configDir, config) {
50
+ const absolutePath = resolve(configDir, inputPath);
51
+ if (!existsSync(absolutePath) || !statSync(absolutePath).isDirectory()) {
52
+ throw new Error(`Directory not found: ${inputPath}`);
53
+ }
54
+ if (!hasMarkdownFiles(absolutePath)) {
55
+ throw new Error(`No .md files found in ${inputPath}`);
56
+ }
57
+ const localPath = relative(configDir, absolutePath);
58
+ if (config.paths.includes(localPath)) {
59
+ return { localPath };
60
+ }
61
+ const paths = [...config.paths, localPath];
62
+ saveConfig({ paths }, configDir);
63
+ return { localPath };
64
+ }
65
+ export function removePath(inputPath, configDir, config) {
66
+ const absolutePath = resolve(configDir, inputPath);
67
+ const normalizedPath = relative(configDir, absolutePath);
68
+ const pathIndex = config.paths.indexOf(normalizedPath);
69
+ if (pathIndex === -1) {
70
+ return { removed: false, sourceRemoved: false };
71
+ }
72
+ const paths = config.paths.filter((p) => p !== normalizedPath);
73
+ const sources = config.sources ?? [];
74
+ const filteredSources = sources.filter((s) => s.localPath !== normalizedPath);
75
+ const sourceRemoved = filteredSources.length < sources.length;
76
+ saveConfig({ paths, sources: filteredSources }, configDir);
77
+ return { removed: true, sourceRemoved };
78
+ }
79
+ function hasMarkdownFiles(dir) {
80
+ const entries = readdirSync(dir, { withFileTypes: true });
81
+ for (const entry of entries) {
82
+ if (entry.isFile() && entry.name.endsWith(".md"))
83
+ return true;
84
+ if (entry.isDirectory()) {
85
+ if (hasMarkdownFiles(join(dir, entry.name)))
86
+ return true;
87
+ }
88
+ }
89
+ return false;
90
+ }
91
+ export async function extractMarkdownFiles(tarballBuffer, subpath, outputDir) {
92
+ let filesWritten = 0;
93
+ const extract = tar.extract();
94
+ const processEntry = new Promise((resolve, reject) => {
95
+ extract.on("entry", (header, stream, next) => {
96
+ const chunks = [];
97
+ stream.on("data", (chunk) => chunks.push(chunk));
98
+ stream.on("end", () => {
99
+ if (header.type === "file" && header.name.endsWith(".md")) {
100
+ const relativePath = stripTarPrefix(header.name);
101
+ if (subpath && !relativePath.startsWith(subpath + "/") && relativePath !== subpath) {
102
+ next();
103
+ return;
104
+ }
105
+ const targetRelative = subpath
106
+ ? relativePath.slice(subpath.length + 1)
107
+ : relativePath;
108
+ if (!targetRelative) {
109
+ next();
110
+ return;
111
+ }
112
+ const targetPath = join(outputDir, targetRelative);
113
+ mkdirSync(dirname(targetPath), { recursive: true });
114
+ writeFileSync(targetPath, Buffer.concat(chunks));
115
+ filesWritten++;
116
+ }
117
+ next();
118
+ });
119
+ stream.on("error", reject);
120
+ });
121
+ extract.on("finish", resolve);
122
+ extract.on("error", reject);
123
+ });
124
+ const gunzip = createGunzip();
125
+ const source = Readable.from(tarballBuffer);
126
+ pipeline(source, gunzip, extract).catch(() => { });
127
+ await processEntry;
128
+ return filesWritten;
129
+ }
130
+ function stripTarPrefix(entryName) {
131
+ const parts = entryName.split("/");
132
+ return parts.slice(1).join("/");
133
+ }
134
+ export function isPathCovered(existingPaths, newPath) {
135
+ return existingPaths.some((p) => p === newPath || newPath.startsWith(p + "/"));
136
+ }
137
+ function upsertSource(sources, newSource) {
138
+ const key = `${newSource.owner}/${newSource.repo}/${newSource.subpath}`;
139
+ const filtered = sources.filter((s) => `${s.owner}/${s.repo}/${s.subpath}` !== key);
140
+ return [...filtered, newSource];
141
+ }
142
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/add.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,16 @@
1
1
  import type { RefdocsConfig } from "./types.js";
2
+ export declare const CONFIG_FILENAME = ".refdocs.json";
2
3
  export interface ConfigResult {
3
4
  config: RefdocsConfig;
4
5
  configDir: string;
5
6
  }
6
7
  export declare function loadConfig(cwd?: string): ConfigResult;
7
8
  export declare function validateConfig(raw: unknown): string[];
9
+ export declare function configExists(configDir: string): boolean;
10
+ export declare function initConfig(configDir: string): void;
11
+ export declare function saveConfig(config: Partial<RefdocsConfig>, configDir: string): void;
12
+ export declare function setGlobalDirOverride(dir: string | null): void;
13
+ export declare function getGlobalConfigDir(): string;
14
+ export declare function initGlobalConfig(): void;
15
+ export declare function loadGlobalConfig(): ConfigResult | null;
8
16
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAgBhD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,YAAY,CAyBrD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,EAAE,CA4CrD"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAU,MAAM,YAAY,CAAC;AAExD,eAAO,MAAM,eAAe,kBAAkB,CAAC;AAc/C,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,YAAY,CAyBrD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,EAAE,CAyDrD;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAMlD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAQlF;AAID,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAE7D;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAUvC;AAED,wBAAgB,gBAAgB,IAAI,YAAY,GAAG,IAAI,CAetD"}
@@ -1,6 +1,7 @@
1
- import { readFileSync, existsSync } from "node:fs";
1
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "node:fs";
2
2
  import { join, dirname, resolve } from "node:path";
3
- const CONFIG_FILENAME = ".refdocs.json";
3
+ import { homedir } from "node:os";
4
+ export const CONFIG_FILENAME = ".refdocs.json";
4
5
  const DEFAULT_CONFIG = {
5
6
  paths: ["ref-docs"],
6
7
  index: ".refdocs-index.json",
@@ -72,6 +73,76 @@ export function validateConfig(raw) {
72
73
  }
73
74
  }
74
75
  }
76
+ if (obj.sources !== undefined) {
77
+ if (!Array.isArray(obj.sources)) {
78
+ errors.push('"sources" must be an array');
79
+ }
80
+ else {
81
+ for (let i = 0; i < obj.sources.length; i++) {
82
+ const s = obj.sources[i];
83
+ if (typeof s !== "object" || s === null || Array.isArray(s)) {
84
+ errors.push(`"sources[${i}]" must be an object`);
85
+ }
86
+ }
87
+ }
88
+ }
75
89
  return errors;
76
90
  }
91
+ export function configExists(configDir) {
92
+ return existsSync(join(configDir, CONFIG_FILENAME));
93
+ }
94
+ export function initConfig(configDir) {
95
+ const configPath = join(configDir, CONFIG_FILENAME);
96
+ if (existsSync(configPath)) {
97
+ throw new Error(`${CONFIG_FILENAME} already exists in ${configDir}`);
98
+ }
99
+ writeFileSync(configPath, JSON.stringify(DEFAULT_CONFIG, null, 2) + "\n", "utf-8");
100
+ }
101
+ export function saveConfig(config, configDir) {
102
+ const configPath = join(configDir, CONFIG_FILENAME);
103
+ let existing = {};
104
+ if (existsSync(configPath)) {
105
+ existing = JSON.parse(readFileSync(configPath, "utf-8"));
106
+ }
107
+ const merged = { ...existing, ...config };
108
+ writeFileSync(configPath, JSON.stringify(merged, null, 2) + "\n", "utf-8");
109
+ }
110
+ let globalDirOverride = null;
111
+ export function setGlobalDirOverride(dir) {
112
+ globalDirOverride = dir;
113
+ }
114
+ export function getGlobalConfigDir() {
115
+ return globalDirOverride ?? join(homedir(), ".refdocs");
116
+ }
117
+ export function initGlobalConfig() {
118
+ const globalDir = getGlobalConfigDir();
119
+ mkdirSync(globalDir, { recursive: true });
120
+ const configPath = join(globalDir, CONFIG_FILENAME);
121
+ if (existsSync(configPath))
122
+ return;
123
+ const globalDefault = {
124
+ ...DEFAULT_CONFIG,
125
+ paths: ["docs"],
126
+ };
127
+ writeFileSync(configPath, JSON.stringify(globalDefault, null, 2) + "\n", "utf-8");
128
+ }
129
+ export function loadGlobalConfig() {
130
+ const globalDir = getGlobalConfigDir();
131
+ const configPath = join(globalDir, CONFIG_FILENAME);
132
+ if (!existsSync(configPath))
133
+ return null;
134
+ try {
135
+ const raw = JSON.parse(readFileSync(configPath, "utf-8"));
136
+ const errors = validateConfig(raw);
137
+ if (errors.length > 0)
138
+ return null;
139
+ return {
140
+ config: { ...DEFAULT_CONFIG, ...raw, boostFields: { ...DEFAULT_CONFIG.boostFields, ...raw.boostFields } },
141
+ configDir: globalDir,
142
+ };
143
+ }
144
+ catch {
145
+ return null;
146
+ }
147
+ }
77
148
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGlC,MAAM,CAAC,MAAM,eAAe,GAAG,eAAe,CAAC;AAE/C,MAAM,cAAc,GAAkB;IACpC,KAAK,EAAE,CAAC,UAAU,CAAC;IACnB,KAAK,EAAE,qBAAqB;IAC5B,cAAc,EAAE,GAAG;IACnB,cAAc,EAAE,GAAG;IACnB,WAAW,EAAE;QACX,KAAK,EAAE,CAAC;QACR,QAAQ,EAAE,GAAG;QACb,IAAI,EAAE,CAAC;KACR;CACF,CAAC;AAOF,MAAM,UAAU,UAAU,CAAC,GAAY;IACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/C,IAAI,GAAG,GAAG,QAAQ,CAAC;IAEnB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;QAC9C,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;YAC1D,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;YACnC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CACb,WAAW,eAAe,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACnD,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,MAAM,EAAE,EAAE,GAAG,cAAc,EAAE,GAAG,GAAG,EAAE,WAAW,EAAE,EAAE,GAAG,cAAc,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,WAAW,EAAE,EAAE;gBACzG,SAAS,EAAE,GAAG;aACf,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM;QAC1B,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAY;IACzC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAClE,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,GAAG,GAAG,GAA8B,CAAC;IAE3C,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;YAChF,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,GAAG,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACrC,IAAI,OAAO,GAAG,CAAC,cAAc,KAAK,QAAQ,IAAI,GAAG,CAAC,cAAc,IAAI,CAAC,EAAE,CAAC;YACtE,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,IAAI,GAAG,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACrC,IAAI,OAAO,GAAG,CAAC,cAAc,KAAK,QAAQ,IAAI,GAAG,CAAC,cAAc,IAAI,CAAC,EAAE,CAAC;YACtE,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,IAAI,GAAG,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QAClC,IAAI,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ,IAAI,GAAG,CAAC,WAAW,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YACtG,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QACjD,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,GAAG,GAAG,CAAC,WAAsC,CAAC;YACtD,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,CAAC;gBAChD,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,OAAO,EAAE,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE,CAAC;oBACzD,MAAM,CAAC,IAAI,CAAC,gBAAgB,GAAG,oBAAoB,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5C,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAA4B,CAAC;gBACpD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC5D,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC5C,OAAO,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,SAAiB;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IACpD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,GAAG,eAAe,sBAAsB,SAAS,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAA8B,EAAE,SAAiB;IAC1E,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IACpD,IAAI,QAAQ,GAA4B,EAAE,CAAC;IAC3C,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3D,CAAC;IACD,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1C,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AAC7E,CAAC;AAED,IAAI,iBAAiB,GAAkB,IAAI,CAAC;AAE5C,MAAM,UAAU,oBAAoB,CAAC,GAAkB;IACrD,iBAAiB,GAAG,GAAG,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,iBAAiB,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;IACvC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IACpD,IAAI,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO;IACnC,MAAM,aAAa,GAAkB;QACnC,GAAG,cAAc;QACjB,KAAK,EAAE,CAAC,MAAM,CAAC;KAChB,CAAC;IACF,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;IACvC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IACpD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QACnC,OAAO;YACL,MAAM,EAAE,EAAE,GAAG,cAAc,EAAE,GAAG,GAAG,EAAE,WAAW,EAAE,EAAE,GAAG,cAAc,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,WAAW,EAAE,EAAE;YACzG,SAAS,EAAE,SAAS;SACrB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface ParsedGitHubUrl {
2
+ owner: string;
3
+ repo: string;
4
+ branch: string | null;
5
+ subpath: string;
6
+ }
7
+ export declare function parseGitHubUrl(url: string): ParsedGitHubUrl;
8
+ export declare function downloadTarball(owner: string, repo: string, ref?: string, token?: string): Promise<ArrayBuffer>;
9
+ //# sourceMappingURL=github.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/github.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAoC3D;AAED,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,GAAG,CAAC,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,CAAC,CAuBtB"}
@@ -0,0 +1,51 @@
1
+ export function parseGitHubUrl(url) {
2
+ let cleaned = url.trim().replace(/\/+$/, "");
3
+ if (cleaned.endsWith(".git")) {
4
+ cleaned = cleaned.slice(0, -4);
5
+ }
6
+ let parsed;
7
+ try {
8
+ parsed = new URL(cleaned);
9
+ }
10
+ catch {
11
+ throw new Error(`Invalid URL: "${url}". Expected a GitHub URL like https://github.com/owner/repo`);
12
+ }
13
+ if (parsed.hostname !== "github.com") {
14
+ throw new Error(`Only GitHub URLs are supported. Got: "${parsed.hostname}"`);
15
+ }
16
+ const parts = parsed.pathname.split("/").filter(Boolean);
17
+ if (parts.length < 2) {
18
+ throw new Error(`Could not parse owner/repo from URL: "${url}"`);
19
+ }
20
+ const owner = parts[0];
21
+ const repo = parts[1];
22
+ let branch = null;
23
+ let subpath = "";
24
+ if (parts.length >= 4 && parts[2] === "tree") {
25
+ branch = parts[3];
26
+ if (parts.length > 4) {
27
+ subpath = parts.slice(4).join("/");
28
+ }
29
+ }
30
+ return { owner, repo, branch, subpath };
31
+ }
32
+ export async function downloadTarball(owner, repo, ref, token) {
33
+ const refPart = ref ? `/${ref}` : "";
34
+ const url = `https://api.github.com/repos/${owner}/${repo}/tarball${refPart}`;
35
+ const headers = {
36
+ Accept: "application/vnd.github+json",
37
+ "User-Agent": "refdocs-cli",
38
+ };
39
+ if (token) {
40
+ headers.Authorization = `Bearer ${token}`;
41
+ }
42
+ const response = await fetch(url, { headers, redirect: "follow" });
43
+ if (!response.ok) {
44
+ if (response.status === 404) {
45
+ throw new Error(`Repository not found: ${owner}/${repo}${ref ? ` (ref: ${ref})` : ""}. Check the URL and ensure the repo is public or GITHUB_TOKEN is set.`);
46
+ }
47
+ throw new Error(`GitHub API error: ${response.status} ${response.statusText}`);
48
+ }
49
+ return response.arrayBuffer();
50
+ }
51
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/github.ts"],"names":[],"mappings":"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"}