@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.
- package/README.md +147 -1
- package/dist/cli/commands/init/index.d.ts.map +1 -1
- package/dist/cli/commands/init/index.js +8 -1
- package/dist/cli/commands/init/index.js.map +1 -1
- package/dist/cli/commands/init/mcp-config.d.ts.map +1 -1
- package/dist/cli/commands/init/mcp-config.js +27 -17
- 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 +56 -25
- 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 +1 -1
- package/profiles/bst-internal.json +1 -1
- 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":"
|
|
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:
|
|
46
|
-
//
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
|
|
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":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;
|
|
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
|
package/dist/cli/index.js.map
CHANGED
|
@@ -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;
|
|
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;
|
|
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
|
}
|