@jayjiang/byoao 1.1.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/dist/__tests__/plugin-config.test.js +7 -10
  2. package/dist/__tests__/plugin-config.test.js.map +1 -1
  3. package/dist/assets/obsidian-skills/byoao-conventions.md +30 -54
  4. package/dist/assets/obsidian-skills/vault-thinking.md +6 -5
  5. package/dist/assets/presets/common/AGENTS.md.hbs +29 -46
  6. package/dist/assets/presets/common/SCHEMA.md.hbs +57 -0
  7. package/dist/assets/presets/common/Start Here.md.hbs +29 -40
  8. package/dist/assets/presets/minimal/preset.json +3 -3
  9. package/dist/assets/presets/pm-tpm/preset.json +2 -2
  10. package/dist/assets/skills/ask.md +28 -27
  11. package/dist/assets/skills/challenge.md +79 -121
  12. package/dist/assets/skills/connect.md +75 -163
  13. package/dist/assets/skills/cook.md +167 -0
  14. package/dist/assets/skills/diagnose.md +102 -43
  15. package/dist/assets/skills/drift.md +64 -165
  16. package/dist/assets/skills/health.md +63 -0
  17. package/dist/assets/skills/ideas.md +11 -10
  18. package/dist/assets/skills/organize.md +56 -155
  19. package/dist/assets/skills/prep.md +63 -0
  20. package/dist/assets/skills/trace.md +75 -90
  21. package/dist/assets/skills/wiki.md +77 -178
  22. package/dist/cli/cli-program.js +17 -14
  23. package/dist/cli/cli-program.js.map +1 -1
  24. package/dist/cli/installer.js +10 -4
  25. package/dist/cli/installer.js.map +1 -1
  26. package/dist/hooks/idle-suggestions.js +4 -4
  27. package/dist/hooks/idle-suggestions.js.map +1 -1
  28. package/dist/hooks/system-transform.js +35 -1
  29. package/dist/hooks/system-transform.js.map +1 -1
  30. package/dist/index.js +395 -623
  31. package/dist/index.js.map +1 -1
  32. package/dist/plugin-config.js +6 -32
  33. package/dist/plugin-config.js.map +1 -1
  34. package/dist/tools/init-vault.js +8 -38
  35. package/dist/tools/init-vault.js.map +1 -1
  36. package/dist/tools/vault-doctor.js +1 -1
  37. package/dist/tools/vault-doctor.js.map +1 -1
  38. package/dist/tools/vault-status.js +1 -1
  39. package/dist/tools/vault-status.js.map +1 -1
  40. package/dist/vault/__tests__/create.test.js +47 -115
  41. package/dist/vault/__tests__/create.test.js.map +1 -1
  42. package/dist/vault/__tests__/doctor.test.js +14 -2
  43. package/dist/vault/__tests__/doctor.test.js.map +1 -1
  44. package/dist/vault/__tests__/manifest.test.js +2 -2
  45. package/dist/vault/__tests__/manifest.test.js.map +1 -1
  46. package/dist/vault/__tests__/status.test.js +12 -0
  47. package/dist/vault/__tests__/status.test.js.map +1 -1
  48. package/dist/vault/__tests__/upgrade.test.js +3 -3
  49. package/dist/vault/__tests__/upgrade.test.js.map +1 -1
  50. package/dist/vault/create.js +75 -188
  51. package/dist/vault/create.js.map +1 -1
  52. package/dist/vault/doctor.js +49 -0
  53. package/dist/vault/doctor.js.map +1 -1
  54. package/dist/vault/manifest.js +1 -1
  55. package/dist/vault/preset.js +10 -4
  56. package/dist/vault/preset.js.map +1 -1
  57. package/dist/vault/self-update.js +1 -1
  58. package/dist/vault/status.js +24 -0
  59. package/dist/vault/status.js.map +1 -1
  60. package/dist/vault/upgrade.js +120 -16
  61. package/dist/vault/upgrade.js.map +1 -1
  62. package/package.json +1 -1
  63. package/src/assets/obsidian-skills/byoao-conventions.md +9 -6
  64. package/src/assets/obsidian-skills/vault-thinking.md +6 -5
  65. package/src/assets/presets/common/AGENTS.md.hbs +23 -19
  66. package/src/assets/presets/common/SCHEMA.md.hbs +57 -0
  67. package/src/assets/presets/common/Start Here.md.hbs +29 -40
  68. package/src/assets/presets/minimal/preset.json +3 -3
  69. package/src/assets/presets/pm-tpm/preset.json +2 -2
  70. package/src/skills/ask.md +28 -27
  71. package/src/skills/challenge.md +79 -121
  72. package/src/skills/connect.md +75 -163
  73. package/src/skills/cook.md +167 -0
  74. package/src/skills/diagnose.md +102 -43
  75. package/src/skills/drift.md +64 -165
  76. package/src/skills/health.md +63 -0
  77. package/src/skills/ideas.md +11 -10
  78. package/src/skills/organize.md +56 -155
  79. package/src/skills/prep.md +63 -0
  80. package/src/skills/trace.md +75 -90
  81. package/src/skills/wiki.md +77 -178
  82. package/dist/assets/presets/common/Glossary.md.hbs +0 -16
  83. package/dist/assets/presets/common/obsidian/daily-notes.json +0 -5
  84. package/dist/assets/presets/common/obsidian/templates.json +0 -3
  85. package/dist/assets/presets/common/templates/Daily Note.md +0 -19
  86. package/dist/assets/presets/common/templates/Decision Record.md +0 -32
  87. package/dist/assets/presets/common/templates/Investigation.md +0 -34
  88. package/dist/assets/presets/common/templates/Meeting Notes.md +0 -25
  89. package/dist/assets/skills/emerge.md +0 -168
  90. package/dist/assets/skills/weave.md +0 -287
  91. package/dist/tools/add-glossary-term.js +0 -21
  92. package/dist/tools/add-glossary-term.js.map +0 -1
  93. package/dist/tools/add-person.js +0 -21
  94. package/dist/tools/add-person.js.map +0 -1
  95. package/dist/tools/add-project.js +0 -24
  96. package/dist/tools/add-project.js.map +0 -1
  97. package/dist/tools/graph-health.js +0 -25
  98. package/dist/tools/graph-health.js.map +0 -1
  99. package/dist/tools/note-read.js +0 -19
  100. package/dist/tools/note-read.js.map +0 -1
  101. package/dist/tools/search-vault.js +0 -22
  102. package/dist/tools/search-vault.js.map +0 -1
  103. package/dist/vault/__tests__/glossary.test.js +0 -68
  104. package/dist/vault/__tests__/glossary.test.js.map +0 -1
  105. package/dist/vault/__tests__/graph-health.test.js +0 -102
  106. package/dist/vault/__tests__/graph-health.test.js.map +0 -1
  107. package/dist/vault/__tests__/member.test.js +0 -85
  108. package/dist/vault/__tests__/member.test.js.map +0 -1
  109. package/dist/vault/__tests__/note-read.test.js +0 -71
  110. package/dist/vault/__tests__/note-read.test.js.map +0 -1
  111. package/dist/vault/__tests__/obsidian-cli.test.js +0 -108
  112. package/dist/vault/__tests__/obsidian-cli.test.js.map +0 -1
  113. package/dist/vault/__tests__/search-vault.test.js +0 -93
  114. package/dist/vault/__tests__/search-vault.test.js.map +0 -1
  115. package/dist/vault/glossary.js +0 -27
  116. package/dist/vault/glossary.js.map +0 -1
  117. package/dist/vault/graph-health.js +0 -83
  118. package/dist/vault/graph-health.js.map +0 -1
  119. package/dist/vault/member.js +0 -67
  120. package/dist/vault/member.js.map +0 -1
  121. package/dist/vault/note-read.js +0 -70
  122. package/dist/vault/note-read.js.map +0 -1
  123. package/dist/vault/project.js +0 -68
  124. package/dist/vault/project.js.map +0 -1
  125. package/dist/vault/retrieval-types.js +0 -5
  126. package/dist/vault/retrieval-types.js.map +0 -1
  127. package/dist/vault/search-vault.js +0 -87
  128. package/dist/vault/search-vault.js.map +0 -1
  129. package/src/assets/presets/common/obsidian/daily-notes.json +0 -5
  130. package/src/assets/presets/common/obsidian/templates.json +0 -3
  131. package/src/assets/presets/common/templates/Daily Note.md +0 -19
  132. package/src/assets/presets/common/templates/Decision Record.md +0 -32
  133. package/src/assets/presets/common/templates/Investigation.md +0 -34
  134. package/src/assets/presets/common/templates/Meeting Notes.md +0 -25
  135. package/src/skills/emerge.md +0 -168
  136. package/src/skills/weave.md +0 -287
@@ -1,85 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
- import fs from "fs-extra";
3
- import path from "node:path";
4
- import os from "node:os";
5
- import { addMember } from "../member.js";
6
- let tmpDir;
7
- beforeEach(async () => {
8
- tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "byoao-member-"));
9
- await fs.ensureDir(path.join(tmpDir, "People"));
10
- });
11
- afterEach(async () => {
12
- await fs.remove(tmpDir);
13
- });
14
- describe("addMember", () => {
15
- it("creates person note with correct frontmatter", async () => {
16
- const result = await addMember({
17
- vaultPath: tmpDir,
18
- name: "Alice",
19
- role: "Engineer",
20
- team: "Platform",
21
- });
22
- expect(result.filePath).toContain("People/Alice.md");
23
- const content = await fs.readFile(path.join(tmpDir, "People/Alice.md"), "utf-8");
24
- expect(content).toContain("type: person");
25
- expect(content).toContain('team: "Platform"');
26
- expect(content).toContain('role: "Engineer"');
27
- expect(content).toContain("status: active");
28
- });
29
- it("updates team index table", async () => {
30
- // Create a team index file
31
- const teamIndexContent = `---
32
- title: "Platform Team"
33
- type: reference
34
- ---
35
-
36
- # Platform Team
37
-
38
- ## Members
39
-
40
- | Name | Role |
41
- |------|------|
42
-
43
- ## Active Projects
44
- `;
45
- await fs.writeFile(path.join(tmpDir, "People/Platform Team.md"), teamIndexContent);
46
- await addMember({
47
- vaultPath: tmpDir,
48
- name: "Bob",
49
- role: "PM",
50
- team: "Platform",
51
- });
52
- const updated = await fs.readFile(path.join(tmpDir, "People/Platform Team.md"), "utf-8");
53
- expect(updated).toContain("[[Bob]]");
54
- expect(updated).toContain("PM");
55
- });
56
- it("updates AGENT.md wikilinks", async () => {
57
- const agentContent = `# Agent
58
-
59
- ## Team
60
-
61
- (No members added yet — create notes in People/)
62
- `;
63
- await fs.writeFile(path.join(tmpDir, "AGENT.md"), agentContent);
64
- const result = await addMember({
65
- vaultPath: tmpDir,
66
- name: "Carol",
67
- role: "Designer",
68
- team: "Platform",
69
- });
70
- expect(result.wikilinksAdded).toBeGreaterThanOrEqual(1);
71
- const agent = await fs.readFile(path.join(tmpDir, "AGENT.md"), "utf-8");
72
- expect(agent).toContain("[[Carol]]");
73
- expect(agent).not.toContain("No members added yet");
74
- });
75
- it("throws when person already exists", async () => {
76
- await fs.writeFile(path.join(tmpDir, "People/Alice.md"), "# Alice");
77
- await expect(addMember({
78
- vaultPath: tmpDir,
79
- name: "Alice",
80
- role: "Eng",
81
- team: "T",
82
- })).rejects.toThrow("already exists");
83
- });
84
- });
85
- //# sourceMappingURL=member.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"member.test.js","sourceRoot":"","sources":["../../../src/vault/__tests__/member.test.ts"],"names":[],"mappings":"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"}
@@ -1,71 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from "vitest";
2
- vi.mock("../obsidian-cli.js", () => ({
3
- isObsidianCliAvailable: vi.fn(),
4
- execObsidianCmd: vi.fn(),
5
- }));
6
- import { readNote } from "../note-read.js";
7
- import { isObsidianCliAvailable, execObsidianCmd } from "../obsidian-cli.js";
8
- const mockIsAvailable = vi.mocked(isObsidianCliAvailable);
9
- const mockExecCmd = vi.mocked(execObsidianCmd);
10
- beforeEach(() => {
11
- vi.resetAllMocks();
12
- });
13
- describe("readNote", () => {
14
- it("returns runtime_unavailable when CLI is not available", async () => {
15
- mockIsAvailable.mockReturnValue(false);
16
- const result = await readNote({ vaultPath: "/vault", file: "MyNote" });
17
- expect(result.status).toBe("runtime_unavailable");
18
- expect(result.mode).toBe("read");
19
- expect(result.diagnostics).toContain("Obsidian CLI not available");
20
- });
21
- it("returns runtime_unavailable when CLI command fails", async () => {
22
- mockIsAvailable.mockReturnValue(true);
23
- mockExecCmd.mockReturnValue({
24
- success: false,
25
- output: "",
26
- error: "Note not found",
27
- });
28
- const result = await readNote({ vaultPath: "/vault", file: "Missing" });
29
- expect(result.status).toBe("runtime_unavailable");
30
- expect(result.diagnostics[0]).toContain("Note not found");
31
- });
32
- it("returns note content as a single result item", async () => {
33
- mockIsAvailable.mockReturnValue(true);
34
- mockExecCmd.mockReturnValue({
35
- success: true,
36
- output: "---\ntype: project\ntags: [active]\n---\n\n# Refund Automation\n\nProject details here.",
37
- });
38
- const result = await readNote({ vaultPath: "/vault", file: "Refund Automation" });
39
- expect(result.status).toBe("ok");
40
- expect(result.results).toHaveLength(1);
41
- expect(result.results[0].title).toBe("Refund Automation");
42
- expect(result.results[0].file).toBe("Refund Automation");
43
- expect(result.results[0].snippet).toContain("Project details here");
44
- });
45
- it("returns no_results when CLI returns empty output", async () => {
46
- mockIsAvailable.mockReturnValue(true);
47
- mockExecCmd.mockReturnValue({ success: true, output: "" });
48
- const result = await readNote({ vaultPath: "/vault", file: "Empty" });
49
- expect(result.status).toBe("no_results");
50
- expect(result.results).toHaveLength(0);
51
- });
52
- it("passes vault path and file to CLI correctly", async () => {
53
- mockIsAvailable.mockReturnValue(true);
54
- mockExecCmd.mockReturnValue({ success: true, output: "content" });
55
- await readNote({ vaultPath: "/my/vault", file: "My Note" });
56
- expect(mockExecCmd).toHaveBeenCalledWith([
57
- "read",
58
- "--vault",
59
- "/my/vault",
60
- "My Note",
61
- ]);
62
- });
63
- it("truncates snippet for very long notes", async () => {
64
- mockIsAvailable.mockReturnValue(true);
65
- const longContent = "a".repeat(500);
66
- mockExecCmd.mockReturnValue({ success: true, output: longContent });
67
- const result = await readNote({ vaultPath: "/vault", file: "Long" });
68
- expect(result.results[0].snippet.length).toBeLessThanOrEqual(240);
69
- });
70
- });
71
- //# sourceMappingURL=note-read.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"note-read.test.js","sourceRoot":"","sources":["../../../src/vault/__tests__/note-read.test.ts"],"names":[],"mappings":"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"}
@@ -1,108 +0,0 @@
1
- import { beforeEach, describe, expect, it, vi } from "vitest";
2
- // vi.mock factories are hoisted above variable declarations, so mocks must be
3
- // created with vi.hoisted() to be accessible inside factory callbacks.
4
- const { mockExecSync, mockSpawnSync, mockPlatform } = vi.hoisted(() => ({
5
- mockExecSync: vi.fn(),
6
- mockSpawnSync: vi.fn(),
7
- mockPlatform: vi.fn().mockReturnValue("darwin"),
8
- }));
9
- vi.mock("node:child_process", () => ({
10
- execSync: mockExecSync,
11
- spawnSync: mockSpawnSync,
12
- }));
13
- vi.mock("node:os", () => ({
14
- platform: mockPlatform,
15
- }));
16
- import { execObsidianCmd, isObsidianCliAvailable, } from "../obsidian-cli.js";
17
- beforeEach(() => {
18
- vi.resetAllMocks();
19
- mockPlatform.mockReturnValue("darwin");
20
- });
21
- describe("isObsidianCliAvailable", () => {
22
- it("uses `which` on macOS and returns true when the binary is found", () => {
23
- mockPlatform.mockReturnValue("darwin");
24
- mockExecSync.mockReturnValue("/Applications/Obsidian.app/Contents/MacOS/obsidian\n");
25
- expect(isObsidianCliAvailable()).toBe(true);
26
- expect(mockExecSync).toHaveBeenCalledWith("which obsidian", expect.objectContaining({ stdio: "pipe" }));
27
- });
28
- it("uses `which` on Linux and returns true when the binary is found", () => {
29
- mockPlatform.mockReturnValue("linux");
30
- mockExecSync.mockReturnValue("/usr/bin/obsidian\n");
31
- expect(isObsidianCliAvailable()).toBe(true);
32
- expect(mockExecSync).toHaveBeenCalledWith("which obsidian", expect.objectContaining({ stdio: "pipe" }));
33
- });
34
- it("uses `where` on Windows and returns true when the binary is found", () => {
35
- mockPlatform.mockReturnValue("win32");
36
- mockExecSync.mockReturnValue("C:\\Users\\dev\\AppData\\Local\\Obsidian\\obsidian.exe\n");
37
- expect(isObsidianCliAvailable()).toBe(true);
38
- expect(mockExecSync).toHaveBeenCalledWith("where obsidian", expect.objectContaining({ stdio: "pipe" }));
39
- });
40
- it("returns false when the binary is not found on any platform", () => {
41
- mockExecSync.mockImplementation(() => {
42
- throw new Error("not found");
43
- });
44
- expect(isObsidianCliAvailable()).toBe(false);
45
- });
46
- });
47
- describe("execObsidianCmd", () => {
48
- it("returns success when Obsidian exits 0 even if installer warning is present", () => {
49
- mockSpawnSync.mockReturnValue({
50
- stdout: "2026-04-07 Loading updated app package /tmp/obsidian.asar\n" +
51
- "Your Obsidian installer is out of date. Please download the latest installer which includes better CLI support: https://obsidian.md/download\n" +
52
- "Actual result data\n",
53
- stderr: "",
54
- status: 0,
55
- signal: null,
56
- error: undefined,
57
- });
58
- const result = execObsidianCmd(["help"]);
59
- expect(result.success).toBe(true);
60
- expect(result.output).toContain("Actual result data");
61
- });
62
- it("classifies missing CLI registrations", () => {
63
- const error = Object.assign(new Error("spawnSync obsidian ENOENT"), {
64
- code: "ENOENT",
65
- });
66
- mockSpawnSync.mockReturnValue({
67
- stdout: "",
68
- stderr: "",
69
- status: null,
70
- signal: null,
71
- error,
72
- });
73
- const result = execObsidianCmd(["read", "file=Test"]);
74
- expect(result.success).toBe(false);
75
- expect(result.reason).toBe("cli_not_registered");
76
- expect(result.guidance).toContain("Enable Obsidian CLI in Settings -> General -> Command line interface.");
77
- });
78
- it("returns sanitized output on success", () => {
79
- mockSpawnSync.mockReturnValue({
80
- stdout: "2026-04-07 Loading updated app package /tmp/obsidian.asar\nHello\n",
81
- stderr: "",
82
- status: 0,
83
- signal: null,
84
- error: undefined,
85
- });
86
- const result = execObsidianCmd(["read", "file=Hello"]);
87
- expect(result.success).toBe(true);
88
- expect(result.output).toBe("Hello");
89
- });
90
- it("prefixes vault-scoped commands with vault=<basename>", () => {
91
- mockSpawnSync.mockReturnValue({
92
- stdout: "",
93
- stderr: "",
94
- status: 0,
95
- signal: null,
96
- error: undefined,
97
- });
98
- execObsidianCmd(["search:context", "query=test"], {
99
- vaultPath: "/Users/dev/Documents/Tech & News",
100
- });
101
- expect(mockSpawnSync).toHaveBeenCalledWith("obsidian", ["vault=Tech & News", "search:context", "query=test"], expect.objectContaining({
102
- stdio: "pipe",
103
- encoding: "utf-8",
104
- timeout: 10000,
105
- }));
106
- });
107
- });
108
- //# sourceMappingURL=obsidian-cli.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"obsidian-cli.test.js","sourceRoot":"","sources":["../../../src/vault/__tests__/obsidian-cli.test.ts"],"names":[],"mappings":"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"}
@@ -1,93 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from "vitest";
2
- // Mock obsidian-cli before importing the module under test
3
- vi.mock("../obsidian-cli.js", () => ({
4
- isObsidianCliAvailable: vi.fn(),
5
- execObsidianCmd: vi.fn(),
6
- }));
7
- import { searchVault } from "../search-vault.js";
8
- import { isObsidianCliAvailable, execObsidianCmd } from "../obsidian-cli.js";
9
- const mockIsAvailable = vi.mocked(isObsidianCliAvailable);
10
- const mockExecCmd = vi.mocked(execObsidianCmd);
11
- beforeEach(() => {
12
- vi.resetAllMocks();
13
- });
14
- describe("searchVault", () => {
15
- it("returns runtime_unavailable when CLI is not available", async () => {
16
- mockIsAvailable.mockReturnValue(false);
17
- const result = await searchVault({ vaultPath: "/vault", query: "test" });
18
- expect(result.status).toBe("runtime_unavailable");
19
- expect(result.mode).toBe("search:context");
20
- expect(result.fallback).toBe("none");
21
- expect(result.diagnostics).toContain("Obsidian CLI not available");
22
- });
23
- it("returns runtime_unavailable when CLI command fails", async () => {
24
- mockIsAvailable.mockReturnValue(true);
25
- mockExecCmd.mockReturnValue({
26
- success: false,
27
- output: "",
28
- error: "Vault not found",
29
- });
30
- const result = await searchVault({ vaultPath: "/vault", query: "test" });
31
- expect(result.status).toBe("runtime_unavailable");
32
- expect(result.diagnostics[0]).toContain("Vault not found");
33
- });
34
- it("returns no_results when CLI returns empty output", async () => {
35
- mockIsAvailable.mockReturnValue(true);
36
- mockExecCmd.mockReturnValue({ success: true, output: "" });
37
- const result = await searchVault({ vaultPath: "/vault", query: "test" });
38
- expect(result.status).toBe("no_results");
39
- expect(result.results).toHaveLength(0);
40
- });
41
- it("parses CLI output into structured results", async () => {
42
- mockIsAvailable.mockReturnValue(true);
43
- mockExecCmd.mockReturnValue({
44
- success: true,
45
- output: [
46
- "Projects/Refund Automation.md:Owner handoff for refund automation workflow",
47
- "Daily/2026-03-20.md:Discussed refund automation timeline with team",
48
- ].join("\n"),
49
- });
50
- const result = await searchVault({ vaultPath: "/vault", query: "refund" });
51
- expect(result.status).toBe("ok");
52
- expect(result.results).toHaveLength(2);
53
- expect(result.results[0].title).toBe("Refund Automation");
54
- expect(result.results[0].path).toBe("Projects/Refund Automation.md");
55
- expect(result.results[0].file).toBe("Refund Automation");
56
- expect(result.results[0].snippet).toContain("refund automation");
57
- });
58
- it("respects the limit parameter", async () => {
59
- mockIsAvailable.mockReturnValue(true);
60
- const lines = Array.from({ length: 30 }, (_, i) => `Notes/note${i}.md:content line ${i}`);
61
- mockExecCmd.mockReturnValue({ success: true, output: lines.join("\n") });
62
- const result = await searchVault({
63
- vaultPath: "/vault",
64
- query: "content",
65
- limit: 5,
66
- });
67
- expect(result.results).toHaveLength(5);
68
- expect(result.truncated).toBe(true);
69
- expect(result.totalMatches).toBe(30);
70
- });
71
- it("truncates snippets to MAX_SNIPPET_LENGTH", async () => {
72
- mockIsAvailable.mockReturnValue(true);
73
- const longLine = "a".repeat(500);
74
- mockExecCmd.mockReturnValue({
75
- success: true,
76
- output: `Notes/long.md:${longLine}`,
77
- });
78
- const result = await searchVault({ vaultPath: "/vault", query: "a" });
79
- expect(result.results[0].snippet.length).toBeLessThanOrEqual(240);
80
- });
81
- it("passes vault path and query to CLI correctly", async () => {
82
- mockIsAvailable.mockReturnValue(true);
83
- mockExecCmd.mockReturnValue({ success: true, output: "" });
84
- await searchVault({ vaultPath: "/my/vault", query: "hello world" });
85
- expect(mockExecCmd).toHaveBeenCalledWith([
86
- "search:context",
87
- "--vault",
88
- "/my/vault",
89
- "hello world",
90
- ]);
91
- });
92
- });
93
- //# sourceMappingURL=search-vault.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"search-vault.test.js","sourceRoot":"","sources":["../../../src/vault/__tests__/search-vault.test.ts"],"names":[],"mappings":"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"}
@@ -1,27 +0,0 @@
1
- import { fs } from "../lib/cjs-modules.js";
2
- import path from "node:path";
3
- export async function addGlossaryTerm(input) {
4
- const { vaultPath, term, definition, domain } = input;
5
- const glossaryPath = path.join(vaultPath, "Knowledge/Glossary.md");
6
- if (!(await fs.pathExists(glossaryPath))) {
7
- throw new Error(`Glossary not found at: ${glossaryPath}`);
8
- }
9
- let content = await fs.readFile(glossaryPath, "utf-8");
10
- const newRow = `| **${term}** | ${definition} | ${domain ?? ""} |`;
11
- // Find the glossary table (Term | Definition | Domain)
12
- const tableMatch = content.match(/(\| Term \| Definition \| Domain \|\n\|------\|-----------|--------\|\n)([\s\S]*?)(\n*$)/);
13
- if (tableMatch) {
14
- const [fullMatch, tableHeader, existingRows, trailing] = tableMatch;
15
- const updatedRows = existingRows.trim()
16
- ? `${existingRows.trim()}\n${newRow}`
17
- : newRow;
18
- content = content.replace(fullMatch, `${tableHeader}${updatedRows}\n`);
19
- }
20
- else {
21
- // Fallback: append to end of file
22
- content = content.trimEnd() + `\n${newRow}\n`;
23
- }
24
- await fs.writeFile(glossaryPath, content);
25
- return { glossaryPath, termAdded: term };
26
- }
27
- //# sourceMappingURL=glossary.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"glossary.js","sourceRoot":"","sources":["../../src/vault/glossary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,uBAAuB,CAAC;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAC;AAQ7B,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAA2B;IAE3B,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAEtD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;IACnE,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,0BAA0B,YAAY,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAEvD,MAAM,MAAM,GAAG,OAAO,IAAI,QAAQ,UAAU,MAAM,MAAM,IAAI,EAAE,IAAI,CAAC;IAEnE,uDAAuD;IACvD,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAC9B,0FAA0F,CAC3F,CAAC;IAEF,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC;QACpE,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,EAAE;YACrC,CAAC,CAAC,GAAG,YAAY,CAAC,IAAI,EAAE,KAAK,MAAM,EAAE;YACrC,CAAC,CAAC,MAAM,CAAC;QACX,OAAO,GAAG,OAAO,CAAC,OAAO,CACvB,SAAS,EACT,GAAG,WAAW,GAAG,WAAW,IAAI,CACjC,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,kCAAkC;QAClC,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,KAAK,MAAM,IAAI,CAAC;IAChD,CAAC;IAED,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAE1C,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC3C,CAAC"}
@@ -1,83 +0,0 @@
1
- import path from "node:path";
2
- import { isObsidianCliAvailable, execObsidianCmd } from "./obsidian-cli.js";
3
- import { DEFAULT_RESULT_LIMIT } from "./retrieval-types.js";
4
- const ALL_CHECKS = ["orphans", "unresolved", "deadends"];
5
- /** Parse CLI output lines into result items for a given check type. */
6
- function parseCheckOutput(check, output) {
7
- const lines = output.split("\n").filter((l) => l.trim().length > 0);
8
- return lines.map((line) => {
9
- const trimmed = line.trim();
10
- // For orphans/deadends: output is file paths
11
- // For unresolved: output is link target names
12
- const isPath = trimmed.includes("/") || trimmed.endsWith(".md");
13
- const title = isPath ? path.basename(trimmed, ".md") : trimmed;
14
- return {
15
- title,
16
- path: isPath ? trimmed : "",
17
- file: title,
18
- metadata: { check },
19
- };
20
- });
21
- }
22
- /**
23
- * Run graph health diagnostics using Obsidian CLI.
24
- * Returns runtime_unavailable if CLI is not available — no internal fallback.
25
- */
26
- export async function getGraphHealth(input) {
27
- const { vaultPath, check = "all", limit = DEFAULT_RESULT_LIMIT } = input;
28
- const mode = "graph-health";
29
- const base = {
30
- mode,
31
- vault: vaultPath,
32
- fallback: "none",
33
- };
34
- // 1. Check CLI availability
35
- if (!isObsidianCliAvailable()) {
36
- return {
37
- ...base,
38
- status: "runtime_unavailable",
39
- summary: "Obsidian CLI not available",
40
- results: [],
41
- truncated: false,
42
- diagnostics: ["Obsidian CLI not available"],
43
- };
44
- }
45
- // 2. Determine which checks to run
46
- const checks = check === "all" ? ALL_CHECKS : [check];
47
- // 3. Run each check and collect results
48
- const allItems = [];
49
- const diagnostics = [];
50
- for (const checkType of checks) {
51
- const cliResult = execObsidianCmd([checkType, "--vault", vaultPath]);
52
- if (!cliResult.success) {
53
- diagnostics.push(`${checkType} check failed: ${cliResult.error ?? "unknown error"}`);
54
- continue;
55
- }
56
- if (cliResult.output.trim().length > 0) {
57
- allItems.push(...parseCheckOutput(checkType, cliResult.output));
58
- }
59
- }
60
- // 4. Build response
61
- if (allItems.length === 0 && diagnostics.length === 0) {
62
- return {
63
- ...base,
64
- status: "no_results",
65
- summary: "No issues found — vault graph is healthy",
66
- results: [],
67
- truncated: false,
68
- diagnostics,
69
- };
70
- }
71
- const truncated = allItems.length > limit;
72
- const results = allItems.slice(0, limit);
73
- return {
74
- ...base,
75
- status: allItems.length > 0 ? "ok" : "no_results",
76
- summary: `Found ${allItems.length} graph issues across ${checks.join(", ")} checks`,
77
- results,
78
- truncated,
79
- totalMatches: allItems.length,
80
- diagnostics,
81
- };
82
- }
83
- //# sourceMappingURL=graph-health.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"graph-health.js","sourceRoot":"","sources":["../../src/vault/graph-health.ts"],"names":[],"mappings":"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"}
@@ -1,67 +0,0 @@
1
- import { fs } from "../lib/cjs-modules.js";
2
- import path from "node:path";
3
- export async function addMember(input) {
4
- const { vaultPath, name, role, team } = input;
5
- let wikilinksAdded = 0;
6
- // 1. Create person note
7
- const personPath = path.join(vaultPath, `People/${name}.md`);
8
- if (await fs.pathExists(personPath)) {
9
- throw new Error(`Person note already exists: ${personPath}`);
10
- }
11
- const content = `---
12
- title: "${name}"
13
- type: person
14
- team: "${team}"
15
- role: "${role}"
16
- status: active
17
- tags: [person]
18
- ---
19
-
20
- # ${name}
21
-
22
- **Role**: ${role}
23
- **Team**: ${team}
24
- `;
25
- await fs.writeFile(personPath, content);
26
- // 2. Update team index if it exists
27
- const teamFiles = await fs.readdir(path.join(vaultPath, "People"));
28
- const teamIndexFile = teamFiles.find((f) => f.endsWith("Team.md"));
29
- if (teamIndexFile) {
30
- const teamIndexPath = path.join(vaultPath, "People", teamIndexFile);
31
- let teamContent = await fs.readFile(teamIndexPath, "utf-8");
32
- // Add to members table
33
- const tableRow = `| [[${name}]] | ${role} |`;
34
- if (teamContent.includes("|------|------|")) {
35
- // Insert after the table header separator
36
- teamContent = teamContent.replace(/(^\|------|------\|$)/m, `$1\n${tableRow}`);
37
- wikilinksAdded++;
38
- }
39
- await fs.writeFile(teamIndexPath, teamContent);
40
- }
41
- // 3. Update AGENTS.md wikilinks (check AGENTS.md first, fallback to AGENT.md)
42
- for (const agentFile of ["AGENTS.md", "AGENT.md"]) {
43
- const agentPath = path.join(vaultPath, agentFile);
44
- if (await fs.pathExists(agentPath)) {
45
- let agentContent = await fs.readFile(agentPath, "utf-8");
46
- // Replace placeholder if present
47
- if (agentContent.includes("(No members added yet")) {
48
- const table = `| Name | Role |\n|------|------|\n| [[${name}]] | ${role} |`;
49
- agentContent = agentContent.replace(/\(No members added yet[^)]*\)/, table);
50
- wikilinksAdded++;
51
- }
52
- else if (agentContent.includes("|------|------|")) {
53
- // Find the team table section and add a row
54
- const teamSectionMatch = agentContent.match(/## Team[^\n]*\n[\s\S]*?(\|------|------\|[^\n]*(?:\n\|[^\n]*)*)/);
55
- if (teamSectionMatch) {
56
- const existingTable = teamSectionMatch[1];
57
- const newTable = existingTable + `\n| [[${name}]] | ${role} |`;
58
- agentContent = agentContent.replace(existingTable, newTable);
59
- wikilinksAdded++;
60
- }
61
- }
62
- await fs.writeFile(agentPath, agentContent);
63
- }
64
- }
65
- return { filePath: personPath, wikilinksAdded };
66
- }
67
- //# sourceMappingURL=member.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"member.js","sourceRoot":"","sources":["../../src/vault/member.ts"],"names":[],"mappings":"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"}