@bookedsolid/reagent 0.14.0 → 0.14.3

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 (59) hide show
  1. package/README.md +147 -1
  2. package/dist/cli/commands/init/index.d.ts.map +1 -1
  3. package/dist/cli/commands/init/index.js +8 -1
  4. package/dist/cli/commands/init/index.js.map +1 -1
  5. package/dist/cli/commands/init/mcp-config.d.ts.map +1 -1
  6. package/dist/cli/commands/init/mcp-config.js +27 -17
  7. package/dist/cli/commands/init/mcp-config.js.map +1 -1
  8. package/dist/cli/commands/init/obsidian.d.ts +16 -0
  9. package/dist/cli/commands/init/obsidian.d.ts.map +1 -0
  10. package/dist/cli/commands/init/obsidian.js +95 -0
  11. package/dist/cli/commands/init/obsidian.js.map +1 -0
  12. package/dist/cli/commands/init/policy.d.ts.map +1 -1
  13. package/dist/cli/commands/init/policy.js +10 -1
  14. package/dist/cli/commands/init/policy.js.map +1 -1
  15. package/dist/cli/commands/obsidian.d.ts +2 -0
  16. package/dist/cli/commands/obsidian.d.ts.map +1 -0
  17. package/dist/cli/commands/obsidian.js +187 -0
  18. package/dist/cli/commands/obsidian.js.map +1 -0
  19. package/dist/cli/commands/upgrade-policy.d.ts +17 -0
  20. package/dist/cli/commands/upgrade-policy.d.ts.map +1 -0
  21. package/dist/cli/commands/upgrade-policy.js +123 -0
  22. package/dist/cli/commands/upgrade-policy.js.map +1 -0
  23. package/dist/cli/commands/upgrade.d.ts.map +1 -1
  24. package/dist/cli/commands/upgrade.js +56 -25
  25. package/dist/cli/commands/upgrade.js.map +1 -1
  26. package/dist/cli/index.js +9 -0
  27. package/dist/cli/index.js.map +1 -1
  28. package/dist/gateway/native-tools.d.ts.map +1 -1
  29. package/dist/gateway/native-tools.js +39 -0
  30. package/dist/gateway/native-tools.js.map +1 -1
  31. package/dist/obsidian/cli.d.ts +49 -0
  32. package/dist/obsidian/cli.d.ts.map +1 -0
  33. package/dist/obsidian/cli.js +128 -0
  34. package/dist/obsidian/cli.js.map +1 -0
  35. package/dist/obsidian/index.d.ts +7 -0
  36. package/dist/obsidian/index.d.ts.map +1 -0
  37. package/dist/obsidian/index.js +5 -0
  38. package/dist/obsidian/index.js.map +1 -0
  39. package/dist/obsidian/kanban-generator.d.ts +9 -0
  40. package/dist/obsidian/kanban-generator.d.ts.map +1 -0
  41. package/dist/obsidian/kanban-generator.js +63 -0
  42. package/dist/obsidian/kanban-generator.js.map +1 -0
  43. package/dist/obsidian/vault-config.d.ts +142 -0
  44. package/dist/obsidian/vault-config.d.ts.map +1 -0
  45. package/dist/obsidian/vault-config.js +92 -0
  46. package/dist/obsidian/vault-config.js.map +1 -0
  47. package/dist/obsidian/vault-writer.d.ts +52 -0
  48. package/dist/obsidian/vault-writer.d.ts.map +1 -0
  49. package/dist/obsidian/vault-writer.js +166 -0
  50. package/dist/obsidian/vault-writer.js.map +1 -0
  51. package/dist/types/policy.d.ts +4 -0
  52. package/dist/types/policy.d.ts.map +1 -1
  53. package/hooks/dangerous-bash-interceptor.sh +43 -0
  54. package/hooks/reagent-obsidian-journal.sh +69 -0
  55. package/hooks/reagent-obsidian-precompact.sh +88 -0
  56. package/hooks/reagent-obsidian-tasks.sh +126 -0
  57. package/package.json +1 -1
  58. package/profiles/bst-internal.json +1 -1
  59. package/profiles/client-engagement.json +1 -1
@@ -0,0 +1,187 @@
1
+ import { VaultWriter } from '../../obsidian/vault-writer.js';
2
+ import { ObsidianCli } from '../../obsidian/cli.js';
3
+ import { parseFlag } from '../utils.js';
4
+ const VALID_TARGETS = ['kanban', 'context', 'wiki', 'tasks'];
5
+ export function runObsidian(args) {
6
+ const subcommand = args[0];
7
+ if (!subcommand || subcommand === 'help' || subcommand === '--help') {
8
+ printObsidianHelp();
9
+ return;
10
+ }
11
+ switch (subcommand) {
12
+ case 'sync':
13
+ runObsidianSync(args.slice(1));
14
+ break;
15
+ case 'status':
16
+ runObsidianStatus();
17
+ break;
18
+ case 'health':
19
+ runObsidianHealth();
20
+ break;
21
+ case 'journal':
22
+ runObsidianJournal();
23
+ break;
24
+ default:
25
+ console.error(`Unknown obsidian subcommand: ${subcommand}`);
26
+ printObsidianHelp();
27
+ process.exit(1);
28
+ }
29
+ }
30
+ function runObsidianSync(args) {
31
+ const dryRun = args.includes('--dry-run');
32
+ const targetFlag = parseFlag(args, '--target');
33
+ if (targetFlag && !VALID_TARGETS.includes(targetFlag)) {
34
+ console.error(`Invalid sync target: ${targetFlag}`);
35
+ console.error(`Valid targets: ${VALID_TARGETS.join(', ')}`);
36
+ process.exit(1);
37
+ }
38
+ const writer = new VaultWriter(process.cwd());
39
+ if (!writer.isEnabled()) {
40
+ console.log('Obsidian vault integration is not configured or disabled.');
41
+ console.log('');
42
+ console.log('To enable:');
43
+ console.log(' 1. Set REAGENT_OBSIDIAN_VAULT env var to your vault path');
44
+ console.log(' 2. Run: reagent init --obsidian');
45
+ console.log(' 3. Set obsidian_vault.enabled: true in .reagent/gateway.yaml');
46
+ return;
47
+ }
48
+ if (dryRun) {
49
+ console.log('Dry run — no files will be written.\n');
50
+ }
51
+ if (targetFlag) {
52
+ const result = targetFlag === 'kanban'
53
+ ? writer.syncKanban(dryRun)
54
+ : targetFlag === 'context'
55
+ ? writer.syncContextDump(dryRun)
56
+ : targetFlag === 'wiki'
57
+ ? writer.syncWiki(dryRun)
58
+ : writer.syncTasks(dryRun);
59
+ printSyncResult(result);
60
+ }
61
+ else {
62
+ const results = writer.syncAll(dryRun);
63
+ for (const result of results) {
64
+ printSyncResult(result);
65
+ }
66
+ }
67
+ }
68
+ function runObsidianStatus() {
69
+ const writer = new VaultWriter(process.cwd());
70
+ const config = writer.getConfig();
71
+ if (!config) {
72
+ console.log('Obsidian vault: not configured');
73
+ return;
74
+ }
75
+ console.log('Obsidian vault: enabled');
76
+ console.log(` Vault path: ${config.vault_path}`);
77
+ if (config.vault_name) {
78
+ console.log(` Vault name: ${config.vault_name}`);
79
+ }
80
+ // CLI availability
81
+ const cliAvailable = ObsidianCli.isAvailable();
82
+ console.log(` Obsidian CLI: ${cliAvailable ? 'available' : 'not found'}`);
83
+ console.log(' Paths:');
84
+ console.log(` root: ${config.paths.root}`);
85
+ console.log(` kanban: ${config.paths.kanban}`);
86
+ console.log(` sources: ${config.paths.sources}`);
87
+ console.log(` wiki: ${config.paths.wiki}`);
88
+ console.log(` tasks: ${config.paths.tasks}`);
89
+ console.log(` sessions: ${config.paths.sessions}`);
90
+ console.log(' Sync targets:');
91
+ console.log(` kanban: ${config.sync.kanban ? 'enabled' : 'disabled'}`);
92
+ console.log(` context_dump: ${config.sync.context_dump ? 'enabled' : 'disabled'}`);
93
+ console.log(` wiki_refresh: ${config.sync.wiki_refresh ? 'enabled' : 'disabled'}`);
94
+ console.log(` journal: ${config.sync.journal ? 'enabled' : 'disabled'}`);
95
+ console.log(` precompact: ${config.sync.precompact ? 'enabled' : 'disabled'}`);
96
+ console.log(` tasks: ${config.sync.tasks ? 'enabled' : 'disabled'}`);
97
+ }
98
+ function runObsidianHealth() {
99
+ const writer = new VaultWriter(process.cwd());
100
+ const config = writer.getConfig();
101
+ if (!config) {
102
+ console.log('Obsidian vault: not configured');
103
+ return;
104
+ }
105
+ if (!ObsidianCli.isAvailable()) {
106
+ console.log('Obsidian CLI not found at /usr/local/bin/obsidian');
107
+ return;
108
+ }
109
+ if (!config.vault_name) {
110
+ console.log('vault_name not set in gateway.yaml — required for CLI commands');
111
+ return;
112
+ }
113
+ const cli = new ObsidianCli(config.vault_name);
114
+ const health = cli.vaultHealth();
115
+ if (!health) {
116
+ console.log('Failed to get vault health metrics');
117
+ return;
118
+ }
119
+ console.log(`Vault health — ${config.vault_name}:`);
120
+ console.log(` Orphans: ${health.orphans}`);
121
+ console.log(` Unresolved: ${health.unresolved}`);
122
+ console.log(` Dead ends: ${health.deadends}`);
123
+ }
124
+ function runObsidianJournal() {
125
+ const writer = new VaultWriter(process.cwd());
126
+ const config = writer.getConfig();
127
+ if (!config) {
128
+ console.log('Obsidian vault: not configured');
129
+ return;
130
+ }
131
+ if (!ObsidianCli.isAvailable()) {
132
+ console.log('Obsidian CLI not found at /usr/local/bin/obsidian');
133
+ return;
134
+ }
135
+ if (!config.vault_name) {
136
+ console.log('vault_name not set in gateway.yaml — required for CLI commands');
137
+ return;
138
+ }
139
+ if (!config.sync.journal) {
140
+ console.log('Journal sync not enabled in gateway.yaml');
141
+ return;
142
+ }
143
+ const cli = new ObsidianCli(config.vault_name);
144
+ const projectName = process.cwd().split('/').pop() || 'unknown';
145
+ const timestamp = new Date().toISOString().replace('T', ' ').slice(0, 16);
146
+ const content = `### ${projectName} — Manual journal entry (${timestamp})\n\n- Triggered via \`reagent obsidian journal\`\n\n---\n`;
147
+ const success = cli.dailyAppend(content);
148
+ if (success) {
149
+ console.log('Session journal entry appended to daily note');
150
+ }
151
+ else {
152
+ console.log('Failed to append journal entry');
153
+ }
154
+ }
155
+ function printSyncResult(result) {
156
+ if (result.written) {
157
+ console.log(` [synced] ${result.target} → ${result.path}`);
158
+ }
159
+ else if (result.error) {
160
+ console.log(` [skip] ${result.target}: ${result.error}`);
161
+ }
162
+ else {
163
+ console.log(` [skip] ${result.target}: not configured`);
164
+ }
165
+ }
166
+ function printObsidianHelp() {
167
+ console.log(`
168
+ reagent obsidian — Obsidian vault integration
169
+
170
+ Usage:
171
+ reagent obsidian sync [--target kanban|context|wiki|tasks] [--dry-run]
172
+ reagent obsidian status
173
+ reagent obsidian health
174
+ reagent obsidian journal
175
+
176
+ Commands:
177
+ sync Sync enabled targets to the Obsidian vault
178
+ status Show current Obsidian configuration and CLI availability
179
+ health Show vault health metrics (orphans, unresolved links, dead ends)
180
+ journal Manually trigger a session journal entry in the daily note
181
+
182
+ Options:
183
+ --target <name> Sync a specific target only (kanban, context, wiki, tasks)
184
+ --dry-run Preview what would be written without writing files
185
+ `);
186
+ }
187
+ //# sourceMappingURL=obsidian.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obsidian.js","sourceRoot":"","sources":["../../../src/cli/commands/obsidian.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { InstallResult } from './init/types.js';
2
+ /**
3
+ * YAML-aware policy merge for `reagent upgrade`.
4
+ *
5
+ * Uses the `yaml` package's `parseDocument` API to preserve
6
+ * comments, ordering, and existing user customizations.
7
+ *
8
+ * Behavior:
9
+ * 1. Parse existing policy.yaml as a YAML Document
10
+ * 2. Add missing top-level sections (shallow merge — never overwrites existing)
11
+ * 3. Update `installed_by` version stamp
12
+ * 4. If `cleanBlockedPaths`: replace `.reagent/` with granular entries
13
+ */
14
+ export declare function mergePolicy(targetDir: string, pkgVersion: string, dryRun: boolean, options?: {
15
+ cleanBlockedPaths?: boolean;
16
+ }): InstallResult[];
17
+ //# sourceMappingURL=upgrade-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade-policy.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/upgrade-policy.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAkBrD;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CACzB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,OAAO,EACf,OAAO,CAAC,EAAE;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAE,GACxC,aAAa,EAAE,CAsGjB"}
@@ -0,0 +1,123 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { parseDocument } from 'yaml';
4
+ /**
5
+ * Canonical sections that should exist in every policy.yaml.
6
+ * mergePolicy adds these if missing — never overwrites existing values.
7
+ */
8
+ const CANONICAL_SECTIONS = {
9
+ context_protection: {
10
+ delegate_to_subagent: ['pnpm run preflight', 'pnpm run test', 'pnpm run build'],
11
+ max_bash_output_lines: 100,
12
+ },
13
+ };
14
+ /**
15
+ * Granular blocked_paths that replace the blanket `.reagent/` entry.
16
+ */
17
+ const GRANULAR_BLOCKED_PATHS = ['.reagent/policy.yaml', '.reagent/HALT'];
18
+ /**
19
+ * YAML-aware policy merge for `reagent upgrade`.
20
+ *
21
+ * Uses the `yaml` package's `parseDocument` API to preserve
22
+ * comments, ordering, and existing user customizations.
23
+ *
24
+ * Behavior:
25
+ * 1. Parse existing policy.yaml as a YAML Document
26
+ * 2. Add missing top-level sections (shallow merge — never overwrites existing)
27
+ * 3. Update `installed_by` version stamp
28
+ * 4. If `cleanBlockedPaths`: replace `.reagent/` with granular entries
29
+ */
30
+ export function mergePolicy(targetDir, pkgVersion, dryRun, options) {
31
+ const policyPath = path.join(targetDir, '.reagent', 'policy.yaml');
32
+ const results = [];
33
+ if (!fs.existsSync(policyPath)) {
34
+ results.push({ file: '.reagent/policy.yaml', status: 'warn' });
35
+ console.warn(' Warning: .reagent/policy.yaml not found. Run `reagent init` to create it.');
36
+ return results;
37
+ }
38
+ const raw = fs.readFileSync(policyPath, 'utf8');
39
+ const doc = parseDocument(raw);
40
+ // Guard: empty or malformed YAML (no mapping node)
41
+ if (!doc.contents) {
42
+ results.push({ file: '.reagent/policy.yaml', status: 'warn' });
43
+ console.warn(' Warning: .reagent/policy.yaml is empty or malformed. Run `reagent init` to recreate.');
44
+ return results;
45
+ }
46
+ let changed = false;
47
+ // 1. Update installed_by version stamp
48
+ const currentVersion = doc.get('installed_by');
49
+ const newVersion = `reagent@${pkgVersion}`;
50
+ if (currentVersion !== newVersion) {
51
+ doc.set('installed_by', newVersion);
52
+ changed = true;
53
+ }
54
+ // 2. Add missing canonical sections (shallow — never overwrite existing)
55
+ for (const [key, value] of Object.entries(CANONICAL_SECTIONS)) {
56
+ if (!doc.has(key)) {
57
+ doc.set(key, value);
58
+ changed = true;
59
+ results.push({
60
+ file: `.reagent/policy.yaml (added ${key} section)`,
61
+ status: 'installed',
62
+ });
63
+ }
64
+ }
65
+ // 3. Clean blocked_paths if requested
66
+ if (options?.cleanBlockedPaths) {
67
+ // doc.get() on a parseDocument returns YAML AST nodes, not plain arrays.
68
+ // Use toJSON() to resolve to plain JS values for manipulation.
69
+ const blockedNode = doc.get('blocked_paths');
70
+ if (blockedNode != null) {
71
+ const values = typeof blockedNode.toJSON === 'function'
72
+ ? blockedNode.toJSON()
73
+ : Array.isArray(blockedNode)
74
+ ? blockedNode
75
+ : [];
76
+ if (Array.isArray(values)) {
77
+ const hasReagentBlanket = values.some((v) => v === '.reagent/' || v === '.reagent');
78
+ if (hasReagentBlanket) {
79
+ const cleaned = values.filter((v) => v !== '.reagent/' && v !== '.reagent');
80
+ for (const granular of GRANULAR_BLOCKED_PATHS) {
81
+ if (!cleaned.includes(granular)) {
82
+ cleaned.push(granular);
83
+ }
84
+ }
85
+ doc.set('blocked_paths', cleaned);
86
+ changed = true;
87
+ results.push({
88
+ file: '.reagent/policy.yaml (blocked_paths: .reagent/ → granular)',
89
+ status: 'updated',
90
+ });
91
+ }
92
+ }
93
+ }
94
+ }
95
+ // 4. Write or report
96
+ if (changed) {
97
+ if (!dryRun) {
98
+ try {
99
+ fs.writeFileSync(policyPath, doc.toString(), 'utf8');
100
+ }
101
+ catch {
102
+ results.push({ file: '.reagent/policy.yaml', status: 'warn' });
103
+ console.warn(' Warning: .reagent/policy.yaml has YAML errors and cannot be updated.');
104
+ return results;
105
+ }
106
+ results.push({
107
+ file: '.reagent/policy.yaml (installed_by updated)',
108
+ status: 'updated',
109
+ });
110
+ }
111
+ else {
112
+ results.push({
113
+ file: '.reagent/policy.yaml (installed_by would be updated)',
114
+ status: 'updated',
115
+ });
116
+ }
117
+ }
118
+ else {
119
+ results.push({ file: '.reagent/policy.yaml', status: 'skipped' });
120
+ }
121
+ return results;
122
+ }
123
+ //# sourceMappingURL=upgrade-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade-policy.js","sourceRoot":"","sources":["../../../src/cli/commands/upgrade-policy.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/upgrade.ts"],"names":[],"mappings":"AAaA,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA0E/C"}
1
+ {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/upgrade.ts"],"names":[],"mappings":"AAcA,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA2D/C"}
@@ -2,6 +2,7 @@ import fs from 'node:fs';
2
2
  import path from 'node:path';
3
3
  import { PKG_ROOT, getPkgVersion } from '../utils.js';
4
4
  import { installHuskyHook } from './init/husky-hooks.js';
5
+ import { mergePolicy } from './upgrade-policy.js';
5
6
  // All hook names managed by reagent, mapped to their source file names
6
7
  const HOOK_MAP = [
7
8
  { hookName: 'commit-msg', srcFileName: 'commit-msg.sh' },
@@ -11,6 +12,7 @@ const HOOK_MAP = [
11
12
  export function runUpgrade(args) {
12
13
  const targetDir = process.cwd();
13
14
  const dryRun = args.includes('--dry-run');
15
+ const cleanBlockedPaths = args.includes('--clean-blocked-paths');
14
16
  const PKG_VERSION = getPkgVersion();
15
17
  console.log(`\n@bookedsolid/reagent v${PKG_VERSION} upgrade`);
16
18
  console.log(` Target: ${targetDir}`);
@@ -42,33 +44,62 @@ export function runUpgrade(args) {
42
44
  const hookResults = installHuskyHook(targetDir, hookName, srcFileName, dryRun);
43
45
  results.push(...hookResults);
44
46
  }
45
- // Step 2: Update installed_by in .reagent/policy.yaml to reflect current version.
46
- // Only touches the installed_by line — all other user config is preserved.
47
- const policyPath = path.join(targetDir, '.reagent', 'policy.yaml');
48
- if (!fs.existsSync(policyPath)) {
49
- results.push({ file: '.reagent/policy.yaml', status: 'warn' });
50
- console.warn(' Warning: .reagent/policy.yaml not found. Run `reagent init` to create it.');
47
+ // Step 2: YAML-aware policy merge updates version stamp, adds missing
48
+ // canonical sections, and optionally cleans blocked_paths.
49
+ const policyResults = mergePolicy(targetDir, PKG_VERSION, dryRun, {
50
+ cleanBlockedPaths,
51
+ });
52
+ results.push(...policyResults);
53
+ // Step 3: Fix .mcp.json if it uses the broken npx pattern.
54
+ // pnpm projects don't get node_modules/.bin/reagent, so npx fails.
55
+ // Migrate to the direct node path which works across all package managers.
56
+ const mcpResults = upgradeMcpJson(targetDir, dryRun);
57
+ results.push(...mcpResults);
58
+ printSummary(results, dryRun);
59
+ }
60
+ /**
61
+ * Fix .mcp.json if it uses the broken npx pattern.
62
+ * Migrates to `node node_modules/@bookedsolid/reagent/dist/cli/index.js serve`
63
+ * which works across npm, yarn, pnpm, and bun.
64
+ */
65
+ function upgradeMcpJson(targetDir, dryRun) {
66
+ const mcpPath = path.join(targetDir, '.mcp.json');
67
+ if (!fs.existsSync(mcpPath)) {
68
+ return [];
51
69
  }
52
- else {
53
- const policyContent = fs.readFileSync(policyPath, 'utf8');
54
- const updatedContent = policyContent.replace(/^installed_by:\s*['"]?reagent@[^'">\n]+['"]?/m, `installed_by: 'reagent@${PKG_VERSION}'`);
55
- if (updatedContent === policyContent) {
56
- // Line didn't match the expected pattern — still show as skipped, don't corrupt the file
57
- results.push({ file: '.reagent/policy.yaml', status: 'skipped' });
58
- }
59
- else if (!dryRun) {
60
- fs.writeFileSync(policyPath, updatedContent, 'utf8');
61
- results.push({ file: '.reagent/policy.yaml (installed_by updated)', status: 'updated' });
62
- }
63
- else {
64
- // dry-run: report what would change
65
- results.push({
66
- file: '.reagent/policy.yaml (installed_by would be updated)',
67
- status: 'updated',
68
- });
69
- }
70
+ let config;
71
+ try {
72
+ config = JSON.parse(fs.readFileSync(mcpPath, 'utf8'));
70
73
  }
71
- printSummary(results, dryRun);
74
+ catch {
75
+ return [{ file: '.mcp.json', status: 'warn' }];
76
+ }
77
+ const entry = config.mcpServers?.reagent;
78
+ if (!entry)
79
+ return [];
80
+ // Check if it's using the broken npx pattern
81
+ const isNpx = entry.command === 'npx' &&
82
+ Array.isArray(entry.args) &&
83
+ entry.args.some((a) => a === 'reagent' || a === '@bookedsolid/reagent');
84
+ if (!isNpx)
85
+ return [{ file: '.mcp.json', status: 'skipped' }];
86
+ // Check if the local dist CLI exists
87
+ const localCli = path.join(targetDir, 'node_modules', '@bookedsolid', 'reagent', 'dist', 'cli', 'index.js');
88
+ if (!fs.existsSync(localCli)) {
89
+ return [{ file: '.mcp.json', status: 'skipped' }];
90
+ }
91
+ // Migrate to node direct path
92
+ entry.command = 'node';
93
+ entry.args = ['node_modules/@bookedsolid/reagent/dist/cli/index.js', 'serve'];
94
+ if (!dryRun) {
95
+ fs.writeFileSync(mcpPath, JSON.stringify(config, null, 2) + '\n');
96
+ }
97
+ return [
98
+ {
99
+ file: '.mcp.json (migrated npx → node for pnpm compatibility)',
100
+ status: 'updated',
101
+ },
102
+ ];
72
103
  }
73
104
  function printSummary(results, dryRun) {
74
105
  console.log('');
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../../src/cli/commands/upgrade.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../../src/cli/commands/upgrade.ts"],"names":[],"mappings":"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"}
package/dist/cli/index.js CHANGED
@@ -8,6 +8,7 @@ import { runServe } from './commands/serve.js';
8
8
  import { runCache } from './commands/cache.js';
9
9
  import { runCatalyze } from './commands/catalyze/index.js';
10
10
  import { runUpgrade } from './commands/upgrade.js';
11
+ import { runObsidian } from './commands/obsidian.js';
11
12
  const [, , cmd, ...rest] = process.argv;
12
13
  if (!cmd || cmd === 'help' || cmd === '--help' || cmd === '-h') {
13
14
  printHelp();
@@ -38,6 +39,9 @@ switch (cmd) {
38
39
  case 'upgrade':
39
40
  runUpgrade(rest);
40
41
  break;
42
+ case 'obsidian':
43
+ runObsidian(rest);
44
+ break;
41
45
  default:
42
46
  console.error(`\nUnknown command: ${cmd}`);
43
47
  printHelp();
@@ -60,6 +64,8 @@ Commands:
60
64
  serve Start the MCP server (stdio transport — called by Claude Code via .mcp.json)
61
65
  cache Manage review cache (check, set, clear)
62
66
  upgrade Re-sync installed hooks and update policy.yaml version stamp
67
+ Options: --dry-run, --clean-blocked-paths
68
+ obsidian Sync project state to an Obsidian vault (opt-in)
63
69
  help Show this help
64
70
 
65
71
  Options for init:
@@ -71,6 +77,8 @@ Options for init:
71
77
  --tasks-channel Discord channel ID for task events
72
78
  --releases-channel Discord channel ID for release events
73
79
  --dev-channel Discord channel ID for dev activity
80
+ --obsidian Configure Obsidian vault integration in gateway.yaml
81
+ --vault-path <path> Obsidian vault path (used with --obsidian)
74
82
 
75
83
  Options for catalyze [targetDir]:
76
84
  --plan Analyze stack and generate report (default)
@@ -104,6 +112,7 @@ Examples:
104
112
  npx @bookedsolid/reagent serve
105
113
  npx @bookedsolid/reagent upgrade
106
114
  npx @bookedsolid/reagent upgrade --dry-run
115
+ npx @bookedsolid/reagent upgrade --clean-blocked-paths
107
116
  `);
108
117
  }
109
118
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,MAAM,CAAC,EAAE,AAAD,EAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;AAExC,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;IAC/D,SAAS,EAAE,CAAC;IACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,QAAQ,GAAG,EAAE,CAAC;IACZ,KAAK,MAAM;QACT,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,MAAM;IACR,KAAK,OAAO;QACV,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,MAAM;IACR,KAAK,QAAQ;QACX,SAAS,CAAC,IAAI,CAAC,CAAC;QAChB,MAAM;IACR,KAAK,UAAU;QACb,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM;IACR,KAAK,OAAO;QACV,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM;IACR,KAAK,OAAO;QACV,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,MAAM;IACR,KAAK,UAAU;QACb,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM;IACR,KAAK,SAAS;QACZ,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,MAAM;IACR;QACE,OAAO,CAAC,KAAK,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAC;QAC3C,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AAED,SAAS,SAAS;IAChB,MAAM,WAAW,GAAG,aAAa,EAAE,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC;wBACU,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0DlC,CAAC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,CAAC,EAAE,AAAD,EAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;AAExC,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;IAC/D,SAAS,EAAE,CAAC;IACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,QAAQ,GAAG,EAAE,CAAC;IACZ,KAAK,MAAM;QACT,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,MAAM;IACR,KAAK,OAAO;QACV,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,MAAM;IACR,KAAK,QAAQ;QACX,SAAS,CAAC,IAAI,CAAC,CAAC;QAChB,MAAM;IACR,KAAK,UAAU;QACb,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM;IACR,KAAK,OAAO;QACV,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM;IACR,KAAK,OAAO;QACV,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,MAAM;IACR,KAAK,UAAU;QACb,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM;IACR,KAAK,SAAS;QACZ,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,MAAM;IACR,KAAK,UAAU;QACb,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM;IACR;QACE,OAAO,CAAC,KAAK,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAC;QAC3C,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AAED,SAAS,SAAS;IAChB,MAAM,WAAW,GAAG,aAAa,EAAE,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC;wBACU,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+DlC,CAAC,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"native-tools.d.ts","sourceRoot":"","sources":["../../src/gateway/native-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,OAAO,KAAK,EAAE,UAAU,EAAqB,MAAM,uBAAuB,CAAC;AAI3E;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,SAAS,EAClB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,UAAU,EAAE,GACxB,MAAM,CAyTR"}
1
+ {"version":3,"file":"native-tools.d.ts","sourceRoot":"","sources":["../../src/gateway/native-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,OAAO,KAAK,EAAE,UAAU,EAAqB,MAAM,uBAAuB,CAAC;AAI3E;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,SAAS,EAClB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,UAAU,EAAE,GACxB,MAAM,CAyWR"}
@@ -2,6 +2,7 @@ import { z } from 'zod';
2
2
  import { TaskStore } from '../pm/task-store.js';
3
3
  import { GitHubBridge } from '../pm/github-bridge.js';
4
4
  import { DiscordNotifier } from '../pm/discord-notifier.js';
5
+ import { VaultWriter } from '../obsidian/vault-writer.js';
5
6
  import { executeChain } from './middleware/chain.js';
6
7
  import { InvocationStatus } from '../types/index.js';
7
8
  /**
@@ -12,6 +13,7 @@ export function registerNativeTools(gateway, baseDir, middlewares) {
12
13
  const store = new TaskStore(baseDir);
13
14
  const bridge = new GitHubBridge({ baseDir });
14
15
  const discord = new DiscordNotifier(baseDir);
16
+ const obsidian = new VaultWriter(baseDir);
15
17
  let count = 0;
16
18
  function wrapHandler(toolName, handler) {
17
19
  return async (params) => {
@@ -247,6 +249,43 @@ export function registerNativeTools(gateway, baseDir, middlewares) {
247
249
  return { sent: true, channel, note: 'Notification dispatched (best-effort)' };
248
250
  }));
249
251
  count++;
252
+ // ── obsidian_sync ─────────────────────────────────────────────────
253
+ gateway.tool('obsidian_sync', 'Sync project state to an Obsidian vault. Requires obsidian_vault to be enabled in .reagent/gateway.yaml and REAGENT_OBSIDIAN_VAULT env var (or vault_path in config).', {
254
+ target: z
255
+ .enum(['kanban', 'context', 'wiki', 'tasks', 'all'])
256
+ .optional()
257
+ .default('all')
258
+ .describe('Sync target (default: all enabled targets)'),
259
+ dry_run: z
260
+ .boolean()
261
+ .optional()
262
+ .default(false)
263
+ .describe('Preview what would be written without writing files'),
264
+ }, wrapHandler('obsidian_sync', (args) => {
265
+ if (!obsidian.isEnabled()) {
266
+ return {
267
+ error: 'Obsidian vault integration is not enabled. Set obsidian_vault.enabled: true in .reagent/gateway.yaml and set REAGENT_OBSIDIAN_VAULT env var.',
268
+ };
269
+ }
270
+ const target = args.target || 'all';
271
+ const dryRun = args.dry_run || false;
272
+ if (target === 'all') {
273
+ return obsidian.syncAll(dryRun);
274
+ }
275
+ switch (target) {
276
+ case 'kanban':
277
+ return obsidian.syncKanban(dryRun);
278
+ case 'context':
279
+ return obsidian.syncContextDump(dryRun);
280
+ case 'wiki':
281
+ return obsidian.syncWiki(dryRun);
282
+ case 'tasks':
283
+ return obsidian.syncTasks(dryRun);
284
+ default:
285
+ return { error: `Unknown target: ${target}` };
286
+ }
287
+ }));
288
+ count++;
250
289
  console.error(`[reagent] Registered ${count} native tools`);
251
290
  return count;
252
291
  }