@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.
- package/README.md +39 -28
- package/dist/src/add.d.ts +29 -0
- package/dist/src/add.d.ts.map +1 -0
- package/dist/src/add.js +142 -0
- package/dist/src/add.js.map +1 -0
- package/dist/src/config.d.ts +8 -0
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +73 -2
- package/dist/src/config.js.map +1 -1
- package/dist/src/github.d.ts +9 -0
- package/dist/src/github.d.ts.map +1 -0
- package/dist/src/github.js +51 -0
- package/dist/src/github.js.map +1 -0
- package/dist/src/index.js +281 -21
- package/dist/src/index.js.map +1 -1
- package/dist/src/indexer.js +1 -1
- package/dist/src/indexer.js.map +1 -1
- package/dist/src/search.d.ts +1 -0
- package/dist/src/search.d.ts.map +1 -1
- package/dist/src/search.js +5 -0
- package/dist/src/search.js.map +1 -1
- package/dist/src/types.d.ts +10 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/tests/add.test.d.ts +2 -0
- package/dist/tests/add.test.d.ts.map +1 -0
- package/dist/tests/add.test.js +332 -0
- package/dist/tests/add.test.js.map +1 -0
- package/dist/tests/config.test.js +42 -1
- package/dist/tests/config.test.js.map +1 -1
- package/dist/tests/github.test.d.ts +2 -0
- package/dist/tests/github.test.d.ts.map +1 -0
- package/dist/tests/github.test.js +73 -0
- package/dist/tests/github.test.js.map +1 -0
- package/dist/tests/global.test.d.ts +2 -0
- package/dist/tests/global.test.d.ts.map +1 -0
- package/dist/tests/global.test.js +160 -0
- package/dist/tests/global.test.js.map +1 -0
- package/dist/tests/indexer.test.js +19 -0
- package/dist/tests/indexer.test.js.map +1 -1
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -1,12 +1,39 @@
|
|
|
1
1
|
# refdocs
|
|
2
2
|
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
[](https://github.com/dynamik-dev/refdoc-cli/actions/workflows/test.yml)
|
|
6
|
+
[](https://github.com/dynamik-dev/refdoc-cli/actions/workflows/publish.yml)
|
|
7
|
+
[](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
|
|
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
|
-
|
|
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
|
-
##
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
#
|
|
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"}
|
package/dist/src/add.js
ADDED
|
@@ -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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"}
|
package/dist/src/config.d.ts
CHANGED
|
@@ -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
|
package/dist/src/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/src/config.js
CHANGED
|
@@ -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
|
-
|
|
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
|
package/dist/src/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -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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"}
|