doltap-wiki 0.0.0-stage → 0.1.1
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/dist/cli.d.ts +1 -0
- package/dist/cli.js +593 -0
- package/dist/cli.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.js +5 -0
- package/dist/main.js.map +1 -0
- package/dist/mcp.d.ts +2 -0
- package/dist/mcp.js +4 -0
- package/dist/mcp.js.map +1 -0
- package/integrations/claude-code/CLAUDE.md.snippet +5 -0
- package/integrations/claude-code/README.md +36 -0
- package/integrations/claude-code/skills/doltap/SKILL.md +43 -0
- package/package.json +39 -4
- package/README.md +0 -3
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,593 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { execFileSync } from "node:child_process";
|
|
3
|
+
import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
4
|
+
import { createRequire } from "node:module";
|
|
5
|
+
import { randomBytes } from "node:crypto";
|
|
6
|
+
import { homedir } from "node:os";
|
|
7
|
+
import { join, resolve } from "node:path";
|
|
8
|
+
import { fileURLToPath } from "node:url";
|
|
9
|
+
import { CATEGORIES, CONFIDENCE, get, getTemplate, lintAll, list, listConflictFiles, loadTags, patchMeta, patchSection, protocolText, syncAll, readIndexMd, related, resolveConfig, search, upsertPage, WikiDb, writeIndexMd, audit, installSchedule, installHttpService, httpServiceStatus, uninstallHttpService, publishHostStats, scheduleStatus, uninstallSchedule, scaffoldWiki, } from "@bluekds/doltap-core";
|
|
10
|
+
const program = new Command();
|
|
11
|
+
program
|
|
12
|
+
.name("doltap")
|
|
13
|
+
.description("Doltap: shared knowledge base for AI agents")
|
|
14
|
+
.version("0.1.0")
|
|
15
|
+
.option("--root <path>", "wiki repository root (default: $DOLTAP_ROOT, nearest ancestor, or ~/.doltap)")
|
|
16
|
+
.option("--agent <name>", "client identity for commit messages (default: $DOLTAP_AGENT or cli)")
|
|
17
|
+
.option("--session <id>", "session id for commit messages")
|
|
18
|
+
.option("--no-sync", "do not pull/push (local only)")
|
|
19
|
+
.option("--json", "machine-readable output");
|
|
20
|
+
function cfgFrom() {
|
|
21
|
+
const g = program.opts();
|
|
22
|
+
const o = { root: g.root, agent: g.agent, session: g.session, noSync: !g.sync };
|
|
23
|
+
return { cfg: resolveConfig(o), json: !!g.json };
|
|
24
|
+
}
|
|
25
|
+
function out(json, data, human) {
|
|
26
|
+
if (json)
|
|
27
|
+
process.stdout.write(JSON.stringify(data, null, 2) + "\n");
|
|
28
|
+
else
|
|
29
|
+
human();
|
|
30
|
+
}
|
|
31
|
+
function syncNotes(sync) {
|
|
32
|
+
const notes = [...sync.messages];
|
|
33
|
+
if (sync.conflicts.length)
|
|
34
|
+
notes.push(`CONFLICTS saved: ${sync.conflicts.join(", ")}`);
|
|
35
|
+
return notes;
|
|
36
|
+
}
|
|
37
|
+
function printIssues(issues) {
|
|
38
|
+
for (const i of issues)
|
|
39
|
+
console.log(`${i.level === "error" ? "ERROR" : "warn "} ${i.id}: [${i.rule}] ${i.message}`);
|
|
40
|
+
}
|
|
41
|
+
function readContent(opts) {
|
|
42
|
+
if (opts.content !== undefined)
|
|
43
|
+
return opts.content;
|
|
44
|
+
if (opts.file)
|
|
45
|
+
return readFileSync(resolve(opts.file), "utf8");
|
|
46
|
+
if (opts.stdin || !process.stdin.isTTY)
|
|
47
|
+
return readFileSync(0, "utf8");
|
|
48
|
+
throw new Error("provide --content, --file, or pipe content on stdin");
|
|
49
|
+
}
|
|
50
|
+
function fail(e) {
|
|
51
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
52
|
+
if (program.opts().json)
|
|
53
|
+
process.stdout.write(JSON.stringify({ error: msg }) + "\n");
|
|
54
|
+
else
|
|
55
|
+
console.error(`error: ${msg}`);
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
// ---------------------------------------------------------------- init
|
|
59
|
+
program
|
|
60
|
+
.command("init")
|
|
61
|
+
.description("set up a wiki on this machine: clone an existing wiki repository (--repo) or create a new one (--new)")
|
|
62
|
+
.option("--repo <url>", "git URL of an existing wiki repository to clone")
|
|
63
|
+
.option("--new", "create a new wiki (protocol, templates, hubs, Obsidian config) and git init it")
|
|
64
|
+
.option("--remote <url>", "with --new: add this empty repository as origin and push")
|
|
65
|
+
.option("--dir <path>", "where to clone or create", join(homedir(), ".doltap"))
|
|
66
|
+
.action((o) => {
|
|
67
|
+
try {
|
|
68
|
+
const dir = resolve(o.dir);
|
|
69
|
+
if (o.new) {
|
|
70
|
+
const r = scaffoldWiki(dir, { remote: o.remote });
|
|
71
|
+
console.log(`created wiki at ${r.dir} (${r.files} files, 1 commit${r.pushed ? ", pushed" : ""})`);
|
|
72
|
+
for (const n of r.notes)
|
|
73
|
+
console.log(`note: ${n}`);
|
|
74
|
+
}
|
|
75
|
+
else if (!existsSync(join(dir, "wiki", "_meta", "PROTOCOL.md"))) {
|
|
76
|
+
if (!o.repo)
|
|
77
|
+
throw new Error(`no wiki at ${dir}; pass --repo <git-url> to clone one or --new to create one`);
|
|
78
|
+
mkdirSync(resolve(dir, ".."), { recursive: true });
|
|
79
|
+
console.log(`cloning ${o.repo} -> ${dir}`);
|
|
80
|
+
execFileSync("git", ["clone", "--quiet", o.repo, dir], { stdio: "inherit" });
|
|
81
|
+
}
|
|
82
|
+
else
|
|
83
|
+
console.log(`existing wiki at ${dir}`);
|
|
84
|
+
const cfg = resolveConfig({ root: dir, noSync: true });
|
|
85
|
+
const db = new WikiDb(cfg);
|
|
86
|
+
const r = db.reindex(true);
|
|
87
|
+
db.close();
|
|
88
|
+
writeIndexMd(cfg);
|
|
89
|
+
console.log(`indexed ${r.total} pages`);
|
|
90
|
+
console.log(`\nnext: export DOLTAP_ROOT=${dir} (or keep the default ~/.doltap)`);
|
|
91
|
+
}
|
|
92
|
+
catch (e) {
|
|
93
|
+
fail(e);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
// ---------------------------------------------------------------- search
|
|
97
|
+
program
|
|
98
|
+
.command("search <query...>")
|
|
99
|
+
.description("full-text search (title/summary/tags weighted above body)")
|
|
100
|
+
.option("-c, --category <cat>", `one of ${CATEGORIES.join("|")}`)
|
|
101
|
+
.option("-t, --tag <tag>")
|
|
102
|
+
.option("--confidence <level>", CONFIDENCE.join("|"))
|
|
103
|
+
.option("-n, --limit <n>", "max results", "10")
|
|
104
|
+
.option("--include-deprecated")
|
|
105
|
+
.action((q, o) => {
|
|
106
|
+
try {
|
|
107
|
+
const { cfg, json } = cfgFrom();
|
|
108
|
+
const { hits, sync } = search(cfg, q.join(" "), { ...o, limit: Number(o.limit) });
|
|
109
|
+
out(json, { hits, sync }, () => {
|
|
110
|
+
if (!hits.length)
|
|
111
|
+
console.log("no results");
|
|
112
|
+
for (const h of hits) {
|
|
113
|
+
console.log(`${h.id} [${h.confidence}] ${h.tags.join(",")}`);
|
|
114
|
+
console.log(` ${h.summary}`);
|
|
115
|
+
if (h.snippet && !h.summary.includes(h.snippet.replace(/[\[\]]/g, "")))
|
|
116
|
+
console.log(` … ${h.snippet.replace(/\n/g, " ")}`);
|
|
117
|
+
}
|
|
118
|
+
for (const n of syncNotes(sync))
|
|
119
|
+
console.error(`note: ${n}`);
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
catch (e) {
|
|
123
|
+
fail(e);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
// ---------------------------------------------------------------- get
|
|
127
|
+
program
|
|
128
|
+
.command("get <id>")
|
|
129
|
+
.description("print a page (or one section) by id, e.g. howto/deploy-pypi")
|
|
130
|
+
.option("-s, --section <heading>", "only this ## section")
|
|
131
|
+
.option("--meta", "include frontmatter in human output")
|
|
132
|
+
.action((id, o) => {
|
|
133
|
+
try {
|
|
134
|
+
const { cfg, json } = cfgFrom();
|
|
135
|
+
const { result, sync } = get(cfg, id, o.section);
|
|
136
|
+
if (!result)
|
|
137
|
+
throw new Error(`page not found: ${id}`);
|
|
138
|
+
const { page, text, backlinks } = result;
|
|
139
|
+
out(json, { id, meta: page.meta, section: o.section ?? null, text, links: page.links, backlinks, sections: page.sections.map((s) => s.heading), sync }, () => {
|
|
140
|
+
if (o.meta || !o.section) {
|
|
141
|
+
console.log(`# ${page.meta.title}`);
|
|
142
|
+
console.log(`id: ${id} | confidence: ${page.meta.confidence} | tags: ${page.meta.tags.join(", ")} | updated: ${page.meta.updated}`);
|
|
143
|
+
console.log(`summary: ${page.meta.summary}\n`);
|
|
144
|
+
}
|
|
145
|
+
console.log(text);
|
|
146
|
+
if (!o.section && backlinks.length)
|
|
147
|
+
console.log(`\nbacklinks: ${backlinks.join(", ")}`);
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
catch (e) {
|
|
151
|
+
fail(e);
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
// ---------------------------------------------------------------- list
|
|
155
|
+
program
|
|
156
|
+
.command("list")
|
|
157
|
+
.description("list pages")
|
|
158
|
+
.option("-c, --category <cat>")
|
|
159
|
+
.option("-t, --tag <tag>")
|
|
160
|
+
.option("--confidence <level>")
|
|
161
|
+
.option("--include-deprecated")
|
|
162
|
+
.action((o) => {
|
|
163
|
+
try {
|
|
164
|
+
const { cfg, json } = cfgFrom();
|
|
165
|
+
const { rows, sync } = list(cfg, o);
|
|
166
|
+
const pages = rows.filter((r) => !r.id.endsWith("/_index") && r.id !== "Home");
|
|
167
|
+
out(json, { pages, sync }, () => {
|
|
168
|
+
for (const r of pages)
|
|
169
|
+
console.log(`${r.id.padEnd(44)} [${r.confidence}] ${r.summary}`);
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
catch (e) {
|
|
173
|
+
fail(e);
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
// ---------------------------------------------------------------- index / protocol / template / tags
|
|
177
|
+
program.command("index").description("print the generated one-line-per-page index").action(() => {
|
|
178
|
+
try {
|
|
179
|
+
const { cfg } = cfgFrom();
|
|
180
|
+
writeIndexMd(cfg);
|
|
181
|
+
process.stdout.write(readIndexMd(cfg));
|
|
182
|
+
}
|
|
183
|
+
catch (e) {
|
|
184
|
+
fail(e);
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
program.command("protocol").description("print _meta/PROTOCOL.md").action(() => {
|
|
188
|
+
try {
|
|
189
|
+
process.stdout.write(protocolText(cfgFrom().cfg));
|
|
190
|
+
}
|
|
191
|
+
catch (e) {
|
|
192
|
+
fail(e);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
program.command("template <category>").description("print the page template for a category with today's date filled in").action((c) => {
|
|
196
|
+
try {
|
|
197
|
+
process.stdout.write(getTemplate(cfgFrom().cfg, c));
|
|
198
|
+
}
|
|
199
|
+
catch (e) {
|
|
200
|
+
fail(e);
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
program.command("tags").description("list allowed tags").action(() => {
|
|
204
|
+
try {
|
|
205
|
+
const { cfg, json } = cfgFrom();
|
|
206
|
+
const tags = loadTags(cfg);
|
|
207
|
+
out(json, tags, () => { for (const t of tags)
|
|
208
|
+
console.log(`${t.tag.padEnd(14)} ${t.group.padEnd(9)} ${t.description}`); });
|
|
209
|
+
}
|
|
210
|
+
catch (e) {
|
|
211
|
+
fail(e);
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
// ---------------------------------------------------------------- add
|
|
215
|
+
program
|
|
216
|
+
.command("add <id>")
|
|
217
|
+
.description("create a page (id = <category>/<slug>). Body from --file/--stdin or the template.")
|
|
218
|
+
.requiredOption("--title <text>")
|
|
219
|
+
.requiredOption("--summary <text>", "1-2 sentences, max 200 chars")
|
|
220
|
+
.option("--tags <list>", "comma-separated, must exist in _meta/tags.yaml")
|
|
221
|
+
.option("--confidence <level>", "draft|verified", "draft")
|
|
222
|
+
.option("--sources <list>", "comma-separated URLs/ids")
|
|
223
|
+
.option("-f, --file <path>", "markdown body file")
|
|
224
|
+
.option("--stdin", "read body from stdin")
|
|
225
|
+
.option("--force", "create even if similar pages exist")
|
|
226
|
+
.action((id, o) => {
|
|
227
|
+
try {
|
|
228
|
+
const { cfg, json } = cfgFrom();
|
|
229
|
+
const body = o.file || o.stdin ? readContent(o) : undefined;
|
|
230
|
+
const r = upsertPage(cfg, {
|
|
231
|
+
id, title: o.title, summary: o.summary, confidence: o.confidence, body, force: o.force,
|
|
232
|
+
tags: o.tags ? o.tags.split(",").map((s) => s.trim()).filter(Boolean) : undefined,
|
|
233
|
+
sources: o.sources ? o.sources.split(",").map((s) => s.trim()).filter(Boolean) : undefined,
|
|
234
|
+
});
|
|
235
|
+
out(json, r, () => {
|
|
236
|
+
if (r.refused) {
|
|
237
|
+
console.log(`refused: ${r.refused}`);
|
|
238
|
+
printIssues(r.issues);
|
|
239
|
+
for (const s of r.similar ?? [])
|
|
240
|
+
console.log(` similar: ${s.id} — ${s.summary}`);
|
|
241
|
+
process.exitCode = 2;
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
console.log(`${r.created ? "created" : "updated"} ${r.id} (${r.path})`);
|
|
245
|
+
printIssues(r.issues);
|
|
246
|
+
for (const n of syncNotes(r.sync))
|
|
247
|
+
console.log(`note: ${n}`);
|
|
248
|
+
});
|
|
249
|
+
if (r.refused && json)
|
|
250
|
+
process.exitCode = 2;
|
|
251
|
+
}
|
|
252
|
+
catch (e) {
|
|
253
|
+
fail(e);
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
// ---------------------------------------------------------------- patch
|
|
257
|
+
program
|
|
258
|
+
.command("patch <id>")
|
|
259
|
+
.description("replace or append one ## section of a page")
|
|
260
|
+
.requiredOption("-s, --section <heading>")
|
|
261
|
+
.option("--content <text>")
|
|
262
|
+
.option("-f, --file <path>")
|
|
263
|
+
.option("--stdin")
|
|
264
|
+
.option("--append", "append to the section instead of replacing")
|
|
265
|
+
.option("--no-touch", "do not bump the updated date (typo fixes)")
|
|
266
|
+
.action((id, o) => {
|
|
267
|
+
try {
|
|
268
|
+
const { cfg, json } = cfgFrom();
|
|
269
|
+
const r = patchSection(cfg, { id, section: o.section, content: readContent(o), mode: o.append ? "append" : "replace", touch: o.touch });
|
|
270
|
+
out(json, r, () => {
|
|
271
|
+
if (r.refused) {
|
|
272
|
+
console.log(`refused: ${r.refused}`);
|
|
273
|
+
printIssues(r.issues);
|
|
274
|
+
process.exitCode = 2;
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
console.log(`updated ${r.id} ## ${o.section}`);
|
|
278
|
+
printIssues(r.issues);
|
|
279
|
+
for (const n of syncNotes(r.sync))
|
|
280
|
+
console.log(`note: ${n}`);
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
catch (e) {
|
|
284
|
+
fail(e);
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
// ---------------------------------------------------------------- meta (promote / deprecate / retag)
|
|
288
|
+
program
|
|
289
|
+
.command("meta <id>")
|
|
290
|
+
.description("update frontmatter: --confidence, --add-source, --add-tag, --title, --summary")
|
|
291
|
+
.option("--confidence <level>", CONFIDENCE.join("|"))
|
|
292
|
+
.option("--add-source <s>", "repeatable", (v, acc) => [...acc, v], [])
|
|
293
|
+
.option("--add-tag <t>", "repeatable", (v, acc) => [...acc, v], [])
|
|
294
|
+
.option("--title <text>")
|
|
295
|
+
.option("--summary <text>")
|
|
296
|
+
.action((id, o) => {
|
|
297
|
+
try {
|
|
298
|
+
const { cfg, json } = cfgFrom();
|
|
299
|
+
const r = patchMeta(cfg, { id, confidence: o.confidence, addSources: o.addSource, addTags: o.addTag, title: o.title, summary: o.summary });
|
|
300
|
+
out(json, r, () => {
|
|
301
|
+
if (r.refused) {
|
|
302
|
+
console.log(`refused: ${r.refused}`);
|
|
303
|
+
printIssues(r.issues);
|
|
304
|
+
process.exitCode = 2;
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
console.log(`updated ${r.id} frontmatter`);
|
|
308
|
+
printIssues(r.issues);
|
|
309
|
+
for (const n of syncNotes(r.sync))
|
|
310
|
+
console.log(`note: ${n}`);
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
catch (e) {
|
|
314
|
+
fail(e);
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
// ---------------------------------------------------------------- related
|
|
318
|
+
program.command("related <id>").description("outlinks, backlinks, and pages sharing tags").action((id) => {
|
|
319
|
+
try {
|
|
320
|
+
const { cfg, json } = cfgFrom();
|
|
321
|
+
const { result } = related(cfg, id);
|
|
322
|
+
out(json, result, () => {
|
|
323
|
+
const show = (label, rows) => {
|
|
324
|
+
console.log(`${label}:`);
|
|
325
|
+
if (!rows.length)
|
|
326
|
+
console.log(" (none)");
|
|
327
|
+
for (const r of rows)
|
|
328
|
+
console.log(` ${r.id} — ${r.summary}`);
|
|
329
|
+
};
|
|
330
|
+
show("outlinks", result.outlinks);
|
|
331
|
+
show("backlinks", result.backlinks);
|
|
332
|
+
show("shared tags", result.sharedTags);
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
catch (e) {
|
|
336
|
+
fail(e);
|
|
337
|
+
}
|
|
338
|
+
});
|
|
339
|
+
// ---------------------------------------------------------------- lint
|
|
340
|
+
program.command("lint [ids...]").description("validate pages (exit 1 on errors)").action((ids) => {
|
|
341
|
+
try {
|
|
342
|
+
const { cfg, json } = cfgFrom();
|
|
343
|
+
const issues = lintAll(cfg, ids.length ? ids : undefined);
|
|
344
|
+
const errors = issues.filter((i) => i.level === "error").length;
|
|
345
|
+
out(json, { issues, errors, warnings: issues.length - errors }, () => {
|
|
346
|
+
printIssues(issues);
|
|
347
|
+
console.log(`${errors} error(s), ${issues.length - errors} warning(s)`);
|
|
348
|
+
});
|
|
349
|
+
if (errors)
|
|
350
|
+
process.exitCode = 1;
|
|
351
|
+
}
|
|
352
|
+
catch (e) {
|
|
353
|
+
fail(e);
|
|
354
|
+
}
|
|
355
|
+
});
|
|
356
|
+
// ---------------------------------------------------------------- sync / reindex
|
|
357
|
+
program.command("sync").description("pull, push pending commits, reindex, report conflict files").action(() => {
|
|
358
|
+
try {
|
|
359
|
+
const { cfg, json } = cfgFrom();
|
|
360
|
+
const report = syncAll(cfg);
|
|
361
|
+
const db = new WikiDb(cfg);
|
|
362
|
+
const r = db.reindex();
|
|
363
|
+
const published = publishHostStats(cfg, db, report);
|
|
364
|
+
db.close();
|
|
365
|
+
writeIndexMd(cfg);
|
|
366
|
+
const conflicts = listConflictFiles(cfg);
|
|
367
|
+
out(json, { ...report, reindexed: r.indexed, removed: r.removed, total: r.total, statsPublished: published, conflictFiles: conflicts }, () => {
|
|
368
|
+
console.log(`pulled: ${report.pulled} pushed: ${report.pushed} offline: ${report.offline} | pages: ${r.total} (reindexed ${r.indexed}, removed ${r.removed})${published ? " | stats published" : ""}`);
|
|
369
|
+
for (const n of syncNotes(report))
|
|
370
|
+
console.log(`note: ${n}`);
|
|
371
|
+
if (conflicts.length)
|
|
372
|
+
console.log(`conflict files needing manual merge:\n ${conflicts.join("\n ")}`);
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
catch (e) {
|
|
376
|
+
fail(e);
|
|
377
|
+
}
|
|
378
|
+
});
|
|
379
|
+
program.command("reindex").description("rebuild the local search index and _meta/index.md").option("--full").action((o) => {
|
|
380
|
+
try {
|
|
381
|
+
const { cfg, json } = cfgFrom();
|
|
382
|
+
const db = new WikiDb(cfg);
|
|
383
|
+
const r = db.reindex(!!o.full);
|
|
384
|
+
db.close();
|
|
385
|
+
const p = writeIndexMd(cfg);
|
|
386
|
+
out(json, { ...r, pages: undefined, indexMd: p }, () => console.log(`indexed ${r.indexed}/${r.total} pages, removed ${r.removed}; wrote ${p}`));
|
|
387
|
+
}
|
|
388
|
+
catch (e) {
|
|
389
|
+
fail(e);
|
|
390
|
+
}
|
|
391
|
+
});
|
|
392
|
+
// ---------------------------------------------------------------- audit
|
|
393
|
+
program
|
|
394
|
+
.command("audit")
|
|
395
|
+
.description("report unreferenced, stale, lingering-draft, orphan and deprecated-but-linked pages (uses stats from all hosts)")
|
|
396
|
+
.option("--unreferenced-days <n>", "no reads within N days", "90")
|
|
397
|
+
.option("--stale-days <n>", "updated older than N days", "90")
|
|
398
|
+
.option("--draft-days <n>", "draft created more than N days ago", "30")
|
|
399
|
+
.action((o) => {
|
|
400
|
+
try {
|
|
401
|
+
const { cfg, json } = cfgFrom();
|
|
402
|
+
const r = audit(cfg, { unreferencedDays: Number(o.unreferencedDays), staleDays: Number(o.staleDays), draftDays: Number(o.draftDays) });
|
|
403
|
+
out(json, r, () => {
|
|
404
|
+
const section = (title, rows) => {
|
|
405
|
+
console.log(`${title} (${rows.length})`);
|
|
406
|
+
for (const e of rows)
|
|
407
|
+
console.log(` ${e.id}${e.updated ? ` updated ${e.updated}` : ""}${e.reads !== undefined ? ` reads ${e.reads}` : ""}${e.lastRead ? ` last ${e.lastRead}` : ""}`);
|
|
408
|
+
};
|
|
409
|
+
console.log(`hosts reporting: ${r.hostsReporting.join(", ") || "(none)"}`);
|
|
410
|
+
section("unreferenced -> deprecate candidates", r.unreferenced);
|
|
411
|
+
section("stale -> re-verify", r.stale);
|
|
412
|
+
section("lingering drafts -> verify or deprecate", r.lingeringDrafts);
|
|
413
|
+
section("orphans -> link from a hub or page", r.orphans.map((id) => ({ id })));
|
|
414
|
+
section("deprecated but still linked", r.deprecatedStillLinked.map((d) => ({ id: `${d.id} <- ${d.linkedFrom.join(", ")}` })));
|
|
415
|
+
section("conflict files -> merge", r.conflictFiles.map((id) => ({ id })));
|
|
416
|
+
section("most read", r.mostRead);
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
catch (e) {
|
|
420
|
+
fail(e);
|
|
421
|
+
}
|
|
422
|
+
});
|
|
423
|
+
// ---------------------------------------------------------------- schedule
|
|
424
|
+
const schedule = program.command("schedule").description("periodic `doltap sync` via launchd (macOS) or crontab");
|
|
425
|
+
schedule.command("install").option("--every <minutes>", "interval", "10").action((o) => {
|
|
426
|
+
try {
|
|
427
|
+
const { cfg, json } = cfgFrom();
|
|
428
|
+
// Unix: launchd/cron run the `wiki` shim; Windows: schtasks runs node + this JS entry.
|
|
429
|
+
const bin = process.platform === "win32" ? fileURLToPath(import.meta.url) : process.argv[1];
|
|
430
|
+
const r = installSchedule(cfg, bin, Number(o.every));
|
|
431
|
+
out(json, r, () => console.log(`${r.platform}: ${r.detail}`));
|
|
432
|
+
}
|
|
433
|
+
catch (e) {
|
|
434
|
+
fail(e);
|
|
435
|
+
}
|
|
436
|
+
});
|
|
437
|
+
schedule.command("uninstall").action(() => { try {
|
|
438
|
+
const r = uninstallSchedule();
|
|
439
|
+
out(!!program.opts().json, r, () => console.log(`${r.platform}: ${r.detail}`));
|
|
440
|
+
}
|
|
441
|
+
catch (e) {
|
|
442
|
+
fail(e);
|
|
443
|
+
} });
|
|
444
|
+
schedule.command("status").action(() => { try {
|
|
445
|
+
const r = scheduleStatus();
|
|
446
|
+
out(!!program.opts().json, r, () => console.log(`${r.platform}: ${r.installed ? "installed" : "not installed"} — ${r.detail}`));
|
|
447
|
+
}
|
|
448
|
+
catch (e) {
|
|
449
|
+
fail(e);
|
|
450
|
+
} });
|
|
451
|
+
// ---------------------------------------------------------------- serve (always-on HTTP MCP)
|
|
452
|
+
const serve = program.command("serve").description("always-on HTTP MCP server for remote clients (claude.ai connectors, other machines)");
|
|
453
|
+
serve.command("install").option("--port <n>", "listen port", "8765").option("--host <h>", "bind address", "127.0.0.1").action((o) => {
|
|
454
|
+
try {
|
|
455
|
+
const { cfg, json } = cfgFrom();
|
|
456
|
+
const binDir = resolve(process.argv[1], "..");
|
|
457
|
+
const mcpBin = existsSync(join(binDir, "doltap-mcp")) ? join(binDir, "doltap-mcp") : "doltap-mcp";
|
|
458
|
+
const r = installHttpService(cfg, mcpBin, Number(o.port), o.host);
|
|
459
|
+
const token = readFileSync(join(cfg.stateDir, "http-token"), "utf8").trim();
|
|
460
|
+
out(json, { ...r, url: `http://${o.host}:${o.port}/${token}/mcp` }, () => {
|
|
461
|
+
console.log(`${r.platform}: ${r.detail}`);
|
|
462
|
+
console.log(`local MCP URL: http://${o.host}:${o.port}/${token}/mcp`);
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
catch (e) {
|
|
466
|
+
fail(e);
|
|
467
|
+
}
|
|
468
|
+
});
|
|
469
|
+
serve.command("uninstall").action(() => { try {
|
|
470
|
+
const r = uninstallHttpService();
|
|
471
|
+
out(!!program.opts().json, r, () => console.log(`${r.platform}: ${r.detail}`));
|
|
472
|
+
}
|
|
473
|
+
catch (e) {
|
|
474
|
+
fail(e);
|
|
475
|
+
} });
|
|
476
|
+
serve.command("status").action(() => { try {
|
|
477
|
+
const r = httpServiceStatus();
|
|
478
|
+
out(!!program.opts().json, r, () => console.log(`${r.platform}: ${r.detail}`));
|
|
479
|
+
}
|
|
480
|
+
catch (e) {
|
|
481
|
+
fail(e);
|
|
482
|
+
} });
|
|
483
|
+
serve.command("token").description("print the secret path token (rotate with --rotate; restart the service afterwards)").option("--rotate").action((o) => {
|
|
484
|
+
try {
|
|
485
|
+
const { cfg } = cfgFrom();
|
|
486
|
+
const p = join(cfg.stateDir, "http-token");
|
|
487
|
+
if (o.rotate || !existsSync(p))
|
|
488
|
+
writeFileSync(p, randomBytes(32).toString("hex") + "\n", { mode: 0o600 });
|
|
489
|
+
process.stdout.write(readFileSync(p, "utf8"));
|
|
490
|
+
}
|
|
491
|
+
catch (e) {
|
|
492
|
+
fail(e);
|
|
493
|
+
}
|
|
494
|
+
});
|
|
495
|
+
// ---------------------------------------------------------------- integrations (agent clients)
|
|
496
|
+
const INTEGRATIONS_DIR = fileURLToPath(new URL("../integrations/", import.meta.url));
|
|
497
|
+
/** Command that starts the stdio MCP server: the `doltap-mcp` shim next to this binary, or node + the JS entry on Windows. */
|
|
498
|
+
function stdioMcpCommand() {
|
|
499
|
+
const binDir = resolve(process.argv[1], "..");
|
|
500
|
+
if (process.platform !== "win32")
|
|
501
|
+
return [existsSync(join(binDir, "doltap-mcp")) ? join(binDir, "doltap-mcp") : "doltap-mcp"];
|
|
502
|
+
try {
|
|
503
|
+
return ["node", createRequire(import.meta.url).resolve("@bluekds/doltap-mcp/dist/main.js")];
|
|
504
|
+
}
|
|
505
|
+
catch {
|
|
506
|
+
return ["doltap-mcp"];
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
function claudeCli(args, allowFail = false) {
|
|
510
|
+
try {
|
|
511
|
+
return execFileSync("claude", args, { encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] }).trim();
|
|
512
|
+
}
|
|
513
|
+
catch (e) {
|
|
514
|
+
if (allowFail)
|
|
515
|
+
return null;
|
|
516
|
+
throw e;
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
const integrations = program.command("integrations").description("install the skill, global instruction and MCP registration for an agent client");
|
|
520
|
+
integrations
|
|
521
|
+
.command("install <client>")
|
|
522
|
+
.description("supported clients: claude (Claude Code, user scope: every project on this machine)")
|
|
523
|
+
.option("--remote <url>", "register the always-on HTTPS endpoint instead of the local stdio server")
|
|
524
|
+
.option("--dry-run", "print what would change without writing anything")
|
|
525
|
+
.action((client, o) => {
|
|
526
|
+
try {
|
|
527
|
+
if (client !== "claude")
|
|
528
|
+
throw new Error(`unsupported client: ${client} (supported: claude)`);
|
|
529
|
+
const json = !!program.opts().json;
|
|
530
|
+
const src = join(INTEGRATIONS_DIR, "claude-code");
|
|
531
|
+
const skillDir = join(homedir(), ".claude", "skills", "doltap");
|
|
532
|
+
const claudeMd = join(homedir(), ".claude", "CLAUDE.md");
|
|
533
|
+
const actions = [];
|
|
534
|
+
const root = o.remote ? null : cfgFrom().cfg.root;
|
|
535
|
+
actions.push(root ? `wiki root: ${root} (nearest wiki above the current directory, $DOLTAP_ROOT, or ~/.doltap; pass --root to override)` : `remote endpoint (no local clone)`);
|
|
536
|
+
actions.push(`write ${join(skillDir, "SKILL.md")}`);
|
|
537
|
+
if (!o.dryRun) {
|
|
538
|
+
mkdirSync(skillDir, { recursive: true });
|
|
539
|
+
writeFileSync(join(skillDir, "SKILL.md"), readFileSync(join(src, "skills", "doltap", "SKILL.md")));
|
|
540
|
+
}
|
|
541
|
+
const snippet = readFileSync(join(src, "CLAUDE.md.snippet"), "utf8");
|
|
542
|
+
const existing = existsSync(claudeMd) ? readFileSync(claudeMd, "utf8") : "";
|
|
543
|
+
if (existing.includes("## Doltap"))
|
|
544
|
+
actions.push(`keep ${claudeMd} (already has a Doltap section)`);
|
|
545
|
+
else {
|
|
546
|
+
actions.push(`${existing ? "append Doltap section to" : "create"} ${claudeMd}`);
|
|
547
|
+
if (!o.dryRun) {
|
|
548
|
+
mkdirSync(join(homedir(), ".claude"), { recursive: true });
|
|
549
|
+
writeFileSync(claudeMd, existing ? `${existing.trimEnd()}\n\n${snippet.replace(/^# Global instructions\n\n/, "")}` : snippet);
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
const addArgs = o.remote
|
|
553
|
+
? ["mcp", "add", "-s", "user", "--transport", "http", "doltap", o.remote]
|
|
554
|
+
: ["mcp", "add", "-s", "user", "doltap", "-e", `DOLTAP_ROOT=${root}`, "-e", "DOLTAP_AGENT=claude-code", "--", ...stdioMcpCommand()];
|
|
555
|
+
const shown = `claude ${addArgs.map((a) => (/\s/.test(a) ? JSON.stringify(a) : a)).join(" ")}`;
|
|
556
|
+
if (o.dryRun)
|
|
557
|
+
actions.push("run: claude mcp remove -s user doltap (replaces an existing registration, if any)", `run: ${shown}`);
|
|
558
|
+
else if (claudeCli(["--version"], true) === null)
|
|
559
|
+
actions.push(`claude CLI not found on PATH; run manually: ${shown}`);
|
|
560
|
+
else {
|
|
561
|
+
claudeCli(["mcp", "remove", "-s", "user", "doltap"], true);
|
|
562
|
+
claudeCli(addArgs);
|
|
563
|
+
actions.push(`registered MCP server doltap (${o.remote ? "http" : "stdio"}, user scope)`);
|
|
564
|
+
}
|
|
565
|
+
out(json, { client, dryRun: !!o.dryRun, actions }, () => {
|
|
566
|
+
for (const a of actions)
|
|
567
|
+
console.log(a.startsWith("wiki root:") || a.startsWith("remote endpoint") ? a : `${o.dryRun ? "would " : ""}${a}`);
|
|
568
|
+
if (!o.dryRun)
|
|
569
|
+
console.log("done: new Claude Code sessions will see the doltap server and skill");
|
|
570
|
+
});
|
|
571
|
+
}
|
|
572
|
+
catch (e) {
|
|
573
|
+
fail(e);
|
|
574
|
+
}
|
|
575
|
+
});
|
|
576
|
+
integrations
|
|
577
|
+
.command("uninstall <client>")
|
|
578
|
+
.description("remove the skill and the MCP registration (the CLAUDE.md section is left for you to delete)")
|
|
579
|
+
.action((client) => {
|
|
580
|
+
try {
|
|
581
|
+
if (client !== "claude")
|
|
582
|
+
throw new Error(`unsupported client: ${client} (supported: claude)`);
|
|
583
|
+
const skillDir = join(homedir(), ".claude", "skills", "doltap");
|
|
584
|
+
rmSync(skillDir, { recursive: true, force: true });
|
|
585
|
+
const removed = claudeCli(["mcp", "remove", "-s", "user", "doltap"], true) !== null;
|
|
586
|
+
console.log(`removed ${skillDir}; MCP registration ${removed ? "removed" : "not found or claude CLI missing"}; edit ${join(homedir(), ".claude", "CLAUDE.md")} by hand`);
|
|
587
|
+
}
|
|
588
|
+
catch (e) {
|
|
589
|
+
fail(e);
|
|
590
|
+
}
|
|
591
|
+
});
|
|
592
|
+
program.parseAsync(process.argv).catch(fail);
|
|
593
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/main.d.ts
ADDED
package/dist/main.js
ADDED
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AACA,2GAA2G;AAC3G,OAAO,4BAA4B,CAAC;AACpC,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC"}
|
package/dist/mcp.d.ts
ADDED
package/dist/mcp.js
ADDED
package/dist/mcp.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":";AACA,uEAAuE;AACvE,OAAO,kCAAkC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# Global instructions
|
|
2
|
+
|
|
3
|
+
## Doltap Wiki
|
|
4
|
+
|
|
5
|
+
A shared wiki (Doltap Wiki) is available through the `doltap` MCP server (tools `wiki_search`, `wiki_get`, `wiki_upsert`, `wiki_patch_section`, …) and the `doltap` CLI. Before repetitive or cross-project work (deploy, build, release, auth, retry, config, library version questions), run `wiki_search` first. After solving a problem for the second time or finding an undocumented pitfall, record it with `wiki_upsert` or `wiki_patch_section`. The `doltap` skill has the full procedure.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Claude Code integration
|
|
2
|
+
|
|
3
|
+
After `doltap init` on a machine (see `howto/setup-wiki-on-new-machine` in the wiki), one command installs everything at user scope:
|
|
4
|
+
|
|
5
|
+
```sh
|
|
6
|
+
doltap integrations install claude # local stdio server (needs the clone)
|
|
7
|
+
doltap integrations install claude --remote <URL> # always-on HTTPS endpoint, no clone needed
|
|
8
|
+
doltap integrations install claude --dry-run # show the changes first
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
It writes the skill to `~/.claude/skills/doltap/SKILL.md`, appends the `## Doltap` section of `CLAUDE.md.snippet` to `~/.claude/CLAUDE.md` (once), and runs `claude mcp add -s user doltap …`. `doltap integrations uninstall claude` reverses the first and last.
|
|
12
|
+
|
|
13
|
+
Verify inside a new Claude Code session: `/mcp` shows `doltap` connected; ask "search the wiki for obsidian".
|
|
14
|
+
|
|
15
|
+
## Manual equivalent
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
claude mcp add -s user doltap -e DOLTAP_ROOT="$HOME/.doltap" -e DOLTAP_AGENT=claude-code -- "$(which doltap-mcp)"
|
|
19
|
+
mkdir -p ~/.claude/skills/doltap && cp skills/doltap/SKILL.md ~/.claude/skills/doltap/
|
|
20
|
+
cat CLAUDE.md.snippet >> ~/.claude/CLAUDE.md
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Other MCP clients: run `doltap-mcp` over stdio with the same two environment variables. The resource `wiki://protocol` carries the full rules, so a client without skills still gets them.
|
|
24
|
+
|
|
25
|
+
## Windows (PowerShell)
|
|
26
|
+
|
|
27
|
+
Requires Node >= 22.13 and Git for Windows on `PATH`.
|
|
28
|
+
|
|
29
|
+
```powershell
|
|
30
|
+
npm install -g doltap-wiki
|
|
31
|
+
doltap init --repo git@github.com:<org>/<wiki-repo>.git # clones to $HOME\.doltap
|
|
32
|
+
doltap integrations install claude # registers node + the MCP JS entry (the .cmd shim is not launched reliably)
|
|
33
|
+
doltap schedule install # Task Scheduler, every 10 minutes
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Line endings: `.gitattributes` forces LF for every text file, so leave `core.autocrlf` at its default; the parser also tolerates CRLF.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: doltap
|
|
3
|
+
description: Use the shared wiki (Doltap Wiki; MCP tools wiki_search, wiki_get, wiki_upsert, wiki_patch_section, or the `doltap` CLI) to look up and record cross-project knowledge. Use before deploy/build/release/auth/retry/config work, when you need version-specific facts, when you wonder why something is done a certain way, and after solving a problem for the second time or finding an undocumented pitfall.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Doltap
|
|
7
|
+
|
|
8
|
+
A knowledge base shared by every agent on every machine. Pages are Markdown under five categories: howto, patterns, reference, decisions, projects. The full rules are in the MCP resource `wiki://protocol` (or `doltap protocol` on the CLI); this skill is the short version.
|
|
9
|
+
|
|
10
|
+
## Read before you work
|
|
11
|
+
|
|
12
|
+
1. At the start of a task that is repetitive (deploy, build, release, environment setup) or cross-project (auth, retry, caching, logging, CLI scaffolding), call `wiki_search` with 2–4 keywords. Also search when you need a library's version-specific behavior or limits, or when you wonder "why is it done this way".
|
|
13
|
+
2. Read the `summary` and `confidence` of each hit. Open a page with `wiki_get`; pass `section` (e.g. `Pitfalls`, `Steps`, `Solution`) when you only need part of it.
|
|
14
|
+
3. Treat `confidence` as instructions: `verified` = follow it; `draft` = use as a hint and verify; `deprecated` = do not follow, use the replacement linked at the top.
|
|
15
|
+
4. Use `wiki_related` to move from one hit to adjacent pages when the first page is close but not exact.
|
|
16
|
+
|
|
17
|
+
If a `draft` page turned out to be correct, promote it: `wiki_set_meta` with `confidence: verified` and an `add_sources` entry saying what confirmed it.
|
|
18
|
+
|
|
19
|
+
## Write when it will save the next agent time
|
|
20
|
+
|
|
21
|
+
Write a page when any of these happened:
|
|
22
|
+
|
|
23
|
+
- You solved the same problem a second time
|
|
24
|
+
- You hit a pitfall that is missing from or contradicts official docs
|
|
25
|
+
- You wrote a procedure or code that applies to more than one project
|
|
26
|
+
- You made a technology choice whose rationale is not visible in the code
|
|
27
|
+
- An existing page is wrong or outdated
|
|
28
|
+
|
|
29
|
+
Do not write session logs, one-off debugging, anything obvious from code or docs, project-only source layout, or secret values (record where a secret lives and how to load it instead; internal hosts and URLs are fine).
|
|
30
|
+
|
|
31
|
+
Procedure:
|
|
32
|
+
|
|
33
|
+
1. Pick the category by the question the page answers: how do I do X → `howto`; how do I implement X → `patterns`; what is X → `reference`; why X instead of Y → `decisions`; one project's context → `projects/<name>`.
|
|
34
|
+
2. Prefer editing: if `wiki_search` finds the topic, use `wiki_patch_section` (mode `append` for a new pitfall, `replace` to correct a section). Only create when nothing fits.
|
|
35
|
+
3. To create: `wiki_template` for the category, fill every section (write `N/A` if one does not apply), then `wiki_upsert` with a `summary` under 200 characters that lets a reader decide without opening the page, 1–3 `tags` from `wiki://tags`, and `[[id]]` links to related pages. Default `confidence` is `draft`.
|
|
36
|
+
4. If `wiki_upsert` is refused with `similar`, edit the listed page instead, or pass `force: true` only when the topic is genuinely different.
|
|
37
|
+
5. If the result reports `conflicts`, tell the user: a `*.conflict-<host>.md` file needs a manual merge.
|
|
38
|
+
|
|
39
|
+
All content is English. Writes are linted, committed, and pushed automatically.
|
|
40
|
+
|
|
41
|
+
## CLI fallback
|
|
42
|
+
|
|
43
|
+
When MCP tools are not available, the same operations exist as a CLI: `doltap search <q>`, `doltap get <id> [-s Section]`, `doltap template <cat>`, `doltap add <id> --title .. --summary .. --tags a,b --stdin`, `doltap patch <id> -s Section --content ..`, `doltap meta <id> --confidence verified`. Add `--json` for structured output. Set `DOLTAP_AGENT=claude-code` so commits record the client.
|
package/package.json
CHANGED
|
@@ -1,6 +1,41 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "doltap-wiki",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"bin": {
|
|
6
|
+
"doltap": "dist/main.js",
|
|
7
|
+
"doltap-mcp": "dist/mcp.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"integrations"
|
|
12
|
+
],
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@bluekds/doltap-core": "0.1.1",
|
|
15
|
+
"commander": "^13.0.0",
|
|
16
|
+
"@bluekds/doltap-mcp": "0.1.1"
|
|
17
|
+
},
|
|
18
|
+
"description": "Doltap Wiki: a Markdown+git knowledge base shared by AI agents across machines (CLI, MCP server, Obsidian vault)",
|
|
19
|
+
"keywords": [
|
|
20
|
+
"wiki",
|
|
21
|
+
"knowledge-base",
|
|
22
|
+
"mcp",
|
|
23
|
+
"ai-agents",
|
|
24
|
+
"claude-code",
|
|
25
|
+
"obsidian",
|
|
26
|
+
"markdown",
|
|
27
|
+
"git"
|
|
28
|
+
],
|
|
29
|
+
"license": "MIT",
|
|
30
|
+
"repository": {
|
|
31
|
+
"type": "git",
|
|
32
|
+
"url": "git+https://github.com/bluekds/doltap-wiki.git"
|
|
33
|
+
},
|
|
34
|
+
"homepage": "https://github.com/bluekds/doltap-wiki#readme",
|
|
35
|
+
"engines": {
|
|
36
|
+
"node": ">=22.13"
|
|
37
|
+
},
|
|
38
|
+
"publishConfig": {
|
|
39
|
+
"access": "public"
|
|
40
|
+
}
|
|
41
|
+
}
|
package/README.md
DELETED