@qiqiangvae/dsh-obsidian 0.1.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 (45) hide show
  1. package/ATTRIBUTION.md +36 -0
  2. package/LICENSE +21 -0
  3. package/README.md +102 -0
  4. package/cordis.patch.yml +23 -0
  5. package/index.js +5 -0
  6. package/lib/index.d.ts +64 -0
  7. package/lib/index.d.ts.map +1 -0
  8. package/lib/index.js +351 -0
  9. package/lib/index.js.map +1 -0
  10. package/lib/lint.d.ts +25 -0
  11. package/lib/lint.d.ts.map +1 -0
  12. package/lib/lint.js +145 -0
  13. package/lib/lint.js.map +1 -0
  14. package/lib/scaffold.d.ts +26 -0
  15. package/lib/scaffold.d.ts.map +1 -0
  16. package/lib/scaffold.js +67 -0
  17. package/lib/scaffold.js.map +1 -0
  18. package/lib/search.d.ts +41 -0
  19. package/lib/search.d.ts.map +1 -0
  20. package/lib/search.js +127 -0
  21. package/lib/search.js.map +1 -0
  22. package/lib/skills.d.ts +18 -0
  23. package/lib/skills.d.ts.map +1 -0
  24. package/lib/skills.js +83 -0
  25. package/lib/skills.js.map +1 -0
  26. package/lib/types.d.ts +55 -0
  27. package/lib/types.d.ts.map +1 -0
  28. package/lib/types.js +6 -0
  29. package/lib/types.js.map +1 -0
  30. package/lib/vault.d.ts +69 -0
  31. package/lib/vault.d.ts.map +1 -0
  32. package/lib/vault.js +315 -0
  33. package/lib/vault.js.map +1 -0
  34. package/package.json +66 -0
  35. package/skills/defuddle/SKILL.md +35 -0
  36. package/skills/json-canvas/SKILL.md +61 -0
  37. package/skills/obsidian-bases/SKILL.md +51 -0
  38. package/skills/obsidian-cli/SKILL.md +41 -0
  39. package/skills/obsidian-markdown/SKILL.md +59 -0
  40. package/skills/save/SKILL.md +33 -0
  41. package/skills/think/SKILL.md +27 -0
  42. package/skills/wiki/SKILL.md +45 -0
  43. package/skills/wiki-ingest/SKILL.md +40 -0
  44. package/skills/wiki-lint/SKILL.md +36 -0
  45. package/skills/wiki-query/SKILL.md +34 -0
package/lib/lint.d.ts ADDED
@@ -0,0 +1,25 @@
1
+ /**
2
+ * lint.ts — vault health check.
3
+ *
4
+ * Re-implementation of dsh-plugin-wiki-tools' lint contract. Report only by
5
+ * default; suggestions are emitted but no auto-fix is performed unless the
6
+ * caller passes `{ fix: true }`.
7
+ */
8
+ import { type PluginConfig } from './vault.js';
9
+ export interface LintIssue {
10
+ severity: 'error' | 'warn' | 'info';
11
+ category: string;
12
+ file: string;
13
+ message: string;
14
+ suggestion?: string;
15
+ }
16
+ export interface LintReport {
17
+ generatedAt: string;
18
+ totals: Record<LintIssue['severity'], number>;
19
+ issues: LintIssue[];
20
+ }
21
+ export declare function lint(vaultPath: string, config: PluginConfig, opts?: {
22
+ fix?: boolean;
23
+ }): LintReport;
24
+ export declare function writeLintReport(vaultPath: string, config: PluginConfig, report: LintReport): string;
25
+ //# sourceMappingURL=lint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../src/lint.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAA4D,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAKzG,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AAED,wBAAgB,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,UAAU,CAiHtG;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAoBnG"}
package/lib/lint.js ADDED
@@ -0,0 +1,145 @@
1
+ /**
2
+ * lint.ts — vault health check.
3
+ *
4
+ * Re-implementation of dsh-plugin-wiki-tools' lint contract. Report only by
5
+ * default; suggestions are emitted but no auto-fix is performed unless the
6
+ * caller passes `{ fix: true }`.
7
+ */
8
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, statSync } from 'node:fs';
9
+ import { basename, extname, join } from 'node:path';
10
+ import { walkMd, isMachineryPage, parseFrontmatter, resolveLayout } from './vault.js';
11
+ const LINK_RE = /\[\[([^\]|]+)(?:\|[^\]]+)?\]\]/g;
12
+ const H2_RE = /^##\s+(.+)$/;
13
+ export function lint(vaultPath, config, opts = {}) {
14
+ const layout = resolveLayout(vaultPath, config);
15
+ const issues = [];
16
+ const titles = new Set();
17
+ const filenameCount = new Map();
18
+ const fileByTitle = new Map();
19
+ for (const p of walkMd(layout.wikiDir)) {
20
+ const title = basename(p, extname(p));
21
+ if (isMachineryPage(title))
22
+ continue;
23
+ titles.add(title);
24
+ filenameCount.set(title, (filenameCount.get(title) ?? 0) + 1);
25
+ if (!fileByTitle.has(title))
26
+ fileByTitle.set(title, p);
27
+ }
28
+ // duplicates
29
+ for (const [title, n] of filenameCount) {
30
+ if (n > 1) {
31
+ issues.push({
32
+ severity: 'error',
33
+ category: 'duplicate-filename',
34
+ file: title,
35
+ message: `filename "${title}" used ${n} times`,
36
+ suggestion: 'merge or rename the duplicates',
37
+ });
38
+ }
39
+ }
40
+ // per-file checks
41
+ for (const p of walkMd(layout.wikiDir)) {
42
+ const title = basename(p, extname(p));
43
+ if (isMachineryPage(title))
44
+ continue;
45
+ const raw = readFileSync(p, 'utf8');
46
+ const { fm, body } = parseFrontmatter(raw);
47
+ // frontmatter gaps
48
+ if (!fm.type) {
49
+ issues.push({ severity: 'warn', category: 'frontmatter', file: p, message: 'missing `type`', suggestion: 'add `type: resource` (or domain/area/project/source)' });
50
+ }
51
+ if (!fm.created) {
52
+ issues.push({ severity: 'info', category: 'frontmatter', file: p, message: 'missing `created`', suggestion: 'add `created: YYYY-MM-DD`' });
53
+ }
54
+ // dead links
55
+ for (const m of body.matchAll(LINK_RE)) {
56
+ const target = m[1].trim();
57
+ if (!titles.has(target)) {
58
+ issues.push({ severity: 'warn', category: 'dead-link', file: p, message: `unresolved [[${target}]]`, suggestion: `create "${target}" or fix the link` });
59
+ }
60
+ }
61
+ // empty sections
62
+ for (const m of body.matchAll(/\n## ([^\n]+)\n+(?=\n|## )/g)) {
63
+ issues.push({ severity: 'info', category: 'empty-section', file: p, message: `section "${m[1]}" is empty`, suggestion: 'add content or remove the heading' });
64
+ }
65
+ }
66
+ // orphan pages: no inbound [[wikilink]] from any *content* page.
67
+ // The master index.md, hot.md, log.md, and Lint Report files are machinery
68
+ // — entries there do not count as real inbound links.
69
+ const MACHINERY = new Set(['index', 'hot', 'log']);
70
+ const inbound = new Map();
71
+ for (const p of walkMd(layout.wikiDir)) {
72
+ const srcTitle = basename(p, extname(p));
73
+ if (isMachineryPage(srcTitle) || MACHINERY.has(srcTitle))
74
+ continue;
75
+ const { body } = parseFrontmatter(readFileSync(p, 'utf8'));
76
+ for (const m of body.matchAll(LINK_RE)) {
77
+ const t = m[1].trim();
78
+ inbound.set(t, (inbound.get(t) ?? 0) + 1);
79
+ }
80
+ }
81
+ for (const title of titles) {
82
+ if (MACHINERY.has(title) || isMachineryPage(title))
83
+ continue;
84
+ if (!inbound.has(title)) {
85
+ issues.push({ severity: 'info', category: 'orphan', file: fileByTitle.get(title), message: `"${title}" has no inbound links`, suggestion: 'link it from a related page or remove' });
86
+ }
87
+ }
88
+ // stale index
89
+ if (existsSync(layout.indexFile)) {
90
+ const idxBody = readFileSync(layout.indexFile, 'utf8');
91
+ for (const title of titles) {
92
+ if (isMachineryPage(title))
93
+ continue;
94
+ if (!idxBody.includes(`[[${title}]]`)) {
95
+ issues.push({ severity: 'info', category: 'stale-index', file: layout.indexFile, message: `"${title}" missing from index`, suggestion: 're-run `wiki_write` or add manually' });
96
+ }
97
+ }
98
+ }
99
+ // stale hot
100
+ if (existsSync(layout.hotFile)) {
101
+ const hotMtime = statSync(layout.hotFile).mtimeMs;
102
+ const ageDays = (Date.now() - hotMtime) / 86400000;
103
+ if (ageDays > 30) {
104
+ issues.push({ severity: 'info', category: 'stale-hot', file: layout.hotFile, message: `hot cache is ${Math.floor(ageDays)} days old`, suggestion: 'regenerate via `wiki_query` quick mode' });
105
+ }
106
+ }
107
+ const totals = { error: 0, warn: 0, info: 0 };
108
+ for (const i of issues)
109
+ totals[i.severity]++;
110
+ const report = {
111
+ generatedAt: new Date().toISOString(),
112
+ totals,
113
+ issues,
114
+ };
115
+ if (opts.fix) {
116
+ // report-only build: no auto-fix yet. Hooked in for parity with future
117
+ // versions; not silently destructive in v0.1.
118
+ }
119
+ return report;
120
+ }
121
+ export function writeLintReport(vaultPath, config, report) {
122
+ const layout = resolveLayout(vaultPath, config);
123
+ if (!existsSync(layout.metaDir))
124
+ mkdirSync(layout.metaDir, { recursive: true });
125
+ const date = report.generatedAt.slice(0, 10);
126
+ const path = join(layout.metaDir, `Lint Report ${date}.md`);
127
+ const lines = [];
128
+ lines.push(`# Lint Report — ${date}`, '');
129
+ lines.push(`Totals: ${report.totals.error} error(s), ${report.totals.warn} warn(s), ${report.totals.info} info(s)`, '');
130
+ for (const sev of ['error', 'warn', 'info']) {
131
+ const group = report.issues.filter(i => i.severity === sev);
132
+ if (group.length === 0)
133
+ continue;
134
+ lines.push(`## ${sev.toUpperCase()} (${group.length})`, '');
135
+ for (const i of group) {
136
+ lines.push(`- **${i.category}** — \`${i.file}\`: ${i.message}`);
137
+ if (i.suggestion)
138
+ lines.push(` - _suggestion:_ ${i.suggestion}`);
139
+ }
140
+ lines.push('');
141
+ }
142
+ writeFileSync(path, lines.join('\n'), 'utf8');
143
+ return path;
144
+ }
145
+ //# sourceMappingURL=lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.js","sourceRoot":"","sources":["../src/lint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * scaffold.ts — initialize a vault with the LLM Wiki layout.
3
+ *
4
+ * Default template scaffolds: wiki/, .raw/, wiki/meta/, plus seed files
5
+ * (index.md, hot.md, log.md, Inbox.md). Dry-run by default; pass
6
+ * `{ apply: true }` to actually write.
7
+ */
8
+ import { type PluginConfig } from './vault.js';
9
+ export interface ScaffoldArgs {
10
+ template?: 'default' | 'minimal' | 'research';
11
+ apply?: boolean;
12
+ }
13
+ export interface ScaffoldPlan {
14
+ create: string[];
15
+ write: {
16
+ path: string;
17
+ content: string;
18
+ }[];
19
+ skipped: string[];
20
+ }
21
+ export declare function plan(vaultPath: string, config: PluginConfig, args?: ScaffoldArgs): ScaffoldPlan;
22
+ export declare function scaffold(vaultPath: string, config: PluginConfig, args?: ScaffoldArgs): ScaffoldPlan | {
23
+ applied: true;
24
+ plan: ScaffoldPlan;
25
+ };
26
+ //# sourceMappingURL=scaffold.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAE9D,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;IAC9C,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3C,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAgB,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,GAAE,YAAiB,GAAG,YAAY,CA6CnG;AAED,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,GAAE,YAAiB,GAAG,YAAY,GAAG;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,YAAY,CAAA;CAAE,CAU/I"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * scaffold.ts — initialize a vault with the LLM Wiki layout.
3
+ *
4
+ * Default template scaffolds: wiki/, .raw/, wiki/meta/, plus seed files
5
+ * (index.md, hot.md, log.md, Inbox.md). Dry-run by default; pass
6
+ * `{ apply: true }` to actually write.
7
+ */
8
+ import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
9
+ import { join } from 'node:path';
10
+ import { resolveLayout } from './vault.js';
11
+ export function plan(vaultPath, config, args = {}) {
12
+ const layout = resolveLayout(vaultPath, config);
13
+ const plan = { create: [], write: [], skipped: [] };
14
+ // dirs
15
+ for (const d of [
16
+ layout.wikiDir,
17
+ layout.rawDir,
18
+ layout.metaDir,
19
+ join(layout.wikiDir, 'areas'),
20
+ join(layout.wikiDir, 'projects'),
21
+ join(layout.wikiDir, 'resources'),
22
+ join(layout.wikiDir, 'sources'),
23
+ join(layout.wikiDir, 'archive'),
24
+ join(vaultPath, 'inbox'),
25
+ ]) {
26
+ if (existsSync(d))
27
+ plan.skipped.push(d);
28
+ else
29
+ plan.create.push(d);
30
+ }
31
+ // files
32
+ if (!existsSync(layout.indexFile)) {
33
+ plan.write.push({ path: layout.indexFile, content: '# Index\n\n## Areas\n\n## Projects\n\n## Resources\n\n## Sources\n\n' });
34
+ }
35
+ if (!existsSync(layout.hotFile)) {
36
+ plan.write.push({ path: layout.hotFile, content: '# Hot Cache\n\n_Recent context, regenerated by `wiki_query` quick mode._\n' });
37
+ }
38
+ if (!existsSync(layout.logFile)) {
39
+ plan.write.push({ path: layout.logFile, content: '# Log\n\n' });
40
+ }
41
+ if (!existsSync(join(vaultPath, 'inbox', 'Inbox.md'))) {
42
+ plan.write.push({
43
+ path: join(vaultPath, 'inbox', 'Inbox.md'),
44
+ content: '# Inbox\n\nDrop source URLs, file paths, or paste raw notes here. The `wiki-ingest` skill processes them into the vault.\n',
45
+ });
46
+ }
47
+ if (args.template === 'research') {
48
+ plan.write.push({
49
+ path: join(layout.wikiDir, 'Research Questions.md'),
50
+ content: '# Research Questions\n\n- [ ] \n',
51
+ });
52
+ }
53
+ return plan;
54
+ }
55
+ export function scaffold(vaultPath, config, args = {}) {
56
+ const p = plan(vaultPath, config, args);
57
+ if (!args.apply)
58
+ return p;
59
+ for (const d of p.create)
60
+ mkdirSync(d, { recursive: true });
61
+ for (const f of p.write) {
62
+ mkdirSync(join(f.path, '..'), { recursive: true }); // no-op for files, but safe
63
+ writeFileSync(f.path, f.content, 'utf8');
64
+ }
65
+ return { applied: true, plan: p };
66
+ }
67
+ //# sourceMappingURL=scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * search.ts — BM25 full-text search with snippet + link graph.
3
+ *
4
+ * Independent implementation; no code from claude-obsidian. Algorithm is the
5
+ * standard Robertson–Walker BM25 (k1=1.5, b=0.75).
6
+ */
7
+ export interface SearchHit {
8
+ title: string;
9
+ path: string;
10
+ score: number;
11
+ snippet: string;
12
+ inbound: string[];
13
+ outbound: string[];
14
+ }
15
+ interface Doc {
16
+ title: string;
17
+ path: string;
18
+ tokens: string[];
19
+ body: string;
20
+ outbound: Set<string>;
21
+ }
22
+ export interface SearchIndex {
23
+ docs: Doc[];
24
+ df: Map<string, number>;
25
+ avgdl: number;
26
+ titles: Set<string>;
27
+ inbound: Map<string, Set<string>>;
28
+ }
29
+ export declare function buildIndex(wikiDir: string): SearchIndex;
30
+ export interface SearchArgs {
31
+ query: string;
32
+ limit?: number;
33
+ mode?: 'quick' | 'standard';
34
+ }
35
+ export declare function search(wikiDir: string, args: SearchArgs): {
36
+ hits: SearchHit[];
37
+ hot: string | null;
38
+ index: string | null;
39
+ };
40
+ export {};
41
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AASD,UAAU,GAAG;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACvB;AAsBD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;CACnC;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAiCvD;AAmBD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;CAC7B;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG;IACzD,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAgCA"}
package/lib/search.js ADDED
@@ -0,0 +1,127 @@
1
+ /**
2
+ * search.ts — BM25 full-text search with snippet + link graph.
3
+ *
4
+ * Independent implementation; no code from claude-obsidian. Algorithm is the
5
+ * standard Robertson–Walker BM25 (k1=1.5, b=0.75).
6
+ */
7
+ import { readFileSync } from 'node:fs';
8
+ import { basename, extname, join } from 'node:path';
9
+ import { walkMd, isMachineryPage } from './vault.js';
10
+ const LINK_RE = /\[\[([^\]|]+)(?:\|[^\]]+)?\]\]/g;
11
+ const TOKEN_RE = /[\p{L}\p{N}]+/gu;
12
+ const SNIPPET_RADIUS = 80;
13
+ const K1 = 1.5;
14
+ const B = 0.75;
15
+ function tokenize(s) {
16
+ return (s.toLowerCase().match(TOKEN_RE) ?? []);
17
+ }
18
+ function snippet(body, queryTokens) {
19
+ const lower = body.toLowerCase();
20
+ let best = -1;
21
+ for (const t of queryTokens) {
22
+ const i = lower.indexOf(t);
23
+ if (i >= 0 && (best < 0 || i < best))
24
+ best = i;
25
+ }
26
+ if (best < 0)
27
+ return body.slice(0, SNIPPET_RADIUS * 2).trim();
28
+ const start = Math.max(0, best - SNIPPET_RADIUS);
29
+ const end = Math.min(body.length, best + SNIPPET_RADIUS);
30
+ let snip = body.slice(start, end).replace(/\s+/g, ' ').trim();
31
+ if (start > 0)
32
+ snip = '…' + snip;
33
+ if (end < body.length)
34
+ snip += '…';
35
+ return snip;
36
+ }
37
+ export function buildIndex(wikiDir) {
38
+ const docs = [];
39
+ const df = new Map();
40
+ const titles = new Set();
41
+ let totalLen = 0;
42
+ for (const p of walkMd(wikiDir)) {
43
+ const title = basename(p, extname(p));
44
+ if (isMachineryPage(title))
45
+ continue;
46
+ const body = readFileSync(p, 'utf8');
47
+ const tokens = tokenize(body);
48
+ const outbound = new Set();
49
+ for (const m of body.matchAll(LINK_RE))
50
+ outbound.add(m[1].trim());
51
+ docs.push({ title, path: p, tokens, body, outbound });
52
+ titles.add(title);
53
+ totalLen += tokens.length;
54
+ const seen = new Set();
55
+ for (const t of tokens) {
56
+ if (seen.has(t))
57
+ continue;
58
+ seen.add(t);
59
+ df.set(t, (df.get(t) ?? 0) + 1);
60
+ }
61
+ }
62
+ const inbound = new Map();
63
+ for (const d of docs) {
64
+ for (const o of d.outbound) {
65
+ if (!inbound.has(o))
66
+ inbound.set(o, new Set());
67
+ inbound.get(o).add(d.title);
68
+ }
69
+ }
70
+ return { docs, df, avgdl: docs.length ? totalLen / docs.length : 0, titles, inbound };
71
+ }
72
+ function bm25Score(query, doc, idx) {
73
+ const N = idx.docs.length || 1;
74
+ const dl = doc.tokens.length;
75
+ let score = 0;
76
+ const tf = new Map();
77
+ for (const t of doc.tokens)
78
+ tf.set(t, (tf.get(t) ?? 0) + 1);
79
+ for (const q of query) {
80
+ const f = tf.get(q) ?? 0;
81
+ if (f === 0)
82
+ continue;
83
+ const n = idx.df.get(q) ?? 0;
84
+ const idf = Math.log(1 + (N - n + 0.5) / (n + 0.5));
85
+ const norm = f * (K1 + 1) / (f + K1 * (1 - B + B * dl / Math.max(1, idx.avgdl)));
86
+ score += idf * norm;
87
+ }
88
+ return score;
89
+ }
90
+ export function search(wikiDir, args) {
91
+ const limit = args.limit ?? 10;
92
+ const hotPath = join(wikiDir, 'hot.md');
93
+ const indexPath = join(wikiDir, 'index.md');
94
+ // quick mode: just return hot + index verbatim (the skill's read order)
95
+ if (args.mode === 'quick') {
96
+ const hot = safeRead(hotPath);
97
+ const index = safeRead(indexPath);
98
+ return { hits: [], hot, index };
99
+ }
100
+ const idx = buildIndex(wikiDir);
101
+ const qTokens = tokenize(args.query);
102
+ if (qTokens.length === 0)
103
+ return { hits: [], hot: safeRead(hotPath), index: safeRead(indexPath) };
104
+ const scored = idx.docs
105
+ .map(d => ({ d, s: bm25Score(qTokens, d, idx) }))
106
+ .filter(x => x.s > 0)
107
+ .sort((a, b) => b.s - a.s)
108
+ .slice(0, limit);
109
+ const hits = scored.map(({ d, s }) => ({
110
+ title: d.title,
111
+ path: d.path,
112
+ score: Number(s.toFixed(3)),
113
+ snippet: snippet(d.body, qTokens),
114
+ inbound: [...(idx.inbound.get(d.title) ?? [])],
115
+ outbound: [...d.outbound],
116
+ }));
117
+ return { hits, hot: safeRead(hotPath), index: safeRead(indexPath) };
118
+ }
119
+ function safeRead(p) {
120
+ try {
121
+ return readFileSync(p, 'utf8');
122
+ }
123
+ catch {
124
+ return null;
125
+ }
126
+ }
127
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * skills.ts — register all SKILL.md files in ./skills/ via ctx.skills.
3
+ *
4
+ * Discovers any directory containing SKILL.md, parses the frontmatter to
5
+ * extract `name` and `description`, and registers it. The body (everything
6
+ * after the frontmatter) becomes the skill's `content`, and `source` is a
7
+ * stable string identifying this plugin bundle. `resourceBase` points back
8
+ * at the skill's own directory so its body can reference references/ files
9
+ * via the standard Agent Skills convention.
10
+ *
11
+ * Why `source` + `content` are required: the `@deepseek-ai/dsh-skill`
12
+ * registry validates a loaded runtime skill strictly — a missing (or
13
+ * non-string) `source` throws `skill provider ... with a non-string source`,
14
+ * and a missing `content` throws `content must be a string`.
15
+ */
16
+ import type { Context } from './types.js';
17
+ export declare function registerAllSkills(ctx: Context, skillsDir: string): string[];
18
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAiB,MAAM,YAAY,CAAC;AA0BzD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAyC3E"}
package/lib/skills.js ADDED
@@ -0,0 +1,83 @@
1
+ /**
2
+ * skills.ts — register all SKILL.md files in ./skills/ via ctx.skills.
3
+ *
4
+ * Discovers any directory containing SKILL.md, parses the frontmatter to
5
+ * extract `name` and `description`, and registers it. The body (everything
6
+ * after the frontmatter) becomes the skill's `content`, and `source` is a
7
+ * stable string identifying this plugin bundle. `resourceBase` points back
8
+ * at the skill's own directory so its body can reference references/ files
9
+ * via the standard Agent Skills convention.
10
+ *
11
+ * Why `source` + `content` are required: the `@deepseek-ai/dsh-skill`
12
+ * registry validates a loaded runtime skill strictly — a missing (or
13
+ * non-string) `source` throws `skill provider ... with a non-string source`,
14
+ * and a missing `content` throws `content must be a string`.
15
+ */
16
+ import { readdirSync, readFileSync, existsSync, statSync } from 'node:fs';
17
+ import { join } from 'node:path';
18
+ const FM_RE = /^---\n([\s\S]*?)\n---\n?/;
19
+ /** Stable `source` string for every skill this plugin registers. */
20
+ const BUNDLE_SOURCE = 'dsh-obsidian';
21
+ function parseSkillFrontmatter(md) {
22
+ const m = FM_RE.exec(md);
23
+ if (!m)
24
+ return {};
25
+ const out = {};
26
+ for (const line of m[1].split('\n')) {
27
+ const idx = line.indexOf(':');
28
+ if (idx < 0)
29
+ continue;
30
+ // Only the first `:` splits key/value; descriptions may contain `:`.
31
+ out[line.slice(0, idx).trim()] = line.slice(idx + 1).trim();
32
+ }
33
+ return { name: out.name, description: out.description };
34
+ }
35
+ /** Strip the leading YAML frontmatter block; returns the body trimmed. */
36
+ function stripFrontmatter(md) {
37
+ const m = FM_RE.exec(md);
38
+ return m ? md.slice(m[0].length).trim() : md.trim();
39
+ }
40
+ export function registerAllSkills(ctx, skillsDir) {
41
+ const registered = [];
42
+ if (!existsSync(skillsDir)) {
43
+ ctx.logger.warn(`skills dir not found: ${skillsDir}`);
44
+ return registered;
45
+ }
46
+ for (const entry of readdirSync(skillsDir)) {
47
+ const dir = join(skillsDir, entry);
48
+ if (!statSync(dir).isDirectory())
49
+ continue;
50
+ const skillFile = join(dir, 'SKILL.md');
51
+ if (!existsSync(skillFile))
52
+ continue;
53
+ const md = readFileSync(skillFile, 'utf8');
54
+ const fm = parseSkillFrontmatter(md);
55
+ if (!fm.name) {
56
+ ctx.logger.warn(`skipping skill (no name in frontmatter): ${entry}`);
57
+ continue;
58
+ }
59
+ const content = stripFrontmatter(md);
60
+ if (content.length === 0) {
61
+ ctx.logger.warn(`skipping skill ${fm.name}: empty body after frontmatter`);
62
+ continue;
63
+ }
64
+ const manifest = {
65
+ name: fm.name,
66
+ description: fm.description ?? '',
67
+ source: BUNDLE_SOURCE,
68
+ content,
69
+ path: skillFile,
70
+ resourceBase: { kind: 'directory', path: dir },
71
+ };
72
+ try {
73
+ ctx.skills.register(manifest);
74
+ registered.push(fm.name);
75
+ ctx.logger.debug(` registered skill: ${fm.name}`);
76
+ }
77
+ catch (e) {
78
+ ctx.logger.error(`failed to register skill ${fm.name}: ${e.message}`);
79
+ }
80
+ }
81
+ return registered;
82
+ }
83
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,KAAK,GAAG,0BAA0B,CAAC;AAEzC,oEAAoE;AACpE,MAAM,aAAa,GAAG,cAAc,CAAC;AAErC,SAAS,qBAAqB,CAAC,EAAU;IACvC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzB,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAClB,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,GAAG,GAAG,CAAC;YAAE,SAAS;QACtB,qEAAqE;QACrE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9D,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC;AAC1D,CAAC;AAED,0EAA0E;AAC1E,SAAS,gBAAgB,CAAC,EAAU;IAClC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzB,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAY,EAAE,SAAiB;IAC/D,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,SAAS,EAAE,CAAC,CAAC;QACtD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE;YAAE,SAAS;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QACxC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,SAAS;QACrC,MAAM,EAAE,GAAG,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC3C,MAAM,EAAE,GAAG,qBAAqB,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YACb,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,4CAA4C,KAAK,EAAE,CAAC,CAAC;YACrE,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,IAAI,gCAAgC,CAAC,CAAC;YAC3E,SAAS;QACX,CAAC;QACD,MAAM,QAAQ,GAAkB;YAC9B,IAAI,EAAE,EAAE,CAAC,IAAI;YACb,WAAW,EAAE,EAAE,CAAC,WAAW,IAAI,EAAE;YACjC,MAAM,EAAE,aAAa;YACrB,OAAO;YACP,IAAI,EAAE,SAAS;YACf,YAAY,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,EAAE;SAC/C,CAAC;QACF,IAAI,CAAC;YACH,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC9B,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;YACzB,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE,CAAC,IAAI,KAAM,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC"}
package/lib/types.d.ts ADDED
@@ -0,0 +1,55 @@
1
+ /**
2
+ * types.ts — minimal type declarations for the DSH cordis API we use.
3
+ * When dsh bumps the public API, update these; the loader reports mismatches.
4
+ */
5
+ import type { Context as CordisContext } from '@deepseek-ai/cordis';
6
+ export type Context = CordisContext;
7
+ export interface Logger {
8
+ info(msg: string): void;
9
+ warn(msg: string): void;
10
+ error(msg: string): void;
11
+ debug(msg: string): void;
12
+ }
13
+ export interface RenderedOutput {
14
+ type: 'text';
15
+ text: string;
16
+ }
17
+ export interface ToolDefinition {
18
+ name: string;
19
+ description: string;
20
+ parameters: Record<string, unknown>;
21
+ output?: {
22
+ schema?: unknown;
23
+ render?: (args: unknown, value: unknown) => RenderedOutput[];
24
+ };
25
+ execute(args: Record<string, unknown>): Promise<unknown> | unknown;
26
+ presentCall?: (args: Record<string, unknown>) => Record<string, unknown>;
27
+ }
28
+ export interface ToolsService {
29
+ register(tool: ToolDefinition): void;
30
+ }
31
+ export interface SkillManifest {
32
+ name: string;
33
+ description: string;
34
+ source: string;
35
+ content: string;
36
+ path?: string;
37
+ resourceBase?: {
38
+ kind: 'directory';
39
+ path: string;
40
+ };
41
+ }
42
+ export interface SkillsService {
43
+ register(manifest: SkillManifest): void;
44
+ }
45
+ declare module '@deepseek-ai/cordis' {
46
+ interface Context {
47
+ skills: SkillsService;
48
+ }
49
+ }
50
+ export interface PluginConfig {
51
+ vaultPath: string;
52
+ typeFolders?: Record<string, string>;
53
+ maxQueryResults?: number;
54
+ }
55
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpE,MAAM,MAAM,OAAO,GAAG,aAAa,CAAC;AAGpC,MAAM,WAAW,MAAM;IACrB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAKD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,MAAM,CAAC,EAAE;QACP,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,KAAK,cAAc,EAAE,CAAC;KAC9D,CAAC;IACF,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IACnE,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1E;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CAAC;CACtC;AAWD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACpD;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;CACzC;AAKD,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,OAAO;QACf,MAAM,EAAE,aAAa,CAAC;KACvB;CACF;AAGD,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B"}