@bookedsolid/reagent 0.13.2 → 0.14.2
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 +149 -6
- package/dist/cli/commands/init/claude-md.d.ts +5 -0
- package/dist/cli/commands/init/claude-md.d.ts.map +1 -1
- package/dist/cli/commands/init/claude-md.js +21 -1
- package/dist/cli/commands/init/claude-md.js.map +1 -1
- package/dist/cli/commands/init/index.d.ts.map +1 -1
- package/dist/cli/commands/init/index.js +16 -4
- package/dist/cli/commands/init/index.js.map +1 -1
- package/dist/cli/commands/init/mcp-config.js +6 -6
- package/dist/cli/commands/init/mcp-config.js.map +1 -1
- package/dist/cli/commands/init/obsidian.d.ts +16 -0
- package/dist/cli/commands/init/obsidian.d.ts.map +1 -0
- package/dist/cli/commands/init/obsidian.js +95 -0
- package/dist/cli/commands/init/obsidian.js.map +1 -0
- package/dist/cli/commands/init/policy.d.ts.map +1 -1
- package/dist/cli/commands/init/policy.js +10 -1
- package/dist/cli/commands/init/policy.js.map +1 -1
- package/dist/cli/commands/obsidian.d.ts +2 -0
- package/dist/cli/commands/obsidian.d.ts.map +1 -0
- package/dist/cli/commands/obsidian.js +187 -0
- package/dist/cli/commands/obsidian.js.map +1 -0
- package/dist/cli/commands/upgrade-policy.d.ts +17 -0
- package/dist/cli/commands/upgrade-policy.d.ts.map +1 -0
- package/dist/cli/commands/upgrade-policy.js +123 -0
- package/dist/cli/commands/upgrade-policy.js.map +1 -0
- package/dist/cli/commands/upgrade.d.ts.map +1 -1
- package/dist/cli/commands/upgrade.js +8 -26
- package/dist/cli/commands/upgrade.js.map +1 -1
- package/dist/cli/index.js +9 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/gateway/native-tools.d.ts.map +1 -1
- package/dist/gateway/native-tools.js +39 -0
- package/dist/gateway/native-tools.js.map +1 -1
- package/dist/obsidian/cli.d.ts +49 -0
- package/dist/obsidian/cli.d.ts.map +1 -0
- package/dist/obsidian/cli.js +128 -0
- package/dist/obsidian/cli.js.map +1 -0
- package/dist/obsidian/index.d.ts +7 -0
- package/dist/obsidian/index.d.ts.map +1 -0
- package/dist/obsidian/index.js +5 -0
- package/dist/obsidian/index.js.map +1 -0
- package/dist/obsidian/kanban-generator.d.ts +9 -0
- package/dist/obsidian/kanban-generator.d.ts.map +1 -0
- package/dist/obsidian/kanban-generator.js +63 -0
- package/dist/obsidian/kanban-generator.js.map +1 -0
- package/dist/obsidian/vault-config.d.ts +142 -0
- package/dist/obsidian/vault-config.d.ts.map +1 -0
- package/dist/obsidian/vault-config.js +92 -0
- package/dist/obsidian/vault-config.js.map +1 -0
- package/dist/obsidian/vault-writer.d.ts +52 -0
- package/dist/obsidian/vault-writer.d.ts.map +1 -0
- package/dist/obsidian/vault-writer.js +166 -0
- package/dist/obsidian/vault-writer.js.map +1 -0
- package/dist/types/policy.d.ts +4 -0
- package/dist/types/policy.d.ts.map +1 -1
- package/hooks/dangerous-bash-interceptor.sh +43 -0
- package/hooks/reagent-obsidian-journal.sh +69 -0
- package/hooks/reagent-obsidian-precompact.sh +88 -0
- package/hooks/reagent-obsidian-tasks.sh +126 -0
- package/package.json +2 -2
- package/profiles/bst-internal.json +1 -1
- package/profiles/client-engagement.json +2 -2
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thin wrapper around the Obsidian CLI (`/usr/local/bin/obsidian`).
|
|
3
|
+
*
|
|
4
|
+
* All methods are fail-silent — returns null/false on error.
|
|
5
|
+
* Pattern: DiscordNotifier / github-bridge.ts.
|
|
6
|
+
*/
|
|
7
|
+
export declare class ObsidianCli {
|
|
8
|
+
private readonly vaultName;
|
|
9
|
+
constructor(vaultName: string);
|
|
10
|
+
/**
|
|
11
|
+
* Check if the Obsidian CLI binary is available.
|
|
12
|
+
*/
|
|
13
|
+
static isAvailable(): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Append content to today's daily note.
|
|
16
|
+
*/
|
|
17
|
+
dailyAppend(content: string): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Create a new note with the given name and content.
|
|
20
|
+
*/
|
|
21
|
+
createNote(name: string, content: string, opts?: {
|
|
22
|
+
path?: string;
|
|
23
|
+
}): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Read the content of a note. Returns null on failure.
|
|
26
|
+
*/
|
|
27
|
+
readNote(file: string): string | null;
|
|
28
|
+
/**
|
|
29
|
+
* Set a frontmatter property on a note.
|
|
30
|
+
*/
|
|
31
|
+
setProperty(file: string, name: string, value: string, type?: string): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Search for notes matching a query. Returns file paths or empty array.
|
|
34
|
+
*/
|
|
35
|
+
search(query: string, limit?: number): string[];
|
|
36
|
+
/**
|
|
37
|
+
* Get vault health metrics (orphans, unresolved links, dead ends).
|
|
38
|
+
*/
|
|
39
|
+
vaultHealth(): {
|
|
40
|
+
orphans: number;
|
|
41
|
+
unresolved: number;
|
|
42
|
+
deadends: number;
|
|
43
|
+
} | null;
|
|
44
|
+
/**
|
|
45
|
+
* Execute an Obsidian CLI command. Returns true on success, false on failure.
|
|
46
|
+
*/
|
|
47
|
+
private exec;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/obsidian/cli.ts"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH,qBAAa,WAAW;IACV,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,MAAM;IAE9C;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,OAAO;IAI7B;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIrC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO;IAS5E;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAarC;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO;IAkB9E;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE;IAoB/C;;OAEG;IACH,WAAW,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAsB/E;;OAEG;IACH,OAAO,CAAC,IAAI;CAYb"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import { execFileSync } from 'node:child_process';
|
|
3
|
+
const OBSIDIAN_CLI = process.env['REAGENT_OBSIDIAN_CLI'] || '/usr/local/bin/obsidian';
|
|
4
|
+
const EXEC_TIMEOUT = 10_000; // 10s
|
|
5
|
+
/**
|
|
6
|
+
* Thin wrapper around the Obsidian CLI (`/usr/local/bin/obsidian`).
|
|
7
|
+
*
|
|
8
|
+
* All methods are fail-silent — returns null/false on error.
|
|
9
|
+
* Pattern: DiscordNotifier / github-bridge.ts.
|
|
10
|
+
*/
|
|
11
|
+
export class ObsidianCli {
|
|
12
|
+
vaultName;
|
|
13
|
+
constructor(vaultName) {
|
|
14
|
+
this.vaultName = vaultName;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Check if the Obsidian CLI binary is available.
|
|
18
|
+
*/
|
|
19
|
+
static isAvailable() {
|
|
20
|
+
return fs.existsSync(OBSIDIAN_CLI);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Append content to today's daily note.
|
|
24
|
+
*/
|
|
25
|
+
dailyAppend(content) {
|
|
26
|
+
return this.exec(['daily:append', '--vault', this.vaultName, '--', content]);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Create a new note with the given name and content.
|
|
30
|
+
*/
|
|
31
|
+
createNote(name, content, opts) {
|
|
32
|
+
const args = ['create', '--vault', this.vaultName];
|
|
33
|
+
if (opts?.path) {
|
|
34
|
+
args.push('--path', opts.path);
|
|
35
|
+
}
|
|
36
|
+
args.push('--name', name, '--', content);
|
|
37
|
+
return this.exec(args);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Read the content of a note. Returns null on failure.
|
|
41
|
+
*/
|
|
42
|
+
readNote(file) {
|
|
43
|
+
try {
|
|
44
|
+
const result = execFileSync(OBSIDIAN_CLI, ['read', '--vault', this.vaultName, '--file', file], { encoding: 'utf8', timeout: EXEC_TIMEOUT, stdio: ['pipe', 'pipe', 'pipe'] });
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Set a frontmatter property on a note.
|
|
53
|
+
*/
|
|
54
|
+
setProperty(file, name, value, type) {
|
|
55
|
+
const args = [
|
|
56
|
+
'property:set',
|
|
57
|
+
'--vault',
|
|
58
|
+
this.vaultName,
|
|
59
|
+
'--file',
|
|
60
|
+
file,
|
|
61
|
+
'--name',
|
|
62
|
+
name,
|
|
63
|
+
'--value',
|
|
64
|
+
value,
|
|
65
|
+
];
|
|
66
|
+
if (type) {
|
|
67
|
+
args.push('--type', type);
|
|
68
|
+
}
|
|
69
|
+
return this.exec(args);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Search for notes matching a query. Returns file paths or empty array.
|
|
73
|
+
*/
|
|
74
|
+
search(query, limit) {
|
|
75
|
+
try {
|
|
76
|
+
const args = ['search', '--vault', this.vaultName, '--query', query];
|
|
77
|
+
if (limit) {
|
|
78
|
+
args.push('--limit', String(limit));
|
|
79
|
+
}
|
|
80
|
+
const result = execFileSync(OBSIDIAN_CLI, args, {
|
|
81
|
+
encoding: 'utf8',
|
|
82
|
+
timeout: EXEC_TIMEOUT,
|
|
83
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
84
|
+
});
|
|
85
|
+
return result
|
|
86
|
+
.split('\n')
|
|
87
|
+
.map((l) => l.trim())
|
|
88
|
+
.filter(Boolean);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return [];
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Get vault health metrics (orphans, unresolved links, dead ends).
|
|
96
|
+
*/
|
|
97
|
+
vaultHealth() {
|
|
98
|
+
try {
|
|
99
|
+
const result = execFileSync(OBSIDIAN_CLI, ['vault:health', '--vault', this.vaultName, '--json'], { encoding: 'utf8', timeout: EXEC_TIMEOUT, stdio: ['pipe', 'pipe', 'pipe'] });
|
|
100
|
+
const parsed = JSON.parse(result);
|
|
101
|
+
return {
|
|
102
|
+
orphans: parsed.orphans ?? 0,
|
|
103
|
+
unresolved: parsed.unresolved ?? 0,
|
|
104
|
+
deadends: parsed.deadends ?? 0,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Execute an Obsidian CLI command. Returns true on success, false on failure.
|
|
113
|
+
*/
|
|
114
|
+
exec(args) {
|
|
115
|
+
try {
|
|
116
|
+
execFileSync(OBSIDIAN_CLI, args, {
|
|
117
|
+
encoding: 'utf8',
|
|
118
|
+
timeout: EXEC_TIMEOUT,
|
|
119
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
120
|
+
});
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/obsidian/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { loadObsidianConfig, ObsidianVaultConfigSchema } from './vault-config.js';
|
|
2
|
+
export type { ResolvedObsidianConfig } from './vault-config.js';
|
|
3
|
+
export { generateKanban } from './kanban-generator.js';
|
|
4
|
+
export { VaultWriter } from './vault-writer.js';
|
|
5
|
+
export type { SyncResult } from './vault-writer.js';
|
|
6
|
+
export { ObsidianCli } from './cli.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/obsidian/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAClF,YAAY,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/obsidian/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAElF,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { TaskView } from '../pm/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Pure function: converts an array of TaskView into Obsidian Kanban markdown.
|
|
4
|
+
*
|
|
5
|
+
* Output is compatible with the Obsidian Kanban plugin (kanban-plugin: basic frontmatter).
|
|
6
|
+
* Uses reagent_managed frontmatter to identify auto-generated files.
|
|
7
|
+
*/
|
|
8
|
+
export declare function generateKanban(tasks: TaskView[]): string;
|
|
9
|
+
//# sourceMappingURL=kanban-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kanban-generator.d.ts","sourceRoot":"","sources":["../../src/obsidian/kanban-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAe/C;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAwDxD"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Status-to-column mapping for the Obsidian Kanban plugin.
|
|
3
|
+
*/
|
|
4
|
+
const COLUMN_ORDER = ['Backlog', 'In Progress', 'Blocked', 'Done', 'Cancelled'];
|
|
5
|
+
const STATUS_TO_COLUMN = {
|
|
6
|
+
created: 'Backlog',
|
|
7
|
+
started: 'In Progress',
|
|
8
|
+
blocked: 'Blocked',
|
|
9
|
+
completed: 'Done',
|
|
10
|
+
cancelled: 'Cancelled',
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Pure function: converts an array of TaskView into Obsidian Kanban markdown.
|
|
14
|
+
*
|
|
15
|
+
* Output is compatible with the Obsidian Kanban plugin (kanban-plugin: basic frontmatter).
|
|
16
|
+
* Uses reagent_managed frontmatter to identify auto-generated files.
|
|
17
|
+
*/
|
|
18
|
+
export function generateKanban(tasks) {
|
|
19
|
+
const now = new Date().toISOString();
|
|
20
|
+
const lines = [
|
|
21
|
+
'---',
|
|
22
|
+
'kanban-plugin: basic',
|
|
23
|
+
'reagent_managed: true',
|
|
24
|
+
`reagent_synced_at: "${now}"`,
|
|
25
|
+
'---',
|
|
26
|
+
'',
|
|
27
|
+
];
|
|
28
|
+
// Group tasks by column
|
|
29
|
+
const columns = new Map();
|
|
30
|
+
for (const col of COLUMN_ORDER) {
|
|
31
|
+
columns.set(col, []);
|
|
32
|
+
}
|
|
33
|
+
for (const task of tasks) {
|
|
34
|
+
const column = STATUS_TO_COLUMN[task.status] || 'Backlog';
|
|
35
|
+
columns.get(column).push(task);
|
|
36
|
+
}
|
|
37
|
+
for (const col of COLUMN_ORDER) {
|
|
38
|
+
const colTasks = columns.get(col);
|
|
39
|
+
lines.push(`## ${col}`);
|
|
40
|
+
lines.push('');
|
|
41
|
+
if (colTasks.length === 0) {
|
|
42
|
+
lines.push('');
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
for (const task of colTasks) {
|
|
46
|
+
const checked = task.status === 'completed' || task.status === 'cancelled' ? 'x' : ' ';
|
|
47
|
+
let line = `- [${checked}] **${task.id}** ${task.title}`;
|
|
48
|
+
if (task.status === 'blocked' && task.blocked_by) {
|
|
49
|
+
line += ` *(blocked by: ${task.blocked_by})*`;
|
|
50
|
+
}
|
|
51
|
+
if (task.urgency === 'critical') {
|
|
52
|
+
line += ' 🔴';
|
|
53
|
+
}
|
|
54
|
+
if (task.assignee) {
|
|
55
|
+
line += ` @${task.assignee}`;
|
|
56
|
+
}
|
|
57
|
+
lines.push(line);
|
|
58
|
+
}
|
|
59
|
+
lines.push('');
|
|
60
|
+
}
|
|
61
|
+
return lines.join('\n');
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=kanban-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kanban-generator.js","sourceRoot":"","sources":["../../src/obsidian/kanban-generator.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,YAAY,GAAG,CAAC,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,CAAU,CAAC;AAEzF,MAAM,gBAAgB,GAA8D;IAClF,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,aAAa;IACtB,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,MAAM;IACjB,SAAS,EAAE,WAAW;CACvB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,KAAiB;IAC9C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErC,MAAM,KAAK,GAAa;QACtB,KAAK;QACL,sBAAsB;QACtB,uBAAuB;QACvB,uBAAuB,GAAG,GAAG;QAC7B,KAAK;QACL,EAAE;KACH,CAAC;IAEF,wBAAwB;IACxB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC9C,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACvB,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,SAAS;QACX,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,KAAK,WAAW,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACvF,IAAI,IAAI,GAAG,MAAM,OAAO,OAAO,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YAEzD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACjD,IAAI,IAAI,kBAAkB,IAAI,CAAC,UAAU,IAAI,CAAC;YAChD,CAAC;YAED,IAAI,IAAI,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;gBAChC,IAAI,IAAI,KAAK,CAAC;YAChB,CAAC;YAED,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC/B,CAAC;YAED,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Zod schema for the obsidian_vault block in gateway.yaml.
|
|
4
|
+
* Every sync target defaults to false — fully opt-in.
|
|
5
|
+
*/
|
|
6
|
+
export declare const ObsidianVaultConfigSchema: z.ZodObject<{
|
|
7
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
8
|
+
vault_path: z.ZodOptional<z.ZodString>;
|
|
9
|
+
vault_name: z.ZodOptional<z.ZodString>;
|
|
10
|
+
paths: z.ZodDefault<z.ZodObject<{
|
|
11
|
+
root: z.ZodDefault<z.ZodString>;
|
|
12
|
+
kanban: z.ZodDefault<z.ZodString>;
|
|
13
|
+
sources: z.ZodDefault<z.ZodString>;
|
|
14
|
+
wiki: z.ZodDefault<z.ZodString>;
|
|
15
|
+
tasks: z.ZodDefault<z.ZodString>;
|
|
16
|
+
sessions: z.ZodDefault<z.ZodString>;
|
|
17
|
+
}, "strip", z.ZodTypeAny, {
|
|
18
|
+
tasks: string;
|
|
19
|
+
root: string;
|
|
20
|
+
kanban: string;
|
|
21
|
+
sources: string;
|
|
22
|
+
wiki: string;
|
|
23
|
+
sessions: string;
|
|
24
|
+
}, {
|
|
25
|
+
tasks?: string | undefined;
|
|
26
|
+
root?: string | undefined;
|
|
27
|
+
kanban?: string | undefined;
|
|
28
|
+
sources?: string | undefined;
|
|
29
|
+
wiki?: string | undefined;
|
|
30
|
+
sessions?: string | undefined;
|
|
31
|
+
}>>;
|
|
32
|
+
sync: z.ZodDefault<z.ZodObject<{
|
|
33
|
+
kanban: z.ZodDefault<z.ZodBoolean>;
|
|
34
|
+
context_dump: z.ZodDefault<z.ZodBoolean>;
|
|
35
|
+
wiki_refresh: z.ZodDefault<z.ZodBoolean>;
|
|
36
|
+
journal: z.ZodDefault<z.ZodBoolean>;
|
|
37
|
+
precompact: z.ZodDefault<z.ZodBoolean>;
|
|
38
|
+
tasks: z.ZodDefault<z.ZodBoolean>;
|
|
39
|
+
}, "strip", z.ZodTypeAny, {
|
|
40
|
+
tasks: boolean;
|
|
41
|
+
kanban: boolean;
|
|
42
|
+
context_dump: boolean;
|
|
43
|
+
wiki_refresh: boolean;
|
|
44
|
+
journal: boolean;
|
|
45
|
+
precompact: boolean;
|
|
46
|
+
}, {
|
|
47
|
+
tasks?: boolean | undefined;
|
|
48
|
+
kanban?: boolean | undefined;
|
|
49
|
+
context_dump?: boolean | undefined;
|
|
50
|
+
wiki_refresh?: boolean | undefined;
|
|
51
|
+
journal?: boolean | undefined;
|
|
52
|
+
precompact?: boolean | undefined;
|
|
53
|
+
}>>;
|
|
54
|
+
precompact: z.ZodDefault<z.ZodObject<{
|
|
55
|
+
engine: z.ZodDefault<z.ZodEnum<["claude", "ollama"]>>;
|
|
56
|
+
model: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
57
|
+
}, "strip", z.ZodTypeAny, {
|
|
58
|
+
model: string | null;
|
|
59
|
+
engine: "claude" | "ollama";
|
|
60
|
+
}, {
|
|
61
|
+
model?: string | null | undefined;
|
|
62
|
+
engine?: "claude" | "ollama" | undefined;
|
|
63
|
+
}>>;
|
|
64
|
+
}, "strip", z.ZodTypeAny, {
|
|
65
|
+
enabled: boolean;
|
|
66
|
+
paths: {
|
|
67
|
+
tasks: string;
|
|
68
|
+
root: string;
|
|
69
|
+
kanban: string;
|
|
70
|
+
sources: string;
|
|
71
|
+
wiki: string;
|
|
72
|
+
sessions: string;
|
|
73
|
+
};
|
|
74
|
+
precompact: {
|
|
75
|
+
model: string | null;
|
|
76
|
+
engine: "claude" | "ollama";
|
|
77
|
+
};
|
|
78
|
+
sync: {
|
|
79
|
+
tasks: boolean;
|
|
80
|
+
kanban: boolean;
|
|
81
|
+
context_dump: boolean;
|
|
82
|
+
wiki_refresh: boolean;
|
|
83
|
+
journal: boolean;
|
|
84
|
+
precompact: boolean;
|
|
85
|
+
};
|
|
86
|
+
vault_path?: string | undefined;
|
|
87
|
+
vault_name?: string | undefined;
|
|
88
|
+
}, {
|
|
89
|
+
enabled?: boolean | undefined;
|
|
90
|
+
vault_path?: string | undefined;
|
|
91
|
+
vault_name?: string | undefined;
|
|
92
|
+
paths?: {
|
|
93
|
+
tasks?: string | undefined;
|
|
94
|
+
root?: string | undefined;
|
|
95
|
+
kanban?: string | undefined;
|
|
96
|
+
sources?: string | undefined;
|
|
97
|
+
wiki?: string | undefined;
|
|
98
|
+
sessions?: string | undefined;
|
|
99
|
+
} | undefined;
|
|
100
|
+
precompact?: {
|
|
101
|
+
model?: string | null | undefined;
|
|
102
|
+
engine?: "claude" | "ollama" | undefined;
|
|
103
|
+
} | undefined;
|
|
104
|
+
sync?: {
|
|
105
|
+
tasks?: boolean | undefined;
|
|
106
|
+
kanban?: boolean | undefined;
|
|
107
|
+
context_dump?: boolean | undefined;
|
|
108
|
+
wiki_refresh?: boolean | undefined;
|
|
109
|
+
journal?: boolean | undefined;
|
|
110
|
+
precompact?: boolean | undefined;
|
|
111
|
+
} | undefined;
|
|
112
|
+
}>;
|
|
113
|
+
export type ObsidianVaultConfig = z.infer<typeof ObsidianVaultConfigSchema>;
|
|
114
|
+
/**
|
|
115
|
+
* Resolved config with an absolute vault_path guaranteed present.
|
|
116
|
+
* Only returned when the integration is fully enabled and the vault path resolves.
|
|
117
|
+
*/
|
|
118
|
+
export interface ResolvedObsidianConfig {
|
|
119
|
+
vault_path: string;
|
|
120
|
+
vault_name?: string;
|
|
121
|
+
paths: ObsidianVaultConfig['paths'];
|
|
122
|
+
sync: ObsidianVaultConfig['sync'];
|
|
123
|
+
precompact: ObsidianVaultConfig['precompact'];
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Load obsidian_vault config from .reagent/gateway.yaml.
|
|
127
|
+
*
|
|
128
|
+
* Resolution order for vault_path:
|
|
129
|
+
* 1. REAGENT_OBSIDIAN_VAULT env var (absolute path to vault root)
|
|
130
|
+
* 2. obsidian_vault.vault_path from gateway.yaml
|
|
131
|
+
* 3. null → disabled
|
|
132
|
+
*
|
|
133
|
+
* Returns null if:
|
|
134
|
+
* - No obsidian_vault block in gateway.yaml
|
|
135
|
+
* - enabled: false
|
|
136
|
+
* - No vault path resolvable
|
|
137
|
+
* - Vault directory does not exist
|
|
138
|
+
*
|
|
139
|
+
* Never throws — fail-silent like Discord notifier.
|
|
140
|
+
*/
|
|
141
|
+
export declare function loadObsidianConfig(baseDir: string): ResolvedObsidianConfig | null;
|
|
142
|
+
//# sourceMappingURL=vault-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-config.d.ts","sourceRoot":"","sources":["../../src/obsidian/vault-config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;GAGG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8BpC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAClC,UAAU,EAAE,mBAAmB,CAAC,YAAY,CAAC,CAAC;CAC/C;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,sBAAsB,GAAG,IAAI,CAoCjF"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { parse as parseYaml } from 'yaml';
|
|
5
|
+
/**
|
|
6
|
+
* Zod schema for the obsidian_vault block in gateway.yaml.
|
|
7
|
+
* Every sync target defaults to false — fully opt-in.
|
|
8
|
+
*/
|
|
9
|
+
export const ObsidianVaultConfigSchema = z.object({
|
|
10
|
+
enabled: z.boolean().default(false),
|
|
11
|
+
vault_path: z.string().optional(),
|
|
12
|
+
vault_name: z.string().optional(),
|
|
13
|
+
paths: z
|
|
14
|
+
.object({
|
|
15
|
+
root: z.string().default('Projects/Reagent'),
|
|
16
|
+
kanban: z.string().default('Projects/Reagent/Kanban.md'),
|
|
17
|
+
sources: z.string().default('Projects/Reagent/Sources'),
|
|
18
|
+
wiki: z.string().default('Projects/Reagent/Auto'),
|
|
19
|
+
tasks: z.string().default('Tasks'),
|
|
20
|
+
sessions: z.string().default('Wiki/Sessions'),
|
|
21
|
+
})
|
|
22
|
+
.default({}),
|
|
23
|
+
sync: z
|
|
24
|
+
.object({
|
|
25
|
+
kanban: z.boolean().default(false),
|
|
26
|
+
context_dump: z.boolean().default(false),
|
|
27
|
+
wiki_refresh: z.boolean().default(false),
|
|
28
|
+
journal: z.boolean().default(true),
|
|
29
|
+
precompact: z.boolean().default(false),
|
|
30
|
+
tasks: z.boolean().default(true),
|
|
31
|
+
})
|
|
32
|
+
.default({}),
|
|
33
|
+
precompact: z
|
|
34
|
+
.object({
|
|
35
|
+
engine: z.enum(['claude', 'ollama']).default('claude'),
|
|
36
|
+
model: z.string().nullable().default(null),
|
|
37
|
+
})
|
|
38
|
+
.default({}),
|
|
39
|
+
});
|
|
40
|
+
/**
|
|
41
|
+
* Load obsidian_vault config from .reagent/gateway.yaml.
|
|
42
|
+
*
|
|
43
|
+
* Resolution order for vault_path:
|
|
44
|
+
* 1. REAGENT_OBSIDIAN_VAULT env var (absolute path to vault root)
|
|
45
|
+
* 2. obsidian_vault.vault_path from gateway.yaml
|
|
46
|
+
* 3. null → disabled
|
|
47
|
+
*
|
|
48
|
+
* Returns null if:
|
|
49
|
+
* - No obsidian_vault block in gateway.yaml
|
|
50
|
+
* - enabled: false
|
|
51
|
+
* - No vault path resolvable
|
|
52
|
+
* - Vault directory does not exist
|
|
53
|
+
*
|
|
54
|
+
* Never throws — fail-silent like Discord notifier.
|
|
55
|
+
*/
|
|
56
|
+
export function loadObsidianConfig(baseDir) {
|
|
57
|
+
const gatewayPath = path.join(baseDir, '.reagent', 'gateway.yaml');
|
|
58
|
+
if (!fs.existsSync(gatewayPath))
|
|
59
|
+
return null;
|
|
60
|
+
try {
|
|
61
|
+
const raw = fs.readFileSync(gatewayPath, 'utf8');
|
|
62
|
+
const parsed = parseYaml(raw);
|
|
63
|
+
const obsidianRaw = parsed?.obsidian_vault;
|
|
64
|
+
if (!obsidianRaw)
|
|
65
|
+
return null;
|
|
66
|
+
const config = ObsidianVaultConfigSchema.parse(obsidianRaw);
|
|
67
|
+
if (!config.enabled)
|
|
68
|
+
return null;
|
|
69
|
+
// Resolve vault path: env var takes precedence
|
|
70
|
+
const vaultPath = process.env['REAGENT_OBSIDIAN_VAULT'] || config.vault_path;
|
|
71
|
+
if (!vaultPath)
|
|
72
|
+
return null;
|
|
73
|
+
// Resolve ~ to home directory
|
|
74
|
+
const resolvedPath = vaultPath.startsWith('~')
|
|
75
|
+
? path.join(process.env['HOME'] || '', vaultPath.slice(1))
|
|
76
|
+
: vaultPath;
|
|
77
|
+
// Vault directory must exist
|
|
78
|
+
if (!fs.existsSync(resolvedPath))
|
|
79
|
+
return null;
|
|
80
|
+
return {
|
|
81
|
+
vault_path: resolvedPath,
|
|
82
|
+
vault_name: config.vault_name,
|
|
83
|
+
paths: config.paths,
|
|
84
|
+
sync: config.sync,
|
|
85
|
+
precompact: config.precompact,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=vault-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-config.js","sourceRoot":"","sources":["../../src/obsidian/vault-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { type ResolvedObsidianConfig } from './vault-config.js';
|
|
2
|
+
export interface SyncResult {
|
|
3
|
+
target: string;
|
|
4
|
+
written: boolean;
|
|
5
|
+
path?: string;
|
|
6
|
+
error?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Obsidian vault writer — writes markdown files directly to the vault.
|
|
10
|
+
* Obsidian auto-refreshes via filesystem watcher.
|
|
11
|
+
*
|
|
12
|
+
* All methods return silently when not configured.
|
|
13
|
+
* Pattern: DiscordNotifier (fail-silent, config-gated).
|
|
14
|
+
*/
|
|
15
|
+
export declare class VaultWriter {
|
|
16
|
+
private readonly config;
|
|
17
|
+
private readonly store;
|
|
18
|
+
constructor(baseDir: string);
|
|
19
|
+
/**
|
|
20
|
+
* Check whether Obsidian vault sync is enabled.
|
|
21
|
+
*/
|
|
22
|
+
isEnabled(): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Get resolved config for status display. Returns null if not configured.
|
|
25
|
+
*/
|
|
26
|
+
getConfig(): ResolvedObsidianConfig | null;
|
|
27
|
+
/**
|
|
28
|
+
* Sync the Kanban board to the vault.
|
|
29
|
+
* Writes only if sync.kanban is enabled.
|
|
30
|
+
*/
|
|
31
|
+
syncKanban(dryRun?: boolean): SyncResult;
|
|
32
|
+
/**
|
|
33
|
+
* Sync context dump to the vault.
|
|
34
|
+
* Placeholder for Phase 3.
|
|
35
|
+
*/
|
|
36
|
+
syncContextDump(dryRun?: boolean): SyncResult;
|
|
37
|
+
/**
|
|
38
|
+
* Sync wiki pages to the vault.
|
|
39
|
+
* Placeholder for Phase 4.
|
|
40
|
+
*/
|
|
41
|
+
syncWiki(dryRun?: boolean): SyncResult;
|
|
42
|
+
/**
|
|
43
|
+
* Sync tasks as individual Obsidian notes via the CLI.
|
|
44
|
+
* Writes only if sync.tasks is enabled and the Obsidian CLI is available.
|
|
45
|
+
*/
|
|
46
|
+
syncTasks(dryRun?: boolean): SyncResult;
|
|
47
|
+
/**
|
|
48
|
+
* Sync all enabled targets.
|
|
49
|
+
*/
|
|
50
|
+
syncAll(dryRun?: boolean): SyncResult[];
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=vault-writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-writer.d.ts","sourceRoot":"","sources":["../../src/obsidian/vault-writer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAsB,KAAK,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAKpF,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgC;IACvD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;gBAEtB,OAAO,EAAE,MAAM;IAK3B;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,SAAS,IAAI,sBAAsB,GAAG,IAAI;IAI1C;;;OAGG;IACH,UAAU,CAAC,MAAM,UAAQ,GAAG,UAAU;IAyBtC;;;OAGG;IACH,eAAe,CAAC,MAAM,UAAQ,GAAG,UAAU;IAiB3C;;;OAGG;IACH,QAAQ,CAAC,MAAM,UAAQ,GAAG,UAAU;IAapC;;;OAGG;IACH,SAAS,CAAC,MAAM,UAAQ,GAAG,UAAU;IA+DrC;;OAEG;IACH,OAAO,CAAC,MAAM,UAAQ,GAAG,UAAU,EAAE;CAQtC"}
|