@bookedsolid/reagent 0.14.0 → 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 +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.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 +1 -1
- package/profiles/bst-internal.json +1 -1
- package/profiles/client-engagement.json +1 -1
package/README.md
CHANGED
|
@@ -374,6 +374,143 @@ the task board from within Claude Code conversations.
|
|
|
374
374
|
{"id":"T-001","type":"completed","title":"Implement login flow","commit_refs":["abc1234"],"pr_ref":"#42","timestamp":"2026-04-01T14:30:00.000Z"}
|
|
375
375
|
```
|
|
376
376
|
|
|
377
|
+
## Obsidian vault integration
|
|
378
|
+
|
|
379
|
+
reagent can integrate with [Obsidian](https://obsidian.md) vaults for project knowledge
|
|
380
|
+
management. Session journaling, task sync, knowledge extraction before context compaction,
|
|
381
|
+
and vault health monitoring — all driven by hooks and the CLI.
|
|
382
|
+
|
|
383
|
+
The integration is **opt-in by default**. Nothing Obsidian-related activates unless you
|
|
384
|
+
explicitly configure it. Every Obsidian operation is fail-silent: if the CLI is missing,
|
|
385
|
+
the vault path is wrong, or a sync target is disabled, reagent exits cleanly with no
|
|
386
|
+
errors and no blocked operations.
|
|
387
|
+
|
|
388
|
+
### Prerequisites
|
|
389
|
+
|
|
390
|
+
- **Obsidian CLI** installed at `/usr/local/bin/obsidian`
|
|
391
|
+
- An Obsidian vault directory for each project you want to integrate
|
|
392
|
+
|
|
393
|
+
### Setup
|
|
394
|
+
|
|
395
|
+
Enable the integration during init:
|
|
396
|
+
|
|
397
|
+
```bash
|
|
398
|
+
reagent init --obsidian --vault-path /path/to/vault
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
Or set the vault path via environment variable:
|
|
402
|
+
|
|
403
|
+
```bash
|
|
404
|
+
export REAGENT_OBSIDIAN_VAULT=/path/to/vault
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
Both methods write an `obsidian_vault` block to `.reagent/gateway.yaml`:
|
|
408
|
+
|
|
409
|
+
```yaml
|
|
410
|
+
obsidian_vault:
|
|
411
|
+
enabled: true
|
|
412
|
+
vault_path: '/path/to/vault'
|
|
413
|
+
vault_name: 'MyProject'
|
|
414
|
+
paths:
|
|
415
|
+
root: 'Projects/Reagent'
|
|
416
|
+
kanban: 'Projects/Reagent/Kanban.md'
|
|
417
|
+
sources: 'Projects/Reagent/Sources'
|
|
418
|
+
wiki: 'Projects/Reagent/Auto'
|
|
419
|
+
tasks: 'Tasks'
|
|
420
|
+
sessions: 'Wiki/Sessions'
|
|
421
|
+
sync:
|
|
422
|
+
kanban: false
|
|
423
|
+
context_dump: false
|
|
424
|
+
wiki_refresh: false
|
|
425
|
+
journal: true # Tier 1 — on by default when integration is enabled
|
|
426
|
+
precompact: false # Tier 2 — opt-in
|
|
427
|
+
tasks: true # Tier 3 — on by default when integration is enabled
|
|
428
|
+
precompact:
|
|
429
|
+
engine: 'claude' # 'claude' or 'ollama'
|
|
430
|
+
model: null # null = use default model for the engine
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
Vault path resolution order:
|
|
434
|
+
|
|
435
|
+
1. `REAGENT_OBSIDIAN_VAULT` environment variable (absolute path)
|
|
436
|
+
2. `obsidian_vault.vault_path` in `gateway.yaml`
|
|
437
|
+
3. Not set — integration disabled
|
|
438
|
+
|
|
439
|
+
### Three-tier hook architecture
|
|
440
|
+
|
|
441
|
+
Obsidian sync is organized into three tiers, each backed by a dedicated Claude Code hook.
|
|
442
|
+
Each tier operates independently and can be enabled or disabled individually.
|
|
443
|
+
|
|
444
|
+
**Tier 1 — Session Journal** (`reagent-obsidian-journal.sh`)
|
|
445
|
+
|
|
446
|
+
Fires when a Claude Code session ends. Appends a session summary to the daily note in
|
|
447
|
+
your vault via `obsidian daily:append`. The summary includes the project name, a session
|
|
448
|
+
identifier, timestamp, and task state counts (completed, in progress, blocked, backlog)
|
|
449
|
+
pulled from `.reagent/tasks.jsonl`.
|
|
450
|
+
|
|
451
|
+
Enable: `sync.journal: true` (default when integration is enabled).
|
|
452
|
+
|
|
453
|
+
**Tier 2 — PreCompact Knowledge Extraction** (`reagent-obsidian-precompact.sh`)
|
|
454
|
+
|
|
455
|
+
Fires before Claude Code compacts context. Creates a session knowledge note in
|
|
456
|
+
`Wiki/Sessions/` (or your configured `paths.sessions` directory) with frontmatter
|
|
457
|
+
tagging the project, date, session ID, and extraction engine.
|
|
458
|
+
|
|
459
|
+
This tier is a stub — the knowledge extraction engine is not yet fully implemented.
|
|
460
|
+
The hook creates a structured placeholder note with sections for Decisions, Discoveries,
|
|
461
|
+
and Open Questions. The `precompact.engine` field (`claude` or `ollama`) determines which
|
|
462
|
+
backend will perform extraction when the implementation is complete.
|
|
463
|
+
|
|
464
|
+
Enable: `sync.precompact: true` (disabled by default).
|
|
465
|
+
|
|
466
|
+
**Tier 3 — Task Materialization** (`reagent-obsidian-tasks.sh`)
|
|
467
|
+
|
|
468
|
+
Fires after `task_create` and `task_update` MCP tool calls. Materializes each task as an
|
|
469
|
+
individual Obsidian note in the `Tasks/` directory with typed frontmatter:
|
|
470
|
+
|
|
471
|
+
```yaml
|
|
472
|
+
---
|
|
473
|
+
reagent_managed: true
|
|
474
|
+
task_id: T-001
|
|
475
|
+
project: my-project
|
|
476
|
+
status: started
|
|
477
|
+
urgency: critical
|
|
478
|
+
assignee: frontend-specialist
|
|
479
|
+
---
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
Sync is one-way: JSONL to Obsidian. The hook extracts the task ID from the tool result,
|
|
483
|
+
reads the latest event for that task from `.reagent/tasks.jsonl`, and creates or overwrites
|
|
484
|
+
the corresponding note.
|
|
485
|
+
|
|
486
|
+
Enable: `sync.tasks: true` (default when integration is enabled).
|
|
487
|
+
|
|
488
|
+
### CLI commands
|
|
489
|
+
|
|
490
|
+
```
|
|
491
|
+
reagent obsidian sync [--target kanban|context|wiki|tasks] [--dry-run]
|
|
492
|
+
Sync enabled targets to the Obsidian vault. Without --target, syncs all
|
|
493
|
+
enabled targets. --dry-run previews what would be written.
|
|
494
|
+
|
|
495
|
+
reagent obsidian status
|
|
496
|
+
Show current Obsidian configuration: vault path, CLI availability,
|
|
497
|
+
configured paths, and which sync targets are enabled or disabled.
|
|
498
|
+
|
|
499
|
+
reagent obsidian health
|
|
500
|
+
Show vault health metrics: orphan notes, unresolved links, and dead ends.
|
|
501
|
+
Requires vault_name set in gateway.yaml and the Obsidian CLI installed.
|
|
502
|
+
|
|
503
|
+
reagent obsidian journal
|
|
504
|
+
Manually trigger a session journal entry in the daily note. Useful for
|
|
505
|
+
ad-hoc journaling outside of the automatic session-end hook.
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
### Vault-per-project mapping
|
|
509
|
+
|
|
510
|
+
Each project maps to its own Obsidian vault. The vault path is resolved per-project from
|
|
511
|
+
that project's `.reagent/gateway.yaml` or `REAGENT_OBSIDIAN_VAULT` environment variable.
|
|
512
|
+
There is no global vault registry — each project is self-contained.
|
|
513
|
+
|
|
377
514
|
## CLI reference
|
|
378
515
|
|
|
379
516
|
```
|
|
@@ -388,6 +525,8 @@ reagent init [options]
|
|
|
388
525
|
--tasks-channel <id> Discord channel ID for task events
|
|
389
526
|
--releases-channel Discord channel ID for release events
|
|
390
527
|
--dev-channel <id> Discord channel ID for dev activity
|
|
528
|
+
--obsidian Enable Obsidian vault integration in gateway.yaml
|
|
529
|
+
--vault-path <path> Absolute path to the Obsidian vault directory
|
|
391
530
|
|
|
392
531
|
reagent serve
|
|
393
532
|
Starts the MCP server on stdio. Loaded by Claude Code via .mcp.json.
|
|
@@ -408,12 +547,19 @@ reagent catalyze [targetDir]
|
|
|
408
547
|
--audit Compare current state against the last plan and show drift
|
|
409
548
|
--dry-run Print analysis without writing files
|
|
410
549
|
|
|
411
|
-
reagent upgrade [--dry-run]
|
|
550
|
+
reagent upgrade [--dry-run] [--clean-blocked-paths]
|
|
412
551
|
Re-syncs installed hooks from the current package version and updates the
|
|
413
552
|
version stamp in policy.yaml. Run after upgrading the reagent package.
|
|
553
|
+
--clean-blocked-paths replaces the blanket '.reagent/' blocked path with
|
|
554
|
+
granular entries, allowing agents to write to operational files (tasks,
|
|
555
|
+
review cache) while keeping policy and audit files protected.
|
|
414
556
|
|
|
415
557
|
reagent cache <set|get|del> <key> [value]
|
|
416
558
|
Manages the review cache used by commit-review-gate and push-review-gate.
|
|
559
|
+
|
|
560
|
+
reagent obsidian <sync|status|health|journal>
|
|
561
|
+
Obsidian vault integration commands. See the Obsidian vault integration
|
|
562
|
+
section above for full documentation.
|
|
417
563
|
```
|
|
418
564
|
|
|
419
565
|
## Configuration
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/index.ts"],"names":[],"mappings":"AAoBA,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAgM5C"}
|
|
@@ -15,12 +15,14 @@ import { installPm } from './pm.js';
|
|
|
15
15
|
import { installGitHub } from './github.js';
|
|
16
16
|
import { installProfile, listTechProfiles } from './profiles.js';
|
|
17
17
|
import { installDiscord, parseDiscordArgs } from './discord.js';
|
|
18
|
+
import { installObsidian, parseObsidianArgs } from './obsidian.js';
|
|
18
19
|
export function runInit(args) {
|
|
19
20
|
const profileName = parseFlag(args, '--profile') || 'client-engagement';
|
|
20
21
|
const targetDir = process.cwd();
|
|
21
22
|
const dryRun = args.includes('--dry-run');
|
|
22
23
|
const withGitHub = args.includes('--github');
|
|
23
24
|
const withDiscord = args.includes('--discord');
|
|
25
|
+
const withObsidian = args.includes('--obsidian');
|
|
24
26
|
const PKG_VERSION = getPkgVersion();
|
|
25
27
|
// --preflight-cmd overrides lockfile detection; used to inject a custom preflight command
|
|
26
28
|
const preflightCmdOverride = parseFlag(args, '--preflight-cmd');
|
|
@@ -135,7 +137,12 @@ export function runInit(args) {
|
|
|
135
137
|
const discordOpts = parseDiscordArgs(args);
|
|
136
138
|
results.push(...installDiscord(targetDir, discordOpts, dryRun));
|
|
137
139
|
}
|
|
138
|
-
// Step 15:
|
|
140
|
+
// Step 15: Obsidian vault integration (opt-in via --obsidian flag)
|
|
141
|
+
if (withObsidian) {
|
|
142
|
+
const obsidianOpts = parseObsidianArgs(args);
|
|
143
|
+
results.push(...installObsidian(targetDir, obsidianOpts, dryRun));
|
|
144
|
+
}
|
|
145
|
+
// Step 16: Tech profile overlay (hooks, gates, agents) — runs after base init
|
|
139
146
|
if (isTechProfile) {
|
|
140
147
|
const profileResult = installProfile(profileName, targetDir, dryRun);
|
|
141
148
|
results.push(...profileResult.results);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,17 +6,17 @@ import path from 'node:path';
|
|
|
6
6
|
* Uses stdio transport so Claude Code spawns `reagent serve` directly —
|
|
7
7
|
* no daemon required, works immediately after `reagent init`.
|
|
8
8
|
*
|
|
9
|
-
* `npx reagent serve` resolves in order:
|
|
10
|
-
* 1. ./node_modules/.bin/reagent (local install)
|
|
11
|
-
* 2.
|
|
9
|
+
* `npx @bookedsolid/reagent serve` resolves in order:
|
|
10
|
+
* 1. ./node_modules/.bin/reagent (local install — npx checks here first)
|
|
11
|
+
* 2. npm registry fetch (npx auto-installs if not found locally)
|
|
12
12
|
*
|
|
13
|
-
*
|
|
14
|
-
* whether reagent
|
|
13
|
+
* Using the scoped package name ensures npx can always resolve the binary,
|
|
14
|
+
* whether reagent is installed locally, globally, or fetched on demand.
|
|
15
15
|
*/
|
|
16
16
|
const REAGENT_MCP_ENTRY = {
|
|
17
17
|
type: 'stdio',
|
|
18
18
|
command: 'npx',
|
|
19
|
-
args: ['reagent', 'serve'],
|
|
19
|
+
args: ['@bookedsolid/reagent', 'serve'],
|
|
20
20
|
};
|
|
21
21
|
/**
|
|
22
22
|
* Write (or merge into) .mcp.json in `targetDir` with a reagent stdio entry.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/mcp-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B;;;;;;;;;;;;GAYG;AACH,MAAM,iBAAiB,GAAG;IACxB,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,KAAK;IACd,IAAI,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/mcp-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B;;;;;;;;;;;;GAYG;AACH,MAAM,iBAAiB,GAAG;IACxB,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,KAAK;IACd,IAAI,EAAE,CAAC,sBAAsB,EAAE,OAAO,CAAC;CAC/B,CAAC;AAEX;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,MAAe;IAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAElD,4DAA4D;IAC5D,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,IAAI,QAAkD,CAAC;QACvD,IAAI,CAAC;YACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAErD,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,yDAAyD;YACzD,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,QAAQ,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC;YACjC,sCAAsC;YACtC,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,qCAAqC;QACrC,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC;QAChD,QAAQ,CAAC,UAAU,CAAC,OAAO,GAAG,iBAAiB,CAAC;QAEhD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,yCAAyC;IACzC,MAAM,MAAM,GAAG;QACb,UAAU,EAAE;YACV,OAAO,EAAE,iBAAiB;SAC3B;KACF,CAAC;IAEF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { InstallResult } from './types.js';
|
|
2
|
+
export interface ObsidianInitOptions {
|
|
3
|
+
vaultPath?: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Install or update the obsidian_vault section in .reagent/gateway.yaml.
|
|
7
|
+
*
|
|
8
|
+
* Wired into `reagent init --obsidian`.
|
|
9
|
+
* Non-interactive: reads opts from args.
|
|
10
|
+
*/
|
|
11
|
+
export declare function installObsidian(targetDir: string, opts: ObsidianInitOptions, dryRun: boolean): InstallResult[];
|
|
12
|
+
/**
|
|
13
|
+
* Parse --obsidian flags from CLI args.
|
|
14
|
+
*/
|
|
15
|
+
export declare function parseObsidianArgs(args: string[]): ObsidianInitOptions;
|
|
16
|
+
//# sourceMappingURL=obsidian.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"obsidian.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/obsidian.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAoCD;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,mBAAmB,EACzB,MAAM,EAAE,OAAO,GACd,aAAa,EAAE,CAmDjB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,mBAAmB,CAMrE"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { parse as parseYaml } from 'yaml';
|
|
4
|
+
/**
|
|
5
|
+
* Generate the obsidian_vault YAML block to append to gateway.yaml.
|
|
6
|
+
* Always installs as disabled — user must explicitly enable.
|
|
7
|
+
*/
|
|
8
|
+
function buildObsidianVaultYaml(opts) {
|
|
9
|
+
return `
|
|
10
|
+
# Optional: Obsidian vault integration
|
|
11
|
+
# Syncs task state, context, and wiki pages to an Obsidian vault as plain markdown.
|
|
12
|
+
# Set REAGENT_OBSIDIAN_VAULT env var to your vault root path, or set vault_path below.
|
|
13
|
+
# All sync targets are opt-in and disabled by default.
|
|
14
|
+
obsidian_vault:
|
|
15
|
+
enabled: false
|
|
16
|
+
vault_path: '${opts.vaultPath || ''}'
|
|
17
|
+
vault_name: ''
|
|
18
|
+
paths:
|
|
19
|
+
root: 'Projects/Reagent'
|
|
20
|
+
kanban: 'Projects/Reagent/Kanban.md'
|
|
21
|
+
sources: 'Projects/Reagent/Sources'
|
|
22
|
+
wiki: 'Projects/Reagent/Auto'
|
|
23
|
+
tasks: 'Tasks'
|
|
24
|
+
sessions: 'Wiki/Sessions'
|
|
25
|
+
sync:
|
|
26
|
+
kanban: false
|
|
27
|
+
context_dump: false
|
|
28
|
+
wiki_refresh: false
|
|
29
|
+
journal: true
|
|
30
|
+
precompact: false
|
|
31
|
+
tasks: true
|
|
32
|
+
precompact:
|
|
33
|
+
engine: 'claude'
|
|
34
|
+
model: null
|
|
35
|
+
`;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Install or update the obsidian_vault section in .reagent/gateway.yaml.
|
|
39
|
+
*
|
|
40
|
+
* Wired into `reagent init --obsidian`.
|
|
41
|
+
* Non-interactive: reads opts from args.
|
|
42
|
+
*/
|
|
43
|
+
export function installObsidian(targetDir, opts, dryRun) {
|
|
44
|
+
const results = [];
|
|
45
|
+
const gatewayPath = path.join(targetDir, '.reagent', 'gateway.yaml');
|
|
46
|
+
if (!fs.existsSync(gatewayPath)) {
|
|
47
|
+
return [{ file: '.reagent/gateway.yaml (not found — run reagent init first)', status: 'warn' }];
|
|
48
|
+
}
|
|
49
|
+
const raw = fs.readFileSync(gatewayPath, 'utf8');
|
|
50
|
+
let parsed;
|
|
51
|
+
try {
|
|
52
|
+
parsed = parseYaml(raw);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return [{ file: '.reagent/gateway.yaml (YAML parse error)', status: 'warn' }];
|
|
56
|
+
}
|
|
57
|
+
if ('obsidian_vault' in parsed) {
|
|
58
|
+
return [
|
|
59
|
+
{
|
|
60
|
+
file: '.reagent/gateway.yaml (obsidian_vault already configured)',
|
|
61
|
+
status: 'skipped',
|
|
62
|
+
},
|
|
63
|
+
];
|
|
64
|
+
}
|
|
65
|
+
const obsidianYaml = buildObsidianVaultYaml(opts);
|
|
66
|
+
if (!dryRun) {
|
|
67
|
+
fs.appendFileSync(gatewayPath, obsidianYaml, 'utf8');
|
|
68
|
+
}
|
|
69
|
+
results.push({ file: '.reagent/gateway.yaml (+obsidian_vault)', status: 'updated' });
|
|
70
|
+
if (!dryRun) {
|
|
71
|
+
console.log('');
|
|
72
|
+
console.log('Obsidian vault integration configured (disabled by default).');
|
|
73
|
+
console.log('');
|
|
74
|
+
console.log('To enable:');
|
|
75
|
+
console.log(' 1. Set your vault path:');
|
|
76
|
+
console.log(' export REAGENT_OBSIDIAN_VAULT="~/path/to/your/vault"');
|
|
77
|
+
console.log('');
|
|
78
|
+
console.log(' 2. Enable in .reagent/gateway.yaml:');
|
|
79
|
+
console.log(' obsidian_vault.enabled: true');
|
|
80
|
+
console.log(' obsidian_vault.sync.kanban: true');
|
|
81
|
+
console.log('');
|
|
82
|
+
console.log(' 3. Sync: reagent obsidian sync');
|
|
83
|
+
console.log('');
|
|
84
|
+
}
|
|
85
|
+
return results;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Parse --obsidian flags from CLI args.
|
|
89
|
+
*/
|
|
90
|
+
export function parseObsidianArgs(args) {
|
|
91
|
+
const idx = args.indexOf('--vault-path');
|
|
92
|
+
const vaultPath = idx !== -1 && args[idx + 1] && !args[idx + 1].startsWith('--') ? args[idx + 1] : undefined;
|
|
93
|
+
return { vaultPath };
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=obsidian.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"obsidian.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/obsidian.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/policy.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE/D,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,OAAO,EACf,WAAW,CAAC,EAAE,MAAM,GACnB,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/policy.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE/D,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,OAAO,EACf,WAAW,CAAC,EAAE,MAAM,GACnB,aAAa,EAAE,CA2FjB"}
|
|
@@ -18,7 +18,6 @@ export function installPolicy(targetDir, profileName, profile, dryRun, techProfi
|
|
|
18
18
|
const blockedPaths = profile.blockedPaths ?? [
|
|
19
19
|
'.reagent/policy.yaml',
|
|
20
20
|
'.reagent/HALT',
|
|
21
|
-
'.reagent/review-cache.json',
|
|
22
21
|
'.github/workflows/',
|
|
23
22
|
'.env',
|
|
24
23
|
'.env.*',
|
|
@@ -76,6 +75,16 @@ coverage:
|
|
|
76
75
|
# disabled — no gate (not recommended)
|
|
77
76
|
security:
|
|
78
77
|
disclosure_mode: "${disclosureMode}"
|
|
78
|
+
|
|
79
|
+
# Context protection — commands that must run in subagents, never in coordinator
|
|
80
|
+
# The dangerous-bash-interceptor hook blocks these commands when run directly.
|
|
81
|
+
# Prevents context window exhaustion from verbose test/build output.
|
|
82
|
+
context_protection:
|
|
83
|
+
delegate_to_subagent:
|
|
84
|
+
- "pnpm run preflight"
|
|
85
|
+
- "pnpm run test"
|
|
86
|
+
- "pnpm run build"
|
|
87
|
+
max_bash_output_lines: 100
|
|
79
88
|
`;
|
|
80
89
|
fs.writeFileSync(policyPath, content, 'utf8');
|
|
81
90
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG/C,MAAM,UAAU,aAAa,CAC3B,SAAiB,EACjB,WAAmB,EACnB,OAAsB,EACtB,MAAe,EACf,WAAoB;IAEpB,MAAM,WAAW,GAAG,aAAa,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAExD,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,KAAK,IAAI,CAAC;QAC7D,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,EAAE,cAAc,IAAI,UAAU,CAAC;QACtE,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;QAC3D,MAAM,iBAAiB,GAAG,OAAO,CAAC,QAAQ,EAAE,SAAS,IAAI,EAAE,CAAC;QAC5D,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI;YAC3C,sBAAsB;YACtB,eAAe;YACf,
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG/C,MAAM,UAAU,aAAa,CAC3B,SAAiB,EACjB,WAAmB,EACnB,OAAsB,EACtB,MAAe,EACf,WAAoB;IAEpB,MAAM,WAAW,GAAG,aAAa,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAExD,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,KAAK,IAAI,CAAC;QAC7D,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,EAAE,cAAc,IAAI,UAAU,CAAC;QACtE,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;QAC3D,MAAM,iBAAiB,GAAG,OAAO,CAAC,QAAQ,EAAE,SAAS,IAAI,EAAE,CAAC;QAC5D,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI;YAC3C,sBAAsB;YACtB,eAAe;YACf,oBAAoB;YACpB,MAAM;YACN,QAAQ;SACT,CAAC;QACF,MAAM,gBAAgB,GAAG,YAAY,CAAC,MAAM;YAC1C,CAAC,CAAC,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACjE,CAAC,CAAC,KAAK,CAAC;QACV,MAAM,OAAO,GAAG,+DAA+D,WAAW;;;;;YAKlF,WAAW;EACrB,WAAW,CAAC,CAAC,CAAC,kBAAkB,WAAW,KAAK,CAAC,CAAC,CAAC,EAAE,0BAA0B,WAAW;iBAC3E,GAAG;;;;;;;;;;;;;;;;;;wBAkBI,gBAAgB;;;gBAGxB,gBAAgB;;;;;;;;;;;;aAYnB,eAAe;eACb,iBAAiB;;;;;;;;sBAQV,cAAc;;;;;;;;;;;CAWnC,CAAC;QACE,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"obsidian.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/obsidian.ts"],"names":[],"mappings":"AAOA,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA0BhD"}
|
|
@@ -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
|