@jayjiang/byoao 0.2.3 → 0.3.1

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 (48) hide show
  1. package/dist/__tests__/plugin-config.test.js +130 -0
  2. package/dist/__tests__/plugin-config.test.js.map +1 -0
  3. package/dist/cli/cli-program.js +198 -11
  4. package/dist/cli/cli-program.js.map +1 -1
  5. package/dist/cli/installer.js +39 -30
  6. package/dist/cli/installer.js.map +1 -1
  7. package/dist/cli/ui.js +23 -0
  8. package/dist/cli/ui.js.map +1 -1
  9. package/dist/hooks/__tests__/idle-suggestions.test.js +15 -0
  10. package/dist/hooks/__tests__/idle-suggestions.test.js.map +1 -0
  11. package/dist/index.js +2 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/plugin-config.js +11 -0
  14. package/dist/plugin-config.js.map +1 -1
  15. package/dist/tools/init-vault.js +56 -0
  16. package/dist/tools/init-vault.js.map +1 -1
  17. package/dist/tools/switch-provider.js +34 -0
  18. package/dist/tools/switch-provider.js.map +1 -0
  19. package/dist/vault/__tests__/create.test.js +130 -0
  20. package/dist/vault/__tests__/create.test.js.map +1 -0
  21. package/dist/vault/__tests__/doctor.test.js +88 -0
  22. package/dist/vault/__tests__/doctor.test.js.map +1 -0
  23. package/dist/vault/__tests__/glossary.test.js +57 -0
  24. package/dist/vault/__tests__/glossary.test.js.map +1 -0
  25. package/dist/vault/__tests__/mcp.test.js +88 -0
  26. package/dist/vault/__tests__/mcp.test.js.map +1 -0
  27. package/dist/vault/__tests__/member.test.js +87 -0
  28. package/dist/vault/__tests__/member.test.js.map +1 -0
  29. package/dist/vault/__tests__/obsidian-plugins.test.js +366 -0
  30. package/dist/vault/__tests__/obsidian-plugins.test.js.map +1 -0
  31. package/dist/vault/__tests__/provider.test.js +82 -0
  32. package/dist/vault/__tests__/provider.test.js.map +1 -0
  33. package/dist/vault/__tests__/status.test.js +134 -0
  34. package/dist/vault/__tests__/status.test.js.map +1 -0
  35. package/dist/vault/__tests__/template.test.js +33 -0
  36. package/dist/vault/__tests__/template.test.js.map +1 -0
  37. package/dist/vault/create.js +128 -18
  38. package/dist/vault/create.js.map +1 -1
  39. package/dist/vault/mcp.js +31 -0
  40. package/dist/vault/mcp.js.map +1 -0
  41. package/dist/vault/obsidian-plugins.js +209 -0
  42. package/dist/vault/obsidian-plugins.js.map +1 -0
  43. package/dist/vault/opencode-config.js +36 -0
  44. package/dist/vault/opencode-config.js.map +1 -0
  45. package/dist/vault/provider.js +67 -0
  46. package/dist/vault/provider.js.map +1 -0
  47. package/package.json +7 -2
  48. package/src/assets/presets/pm-tpm/preset.json +25 -1
@@ -0,0 +1,82 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
2
+ import fs from "fs-extra";
3
+ import path from "node:path";
4
+ import os from "node:os";
5
+ let tmpDir;
6
+ let configPath;
7
+ beforeEach(async () => {
8
+ tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "byoao-provider-"));
9
+ configPath = path.join(tmpDir, ".config/opencode/opencode.json");
10
+ await fs.ensureDir(path.dirname(configPath));
11
+ vi.spyOn(os, "homedir").mockReturnValue(tmpDir);
12
+ });
13
+ afterEach(async () => {
14
+ vi.restoreAllMocks();
15
+ vi.resetModules();
16
+ await fs.remove(tmpDir);
17
+ });
18
+ async function loadConfigureProvider() {
19
+ const mod = await import("../provider.js");
20
+ return mod.configureProvider;
21
+ }
22
+ describe("configureProvider", () => {
23
+ it("returns no-op result for copilot (no config changes needed)", async () => {
24
+ const configureProvider = await loadConfigureProvider();
25
+ const result = await configureProvider("copilot");
26
+ expect(result).not.toBeNull();
27
+ expect(result.provider).toBe("copilot");
28
+ expect(result.pluginAdded).toBe(false);
29
+ expect(result.projectIdSet).toBe(false);
30
+ });
31
+ it("adds gemini plugin and projectId to empty config", async () => {
32
+ const configureProvider = await loadConfigureProvider();
33
+ const result = await configureProvider("gemini", "wonder-sandbox");
34
+ expect(result).not.toBeNull();
35
+ expect(result.provider).toBe("gemini");
36
+ expect(result.pluginAdded).toBe(true);
37
+ expect(result.projectIdSet).toBe(true);
38
+ const written = await fs.readJson(configPath);
39
+ expect(written.plugin).toContain("opencode-gemini-auth");
40
+ expect(written.provider.google.options.projectId).toBe("wonder-sandbox");
41
+ });
42
+ it("skips gemini plugin if already present (idempotent)", async () => {
43
+ await fs.writeJson(configPath, {
44
+ plugin: ["opencode-gemini-auth"],
45
+ provider: { google: { options: { projectId: "existing-project" } } },
46
+ });
47
+ const configureProvider = await loadConfigureProvider();
48
+ const result = await configureProvider("gemini", "new-project");
49
+ expect(result.pluginSkipped).toBe(true);
50
+ expect(result.projectIdSkipped).toBe(true);
51
+ // Original projectId preserved
52
+ const written = await fs.readJson(configPath);
53
+ expect(written.provider.google.options.projectId).toBe("existing-project");
54
+ });
55
+ it("preserves other config fields when writing", async () => {
56
+ await fs.writeJson(configPath, {
57
+ theme: "dark",
58
+ mcp: { atlassian: { type: "remote", url: "https://example.com" } },
59
+ });
60
+ const configureProvider = await loadConfigureProvider();
61
+ await configureProvider("gemini", "wonder-sandbox");
62
+ const written = await fs.readJson(configPath);
63
+ expect(written.theme).toBe("dark");
64
+ expect(written.mcp.atlassian.url).toBe("https://example.com");
65
+ expect(written.provider.google.options.projectId).toBe("wonder-sandbox");
66
+ });
67
+ it("throws if gemini selected without projectId", async () => {
68
+ const configureProvider = await loadConfigureProvider();
69
+ await expect(configureProvider("gemini")).rejects.toThrow("GCP Project ID is required");
70
+ });
71
+ it("adds gemini plugin to existing plugin array", async () => {
72
+ await fs.writeJson(configPath, {
73
+ plugin: ["superpowers@git+https://github.com/obra/superpowers.git"],
74
+ });
75
+ const configureProvider = await loadConfigureProvider();
76
+ await configureProvider("gemini", "wonder-sandbox");
77
+ const written = await fs.readJson(configPath);
78
+ expect(written.plugin).toContain("opencode-gemini-auth");
79
+ expect(written.plugin).toContain("superpowers@git+https://github.com/obra/superpowers.git");
80
+ });
81
+ });
82
+ //# sourceMappingURL=provider.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.test.js","sourceRoot":"","sources":["../../../src/vault/__tests__/provider.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,IAAI,MAAc,CAAC;AACnB,IAAI,UAAkB,CAAC;AAEvB,UAAU,CAAC,KAAK,IAAI,EAAE;IACpB,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACrE,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,gCAAgC,CAAC,CAAC;IACjE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAC7C,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;AAClD,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,EAAE,CAAC,eAAe,EAAE,CAAC;IACrB,EAAE,CAAC,YAAY,EAAE,CAAC;IAClB,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEH,KAAK,UAAU,qBAAqB;IAClC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAC3C,OAAO,GAAG,CAAC,iBAAiB,CAAC;AAC/B,CAAC;AAED,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,iBAAiB,GAAG,MAAM,qBAAqB,EAAE,CAAC;QACxD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,CAAC,MAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,CAAC,MAAO,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,iBAAiB,GAAG,MAAM,qBAAqB,EAAE,CAAC;QACxD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;QACnE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,CAAC,MAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,MAAO,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAExC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE;YAC7B,MAAM,EAAE,CAAC,sBAAsB,CAAC;YAChC,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,kBAAkB,EAAE,EAAE,EAAE;SACrE,CAAC,CAAC;QAEH,MAAM,iBAAiB,GAAG,MAAM,qBAAqB,EAAE,CAAC;QACxD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAChE,MAAM,CAAC,MAAO,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,MAAO,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE5C,+BAA+B;QAC/B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE;YAC7B,KAAK,EAAE,MAAM;YACb,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,qBAAqB,EAAE,EAAE;SACnE,CAAC,CAAC;QAEH,MAAM,iBAAiB,GAAG,MAAM,qBAAqB,EAAE,CAAC;QACxD,MAAM,iBAAiB,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;QAEpD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC9D,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,iBAAiB,GAAG,MAAM,qBAAqB,EAAE,CAAC;QACxD,MAAM,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACvD,4BAA4B,CAC7B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE;YAC7B,MAAM,EAAE,CAAC,yDAAyD,CAAC;SACpE,CAAC,CAAC;QAEH,MAAM,iBAAiB,GAAG,MAAM,qBAAqB,EAAE,CAAC;QACxD,MAAM,iBAAiB,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;QAEpD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,SAAS,CAC9B,yDAAyD,CAC1D,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,134 @@
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 { getVaultStatus, formatVaultStatus } from "../status.js";
6
+ let tmpDir;
7
+ beforeEach(async () => {
8
+ tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "byoao-status-"));
9
+ });
10
+ afterEach(async () => {
11
+ await fs.remove(tmpDir);
12
+ });
13
+ describe("getVaultStatus", () => {
14
+ it("returns exists: false for non-existent path", async () => {
15
+ const status = await getVaultStatus("/nonexistent/path");
16
+ expect(status.exists).toBe(false);
17
+ expect(status.noteCount).toBe(0);
18
+ });
19
+ it("counts markdown files", async () => {
20
+ await fs.ensureDir(path.join(tmpDir, "People"));
21
+ await fs.writeFile(path.join(tmpDir, "note1.md"), "# Note 1");
22
+ await fs.writeFile(path.join(tmpDir, "People/alice.md"), "# Alice");
23
+ await fs.writeFile(path.join(tmpDir, "readme.txt"), "not markdown");
24
+ const status = await getVaultStatus(tmpDir);
25
+ expect(status.noteCount).toBe(2);
26
+ });
27
+ it("counts wikilinks and detects broken ones", async () => {
28
+ await fs.ensureDir(path.join(tmpDir, "People"));
29
+ await fs.writeFile(path.join(tmpDir, "note1.md"), "See [[Alice]] and [[Bob]]");
30
+ await fs.writeFile(path.join(tmpDir, "People/Alice.md"), "# Alice");
31
+ const status = await getVaultStatus(tmpDir);
32
+ expect(status.wikilinkCount).toBe(2);
33
+ expect(status.brokenLinks).toContain("Bob");
34
+ expect(status.brokenLinks).not.toContain("Alice");
35
+ });
36
+ it("extracts aliased wikilinks", async () => {
37
+ await fs.writeFile(path.join(tmpDir, "note.md"), "See [[Alice|team lead]]");
38
+ const status = await getVaultStatus(tmpDir);
39
+ expect(status.wikilinkCount).toBe(1);
40
+ expect(status.brokenLinks).toContain("Alice");
41
+ });
42
+ it("ignores wikilinks inside code blocks", async () => {
43
+ const content = [
44
+ "Real link: [[Alice]]",
45
+ "```",
46
+ "[[InCodeBlock]]",
47
+ "```",
48
+ "Inline: `[[InlineCode]]`",
49
+ ].join("\n");
50
+ await fs.writeFile(path.join(tmpDir, "note.md"), content);
51
+ const status = await getVaultStatus(tmpDir);
52
+ expect(status.wikilinkCount).toBe(1);
53
+ expect(status.brokenLinks).toEqual(["Alice"]);
54
+ });
55
+ it("reports directory breakdown for known dirs", async () => {
56
+ await fs.ensureDir(path.join(tmpDir, "People"));
57
+ await fs.ensureDir(path.join(tmpDir, "Projects"));
58
+ await fs.writeFile(path.join(tmpDir, "People/a.md"), "# A");
59
+ await fs.writeFile(path.join(tmpDir, "People/b.md"), "# B");
60
+ await fs.writeFile(path.join(tmpDir, "Projects/x.md"), "# X");
61
+ const status = await getVaultStatus(tmpDir);
62
+ expect(status.directories["People"]).toBe(2);
63
+ expect(status.directories["Projects"]).toBe(1);
64
+ });
65
+ it("detects config files", async () => {
66
+ await fs.ensureDir(path.join(tmpDir, ".obsidian"));
67
+ await fs.ensureDir(path.join(tmpDir, "Knowledge"));
68
+ await fs.writeFile(path.join(tmpDir, "AGENT.md"), "# Agent");
69
+ await fs.writeFile(path.join(tmpDir, "Knowledge/Glossary.md"), "# Glossary");
70
+ const status = await getVaultStatus(tmpDir);
71
+ expect(status.hasObsidianConfig).toBe(true);
72
+ expect(status.hasAgentMd).toBe(true);
73
+ expect(status.hasGlossary).toBe(true);
74
+ });
75
+ it("reports false for missing config files", async () => {
76
+ await fs.writeFile(path.join(tmpDir, "note.md"), "# Note");
77
+ const status = await getVaultStatus(tmpDir);
78
+ expect(status.hasObsidianConfig).toBe(false);
79
+ expect(status.hasAgentMd).toBe(false);
80
+ expect(status.hasGlossary).toBe(false);
81
+ });
82
+ });
83
+ describe("formatVaultStatus", () => {
84
+ it("formats non-existent vault", () => {
85
+ const status = {
86
+ exists: false,
87
+ vaultPath: "/fake/path",
88
+ noteCount: 0,
89
+ wikilinkCount: 0,
90
+ brokenLinks: [],
91
+ directories: {},
92
+ hasObsidianConfig: false,
93
+ hasAgentMd: false,
94
+ hasGlossary: false,
95
+ };
96
+ expect(formatVaultStatus(status)).toContain("not found");
97
+ });
98
+ it("formats existing vault with stats", () => {
99
+ const status = {
100
+ exists: true,
101
+ vaultPath: "/my/vault",
102
+ noteCount: 10,
103
+ wikilinkCount: 25,
104
+ brokenLinks: [],
105
+ directories: { People: 3, Projects: 2 },
106
+ hasObsidianConfig: true,
107
+ hasAgentMd: true,
108
+ hasGlossary: false,
109
+ };
110
+ const output = formatVaultStatus(status);
111
+ expect(output).toContain("Notes: 10");
112
+ expect(output).toContain("Wikilinks: 25");
113
+ expect(output).toContain("People: 3 notes");
114
+ expect(output).toContain("✓");
115
+ expect(output).toContain("No broken links");
116
+ });
117
+ it("formats broken links section", () => {
118
+ const status = {
119
+ exists: true,
120
+ vaultPath: "/my/vault",
121
+ noteCount: 5,
122
+ wikilinkCount: 10,
123
+ brokenLinks: ["Missing1", "Missing2"],
124
+ directories: {},
125
+ hasObsidianConfig: false,
126
+ hasAgentMd: false,
127
+ hasGlossary: false,
128
+ };
129
+ const output = formatVaultStatus(status);
130
+ expect(output).toContain("Broken links (2)");
131
+ expect(output).toContain("[[Missing1]]");
132
+ });
133
+ });
134
+ //# sourceMappingURL=status.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.test.js","sourceRoot":"","sources":["../../../src/vault/__tests__/status.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { renderTemplate, today } from "../template.js";
3
+ describe("renderTemplate", () => {
4
+ it("renders simple variables", () => {
5
+ expect(renderTemplate("Hello {{name}}", { name: "World" })).toBe("Hello World");
6
+ });
7
+ it("leaves missing variables as empty string", () => {
8
+ expect(renderTemplate("Hello {{name}}", {})).toBe("Hello ");
9
+ });
10
+ it("renders conditionals", () => {
11
+ const tpl = "{{#if show}}visible{{/if}}";
12
+ expect(renderTemplate(tpl, { show: true })).toBe("visible");
13
+ expect(renderTemplate(tpl, { show: false })).toBe("");
14
+ });
15
+ it("does not escape HTML (noEscape mode)", () => {
16
+ expect(renderTemplate("{{val}}", { val: "<b>bold</b>" })).toBe("<b>bold</b>");
17
+ });
18
+ it("renders each blocks", () => {
19
+ const tpl = "{{#each items}}{{this}}\n{{/each}}";
20
+ expect(renderTemplate(tpl, { items: ["a", "b"] })).toBe("a\nb\n");
21
+ });
22
+ });
23
+ describe("today", () => {
24
+ it("returns YYYY-MM-DD format", () => {
25
+ const result = today();
26
+ expect(result).toMatch(/^\d{4}-\d{2}-\d{2}$/);
27
+ });
28
+ it("returns today's date", () => {
29
+ const expected = new Date().toISOString().slice(0, 10);
30
+ expect(today()).toBe(expected);
31
+ });
32
+ });
33
+ //# sourceMappingURL=template.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.test.js","sourceRoot":"","sources":["../../../src/vault/__tests__/template.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,cAAc,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAC9D,aAAa,CACd,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,cAAc,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,GAAG,GAAG,4BAA4B,CAAC;QACzC,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5D,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,CAC5D,aAAa,CACd,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,MAAM,GAAG,GAAG,oCAAoC,CAAC;QACjD,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,MAAM,GAAG,KAAK,EAAE,CAAC;QACvB,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -2,6 +2,16 @@ import fs from "fs-extra";
2
2
  import path from "node:path";
3
3
  import { renderTemplate, today } from "./template.js";
4
4
  import { loadPreset, getCommonDir } from "./preset.js";
5
+ import { configureMcp } from "./mcp.js";
6
+ import { configureObsidianPlugins } from "./obsidian-plugins.js";
7
+ import { configureProvider } from "./provider.js";
8
+ function countWikilinks(content) {
9
+ const stripped = content
10
+ .replace(/```[\s\S]*?```/g, "")
11
+ .replace(/`[^`]+`/g, "");
12
+ const matches = stripped.match(/\[\[([^\]|]+)(?:\|[^\]]+)?\]\]/g);
13
+ return matches ? matches.length : 0;
14
+ }
5
15
  // Common directories shared by all presets
6
16
  const COMMON_DIRECTORIES = [
7
17
  "Inbox",
@@ -20,7 +30,6 @@ export async function createVault(config) {
20
30
  const commonDir = getCommonDir();
21
31
  const presetDir = path.join(presetsDir, presetName);
22
32
  let filesCreated = 0;
23
- let wikilinksCreated = 0;
24
33
  // Merge directories: common + preset-specific
25
34
  const allDirectories = [...COMMON_DIRECTORIES, ...presetConfig.directories];
26
35
  // 1. Create directories
@@ -70,13 +79,19 @@ export async function createVault(config) {
70
79
  date: today(),
71
80
  GLOSSARY_ENTRIES: glossaryRows,
72
81
  });
73
- await fs.writeFile(path.join(vaultPath, "Knowledge/Glossary.md"), glossaryContent);
74
- filesCreated++;
82
+ const glossaryPath = path.join(vaultPath, "Knowledge/Glossary.md");
83
+ if (!(await fs.pathExists(glossaryPath))) {
84
+ await fs.writeFile(glossaryPath, glossaryContent);
85
+ filesCreated++;
86
+ }
75
87
  // 5. Generate Start Here.md
76
88
  const startHereTemplate = await fs.readFile(path.join(commonDir, "Start Here.md.hbs"), "utf-8");
77
89
  const startHereContent = renderTemplate(startHereTemplate, { TEAM_NAME: teamName });
78
- await fs.writeFile(path.join(vaultPath, "Start Here.md"), startHereContent);
79
- filesCreated++;
90
+ const startHerePath = path.join(vaultPath, "Start Here.md");
91
+ if (!(await fs.pathExists(startHerePath))) {
92
+ await fs.writeFile(startHerePath, startHereContent);
93
+ filesCreated++;
94
+ }
80
95
  // 6. Generate AGENT.md (two-layer: common skeleton + preset section)
81
96
  const agentSkeletonTemplate = await fs.readFile(path.join(commonDir, "AGENT.md.hbs"), "utf-8");
82
97
  // Render preset agent-section
@@ -89,7 +104,6 @@ export async function createVault(config) {
89
104
  projectsList = projects
90
105
  .map((p) => `- [[${p.name}]] — ${p.description}`)
91
106
  .join("\n");
92
- wikilinksCreated += projects.length;
93
107
  }
94
108
  else {
95
109
  projectsList = "(No projects added yet — create notes in Projects/)";
@@ -106,7 +120,6 @@ export async function createVault(config) {
106
120
  if (members.length > 0) {
107
121
  const rows = members.map((m) => `| [[${m.name}]] | ${m.role} |`).join("\n");
108
122
  teamTable = `| Name | Role |\n|------|------|\n${rows}`;
109
- wikilinksCreated += members.length;
110
123
  }
111
124
  else {
112
125
  teamTable = "(No members added yet — create notes in People/)";
@@ -120,9 +133,16 @@ export async function createVault(config) {
120
133
  TEAM_TABLE: teamTable,
121
134
  TEMPLATE_LIST: templateList,
122
135
  });
123
- await fs.writeFile(path.join(vaultPath, "AGENT.md"), agentContent);
124
- await fs.writeFile(path.join(vaultPath, "CLAUDE.md"), agentContent);
125
- filesCreated += 2;
136
+ const agentMdPath = path.join(vaultPath, "AGENT.md");
137
+ const claudeMdPath = path.join(vaultPath, "CLAUDE.md");
138
+ if (!(await fs.pathExists(agentMdPath))) {
139
+ await fs.writeFile(agentMdPath, agentContent);
140
+ filesCreated++;
141
+ }
142
+ if (!(await fs.pathExists(claudeMdPath))) {
143
+ await fs.writeFile(claudeMdPath, agentContent);
144
+ filesCreated++;
145
+ }
126
146
  // 7. Create people notes
127
147
  for (const member of members) {
128
148
  const content = `---
@@ -139,8 +159,11 @@ tags: [person]
139
159
  **Role**: ${member.role}
140
160
  **Team**: ${teamName}
141
161
  `;
142
- await fs.writeFile(path.join(vaultPath, `People/${member.name}.md`), content);
143
- filesCreated++;
162
+ const memberPath = path.join(vaultPath, `People/${member.name}.md`);
163
+ if (!(await fs.pathExists(memberPath))) {
164
+ await fs.writeFile(memberPath, content);
165
+ filesCreated++;
166
+ }
144
167
  }
145
168
  // 8. Create project notes
146
169
  for (const project of projects) {
@@ -160,8 +183,11 @@ tags: [project]
160
183
 
161
184
  ${project.description}
162
185
  `;
163
- await fs.writeFile(path.join(vaultPath, `Projects/${project.name}.md`), content);
164
- filesCreated++;
186
+ const projectPath = path.join(vaultPath, `Projects/${project.name}.md`);
187
+ if (!(await fs.pathExists(projectPath))) {
188
+ await fs.writeFile(projectPath, content);
189
+ filesCreated++;
190
+ }
165
191
  }
166
192
  // 9. Create team index (always, since Start Here.md links to it)
167
193
  {
@@ -180,7 +206,6 @@ tags: [team]
180
206
  if (members.length > 0) {
181
207
  teamIndexContent += "| Name | Role |\n|------|------|\n";
182
208
  teamIndexContent += members.map((m) => `| [[${m.name}]] | ${m.role} |`).join("\n");
183
- wikilinksCreated += members.length;
184
209
  }
185
210
  else {
186
211
  teamIndexContent += "(No members added yet)";
@@ -190,14 +215,16 @@ tags: [team]
190
215
  teamIndexContent += projects
191
216
  .map((p) => `- [[${p.name}]] — ${p.description}`)
192
217
  .join("\n");
193
- wikilinksCreated += projects.length;
194
218
  }
195
219
  else {
196
220
  teamIndexContent += "(No projects added yet)";
197
221
  }
198
222
  teamIndexContent += "\n";
199
- await fs.writeFile(path.join(vaultPath, `People/${teamName} Team.md`), teamIndexContent);
200
- filesCreated++;
223
+ const teamIndexPath = path.join(vaultPath, `People/${teamName} Team.md`);
224
+ if (!(await fs.pathExists(teamIndexPath))) {
225
+ await fs.writeFile(teamIndexPath, teamIndexContent);
226
+ filesCreated++;
227
+ }
201
228
  }
202
229
  // 10. Create .gitkeep in empty directories
203
230
  const dirsNeedingGitkeep = [
@@ -220,11 +247,94 @@ tags: [team]
220
247
  }
221
248
  }
222
249
  }
250
+ // 11. Configure vault as OpenCode project (plugin + skills + commands)
251
+ await configureOpenCodeProject(vaultPath);
252
+ // 12. Configure MCP servers in global OpenCode config
253
+ const mcpResult = await configureMcp(presetConfig);
254
+ // 13. Install Obsidian community plugins from preset
255
+ const pluginsResult = await configureObsidianPlugins(vaultPath, presetConfig);
256
+ // 14. Configure AI provider in global OpenCode config
257
+ let providerResult = null;
258
+ if (config.provider && config.provider !== "skip") {
259
+ providerResult = await configureProvider(config.provider, config.provider === "gemini" ? config.gcpProjectId : undefined);
260
+ }
261
+ // 15. Count wikilinks from all generated markdown files
262
+ let wikilinksCreated = 0;
263
+ const entries = await fs.readdir(vaultPath, { recursive: true });
264
+ for (const entry of entries) {
265
+ const entryStr = String(entry);
266
+ if (entryStr.endsWith(".md") && !entryStr.startsWith(".obsidian")) {
267
+ const content = await fs.readFile(path.join(vaultPath, entryStr), "utf-8");
268
+ wikilinksCreated += countWikilinks(content);
269
+ }
270
+ }
223
271
  return {
224
272
  vaultPath,
225
273
  filesCreated,
226
274
  wikilinksCreated,
227
275
  directories: allDirectories,
276
+ mcpResult,
277
+ pluginsResult,
278
+ providerResult,
228
279
  };
229
280
  }
281
+ /**
282
+ * Configure the vault directory as an OpenCode project.
283
+ * Creates .opencode.json with BYOAO plugin registered,
284
+ * and copies skills + commands so BYOAO tools work when
285
+ * OpenCode is launched from the vault (including via Agent Client).
286
+ */
287
+ async function configureOpenCodeProject(vaultPath) {
288
+ // 1. Write .opencode.json with BYOAO plugin
289
+ const configPath = path.join(vaultPath, ".opencode.json");
290
+ let config = {};
291
+ if (await fs.pathExists(configPath)) {
292
+ try {
293
+ config = await fs.readJson(configPath);
294
+ }
295
+ catch {
296
+ // Invalid JSON — start fresh
297
+ }
298
+ }
299
+ const plugins = config.plugin || [];
300
+ if (!plugins.includes("byoao")) {
301
+ plugins.push("byoao");
302
+ config.plugin = plugins;
303
+ }
304
+ await fs.writeJson(configPath, config, { spaces: 2 });
305
+ // 2. Copy Obsidian Skills
306
+ const assetsDir = resolveAssetsDir();
307
+ const obsidianSkillsSrc = path.join(assetsDir, "obsidian-skills");
308
+ const skillsDest = path.join(vaultPath, ".opencode", "skills");
309
+ if (await fs.pathExists(obsidianSkillsSrc)) {
310
+ await fs.ensureDir(skillsDest);
311
+ const files = await fs.readdir(obsidianSkillsSrc);
312
+ for (const file of files) {
313
+ if (file.endsWith(".md")) {
314
+ await fs.copy(path.join(obsidianSkillsSrc, file), path.join(skillsDest, file), { overwrite: true });
315
+ }
316
+ }
317
+ }
318
+ // 3. Copy BYOAO commands
319
+ const byoaoSkillsSrc = path.join(assetsDir, "..", "skills");
320
+ const commandsDest = path.join(vaultPath, ".opencode", "commands");
321
+ if (await fs.pathExists(byoaoSkillsSrc)) {
322
+ await fs.ensureDir(commandsDest);
323
+ const files = await fs.readdir(byoaoSkillsSrc);
324
+ for (const file of files) {
325
+ if (file.endsWith(".md")) {
326
+ await fs.copy(path.join(byoaoSkillsSrc, file), path.join(commandsDest, file), { overwrite: true });
327
+ }
328
+ }
329
+ }
330
+ }
331
+ function resolveAssetsDir() {
332
+ const srcAssets = path.resolve(import.meta.dirname, "..", "assets");
333
+ const distAssets = path.resolve(import.meta.dirname, "..", "..", "src", "assets");
334
+ if (fs.existsSync(srcAssets))
335
+ return srcAssets;
336
+ if (fs.existsSync(distAssets))
337
+ return distAssets;
338
+ return srcAssets;
339
+ }
230
340
  //# sourceMappingURL=create.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/vault/create.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/vault/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { findOpencodeConfig, readOpencodeConfig, writeOpencodeConfig, } from "./opencode-config.js";
2
+ /**
3
+ * Merge a preset's MCP servers into the global OpenCode config.
4
+ * Preserves existing entries — only adds servers not already configured.
5
+ */
6
+ export async function configureMcp(presetConfig) {
7
+ const mcpServers = presetConfig.mcpServers;
8
+ if (!mcpServers || Object.keys(mcpServers).length === 0) {
9
+ return null;
10
+ }
11
+ const configPath = findOpencodeConfig();
12
+ const config = await readOpencodeConfig();
13
+ const existingMcp = config.mcp || {};
14
+ const serversAdded = [];
15
+ const serversSkipped = [];
16
+ for (const [name, serverConfig] of Object.entries(mcpServers)) {
17
+ if (existingMcp[name]) {
18
+ serversSkipped.push(name);
19
+ }
20
+ else {
21
+ existingMcp[name] = serverConfig;
22
+ serversAdded.push(name);
23
+ }
24
+ }
25
+ if (serversAdded.length > 0) {
26
+ config.mcp = existingMcp;
27
+ await writeOpencodeConfig(config);
28
+ }
29
+ return { configPath, serversAdded, serversSkipped };
30
+ }
31
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/vault/mcp.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAQ9B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,YAA0B;IAE1B,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;IAC3C,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,kBAAkB,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAE1C,MAAM,WAAW,GAAI,MAAM,CAAC,GAA+B,IAAI,EAAE,CAAC;IAClE,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,cAAc,GAAa,EAAE,CAAC;IAEpC,KAAK,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9D,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC;YACjC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,GAAG,WAAW,CAAC;QACzB,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC;AACtD,CAAC"}