@jayjiang/byoao 0.4.0 → 0.6.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 (61) hide show
  1. package/dist/__tests__/plugin-config.test.js +11 -8
  2. package/dist/__tests__/plugin-config.test.js.map +1 -1
  3. package/dist/cli/cli-program.js +253 -157
  4. package/dist/cli/cli-program.js.map +1 -1
  5. package/dist/cli/installer.js +4 -11
  6. package/dist/cli/installer.js.map +1 -1
  7. package/dist/hooks/idle-suggestions.js +3 -3
  8. package/dist/hooks/idle-suggestions.js.map +1 -1
  9. package/dist/hooks/system-transform.js +37 -14
  10. package/dist/hooks/system-transform.js.map +1 -1
  11. package/dist/index.js +4 -2
  12. package/dist/index.js.map +1 -1
  13. package/dist/plugin-config.js +5 -2
  14. package/dist/plugin-config.js.map +1 -1
  15. package/dist/tools/add-glossary-term.js +2 -0
  16. package/dist/tools/add-glossary-term.js.map +1 -1
  17. package/dist/tools/add-person.js +21 -0
  18. package/dist/tools/add-person.js.map +1 -0
  19. package/dist/tools/init-vault.js +11 -9
  20. package/dist/tools/init-vault.js.map +1 -1
  21. package/dist/tools/vault-upgrade.js +77 -0
  22. package/dist/tools/vault-upgrade.js.map +1 -0
  23. package/dist/vault/__tests__/create.test.js +105 -39
  24. package/dist/vault/__tests__/create.test.js.map +1 -1
  25. package/dist/vault/__tests__/glossary.test.js +25 -14
  26. package/dist/vault/__tests__/glossary.test.js.map +1 -1
  27. package/dist/vault/__tests__/manifest.test.js +76 -0
  28. package/dist/vault/__tests__/manifest.test.js.map +1 -0
  29. package/dist/vault/__tests__/member.test.js +2 -4
  30. package/dist/vault/__tests__/member.test.js.map +1 -1
  31. package/dist/vault/__tests__/upgrade.test.js +181 -0
  32. package/dist/vault/__tests__/upgrade.test.js.map +1 -0
  33. package/dist/vault/create.js +211 -146
  34. package/dist/vault/create.js.map +1 -1
  35. package/dist/vault/doctor.js +1 -1
  36. package/dist/vault/doctor.js.map +1 -1
  37. package/dist/vault/glossary.js +8 -14
  38. package/dist/vault/glossary.js.map +1 -1
  39. package/dist/vault/manifest.js +68 -0
  40. package/dist/vault/manifest.js.map +1 -0
  41. package/dist/vault/member.js +1 -1
  42. package/dist/vault/member.js.map +1 -1
  43. package/dist/vault/project.js +1 -1
  44. package/dist/vault/project.js.map +1 -1
  45. package/dist/vault/upgrade.js +266 -0
  46. package/dist/vault/upgrade.js.map +1 -0
  47. package/dist/vault/vault-detect.js +30 -0
  48. package/dist/vault/vault-detect.js.map +1 -1
  49. package/package.json +3 -1
  50. package/src/assets/presets/common/AGENT.md.hbs +34 -67
  51. package/src/assets/presets/common/Glossary.md.hbs +7 -35
  52. package/src/assets/presets/common/Start Here.md.hbs +32 -64
  53. package/src/assets/presets/minimal/preset.json +28 -0
  54. package/src/skills/{vault-doctor.md → diagnose.md} +12 -12
  55. package/src/skills/{system-explainer.md → explain.md} +8 -8
  56. package/src/skills/weave.md +240 -0
  57. package/src/assets/web-clipper/confluence-page.json +0 -63
  58. package/src/assets/web-clipper/general-article.json +0 -53
  59. package/src/assets/web-clipper/jira-issue.json +0 -68
  60. package/src/assets/web-clipper/meeting-notes.json +0 -53
  61. package/src/skills/enrich-document.md +0 -52
@@ -2,7 +2,8 @@ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
2
2
  import fs from "fs-extra";
3
3
  import path from "node:path";
4
4
  import os from "node:os";
5
- import { createVault } from "../create.js";
5
+ import { createVault, } from "../create.js";
6
+ import { detectInitMode } from "../vault-detect.js";
6
7
  // Mock mcp.ts so we don't touch real OpenCode config
7
8
  vi.mock("../mcp.js", () => ({
8
9
  configureMcp: vi.fn().mockResolvedValue(null),
@@ -22,7 +23,8 @@ afterEach(async () => {
22
23
  });
23
24
  function makeConfig(overrides = {}) {
24
25
  return {
25
- teamName: "TestTeam",
26
+ kbName: "TestKB",
27
+ ownerName: "",
26
28
  vaultPath: path.join(tmpDir, "vault"),
27
29
  members: [],
28
30
  projects: [],
@@ -38,22 +40,19 @@ function makeConfig(overrides = {}) {
38
40
  describe("createVault", () => {
39
41
  it("creates expected directory structure", async () => {
40
42
  const result = await createVault(makeConfig());
41
- expect(result.directories).toContain("Inbox");
42
43
  expect(result.directories).toContain("Knowledge");
43
- expect(result.directories).toContain("People");
44
- expect(result.directories).toContain("Projects");
45
- expect(result.directories).toContain("Sprints");
44
+ expect(result.directories).toContain("Daily");
46
45
  for (const dir of result.directories) {
47
46
  expect(await fs.pathExists(path.join(result.vaultPath, dir))).toBe(true);
48
47
  }
49
48
  });
50
- it("generates AGENT.md and CLAUDE.md", async () => {
49
+ it("generates AGENT.md (no CLAUDE.md)", async () => {
51
50
  const result = await createVault(makeConfig());
52
51
  const vp = result.vaultPath;
53
52
  expect(await fs.pathExists(path.join(vp, "AGENT.md"))).toBe(true);
54
- expect(await fs.pathExists(path.join(vp, "CLAUDE.md"))).toBe(true);
53
+ expect(await fs.pathExists(path.join(vp, "CLAUDE.md"))).toBe(false);
55
54
  const agentContent = await fs.readFile(path.join(vp, "AGENT.md"), "utf-8");
56
- expect(agentContent).toContain("TestTeam");
55
+ expect(agentContent).toContain("TestKB");
57
56
  });
58
57
  it("generates Start Here.md and Glossary.md", async () => {
59
58
  const result = await createVault(makeConfig());
@@ -61,7 +60,7 @@ describe("createVault", () => {
61
60
  expect(await fs.pathExists(path.join(vp, "Start Here.md"))).toBe(true);
62
61
  expect(await fs.pathExists(path.join(vp, "Knowledge/Glossary.md"))).toBe(true);
63
62
  const startHere = await fs.readFile(path.join(vp, "Start Here.md"), "utf-8");
64
- expect(startHere).toContain("TestTeam");
63
+ expect(startHere).toContain("TestKB");
65
64
  });
66
65
  it("creates people notes from members config", async () => {
67
66
  const config = makeConfig({
@@ -113,48 +112,115 @@ describe("createVault", () => {
113
112
  ],
114
113
  });
115
114
  const result = await createVault(config);
116
- const teamIndex = await fs.readFile(path.join(result.vaultPath, "People/TestTeam Team.md"), "utf-8");
115
+ const teamIndex = await fs.readFile(path.join(result.vaultPath, "People/TestKB Team.md"), "utf-8");
117
116
  expect(teamIndex).toContain("[[Alice]]");
118
117
  expect(teamIndex).toContain("[[Bob]]");
119
118
  });
120
- it("includes Document Conventions section in AGENT.md", async () => {
121
- const result = await createVault(makeConfig());
122
- const agentContent = await fs.readFile(path.join(result.vaultPath, "AGENT.md"), "utf-8");
123
- expect(agentContent).toContain("## Document Conventions");
124
- expect(agentContent).toContain("### Required Frontmatter");
125
- expect(agentContent).toContain("### Note Types");
126
- expect(agentContent).toContain("### File Creation Rules");
127
- expect(agentContent).toContain("### Wikilink Rules");
128
- });
129
- it("includes JIRA naming convention when JIRA is configured", async () => {
119
+ it("includes glossary entries when provided", async () => {
130
120
  const config = makeConfig({
131
- jiraHost: "wonder.atlassian.net",
132
- jiraProject: "DELI",
121
+ glossaryEntries: [{ term: "API", definition: "Application interface", domain: "engineering" }],
133
122
  });
134
123
  const result = await createVault(config);
135
- const agentContent = await fs.readFile(path.join(result.vaultPath, "AGENT.md"), "utf-8");
136
- expect(agentContent).toContain("DELI-XXXX-Description.md");
124
+ const glossary = await fs.readFile(path.join(result.vaultPath, "Knowledge/Glossary.md"), "utf-8");
125
+ expect(glossary).toContain("**API**");
126
+ expect(glossary).toContain("Application interface");
137
127
  });
138
- it("copies byoao-conventions skill to .opencode/skills/", async () => {
128
+ it("writes .byoao/manifest.json after vault creation", async () => {
139
129
  const result = await createVault(makeConfig());
140
- const skillPath = path.join(result.vaultPath, ".opencode/skills/byoao-conventions.md");
141
- expect(await fs.pathExists(skillPath)).toBe(true);
142
- const content = await fs.readFile(skillPath, "utf-8");
143
- expect(content).toContain("BYOAO Document Conventions");
130
+ const vp = result.vaultPath;
131
+ const manifestPath = path.join(vp, ".byoao", "manifest.json");
132
+ expect(await fs.pathExists(manifestPath)).toBe(true);
133
+ const manifest = await fs.readJson(manifestPath);
134
+ expect(manifest.version).toBeDefined();
135
+ expect(manifest.preset).toBe("pm-tpm");
136
+ expect(manifest.infrastructure.skills.length).toBeGreaterThan(0);
137
+ expect(manifest.infrastructure.commands.length).toBeGreaterThan(0);
138
+ expect(manifest.infrastructure.templates.length).toBeGreaterThan(0);
144
139
  });
145
- it("does not copy init-knowledge-base command", async () => {
146
- const result = await createVault(makeConfig());
147
- const cmdPath = path.join(result.vaultPath, ".opencode/commands/init-knowledge-base.md");
148
- expect(await fs.pathExists(cmdPath)).toBe(false);
140
+ it("minimal preset creates only minimal directories", async () => {
141
+ const config = makeConfig({ preset: "minimal" });
142
+ const result = await createVault(config);
143
+ expect(result.directories).toContain("Daily");
144
+ expect(result.directories).toContain("Knowledge");
145
+ expect(result.directories).toContain("Knowledge/templates");
146
+ // Minimal preset should NOT create these
147
+ expect(result.directories).not.toContain("Inbox");
148
+ expect(result.directories).not.toContain("Systems");
149
+ expect(result.directories).not.toContain("Archive");
149
150
  });
150
- it("includes glossary entries when provided", async () => {
151
+ it("minimal preset without members skips team index", async () => {
152
+ const config = makeConfig({ preset: "minimal", members: [] });
153
+ const result = await createVault(config);
154
+ const vp = result.vaultPath;
155
+ expect(await fs.pathExists(path.join(vp, "People"))).toBe(false);
156
+ expect(await fs.pathExists(path.join(vp, "People/TestKB Team.md"))).toBe(false);
157
+ });
158
+ it("minimal preset with members creates People/ and team index", async () => {
151
159
  const config = makeConfig({
152
- glossaryEntries: [{ term: "API", definition: "Application interface" }],
160
+ preset: "minimal",
161
+ members: [{ name: "Jay", role: "Owner" }],
153
162
  });
154
163
  const result = await createVault(config);
155
- const glossary = await fs.readFile(path.join(result.vaultPath, "Knowledge/Glossary.md"), "utf-8");
156
- expect(glossary).toContain("**API**");
157
- expect(glossary).toContain("Application interface");
164
+ const vp = result.vaultPath;
165
+ expect(await fs.pathExists(path.join(vp, "People/Jay.md"))).toBe(true);
166
+ expect(await fs.pathExists(path.join(vp, "People/TestKB Team.md"))).toBe(true);
167
+ });
168
+ it("pm-tpm preset includes Projects and Sprints directories", async () => {
169
+ const config = makeConfig({ preset: "pm-tpm" });
170
+ const result = await createVault(config);
171
+ expect(result.directories).toContain("Projects");
172
+ expect(result.directories).toContain("Sprints");
173
+ });
174
+ it("preserves existing .obsidian/ when initializing in an Obsidian vault", async () => {
175
+ const vp = path.join(tmpDir, "vault");
176
+ // Pre-create an existing Obsidian vault with custom config
177
+ await fs.ensureDir(path.join(vp, ".obsidian"));
178
+ await fs.writeFile(path.join(vp, ".obsidian", "custom-theme.json"), '{"custom": true}');
179
+ await fs.writeFile(path.join(vp, "existing-note.md"), "# My Note\n\nHello");
180
+ const config = makeConfig({ preset: "minimal" });
181
+ const result = await createVault(config);
182
+ // .obsidian/ should be untouched — custom file preserved, no BYOAO configs injected
183
+ const customTheme = await fs.readFile(path.join(vp, ".obsidian", "custom-theme.json"), "utf-8");
184
+ expect(customTheme).toContain('"custom": true');
185
+ // BYOAO files should still be created
186
+ expect(await fs.pathExists(path.join(vp, "AGENT.md"))).toBe(true);
187
+ expect(await fs.pathExists(path.join(vp, "Knowledge/Glossary.md"))).toBe(true);
188
+ // Existing note should be untouched
189
+ const existingNote = await fs.readFile(path.join(vp, "existing-note.md"), "utf-8");
190
+ expect(existingNote).toContain("My Note");
191
+ });
192
+ it("does not overwrite existing AGENT.md or Start Here.md", async () => {
193
+ const vp = path.join(tmpDir, "vault");
194
+ await fs.ensureDir(vp);
195
+ await fs.writeFile(path.join(vp, "AGENT.md"), "# Custom Agent Config");
196
+ await fs.writeFile(path.join(vp, "Start Here.md"), "# My Custom Start");
197
+ const config = makeConfig({ preset: "minimal" });
198
+ await createVault(config);
199
+ const agentContent = await fs.readFile(path.join(vp, "AGENT.md"), "utf-8");
200
+ expect(agentContent).toBe("# Custom Agent Config");
201
+ const startHere = await fs.readFile(path.join(vp, "Start Here.md"), "utf-8");
202
+ expect(startHere).toBe("# My Custom Start");
203
+ });
204
+ });
205
+ describe("detectInitMode", () => {
206
+ it("returns 'fresh' for non-existent path", () => {
207
+ expect(detectInitMode(path.join(tmpDir, "nonexistent"))).toBe("fresh");
208
+ });
209
+ it("returns 'fresh' for empty directory", async () => {
210
+ const emptyDir = path.join(tmpDir, "empty");
211
+ await fs.ensureDir(emptyDir);
212
+ expect(detectInitMode(emptyDir)).toBe("fresh");
213
+ });
214
+ it("returns 'existing' when .md files are present", async () => {
215
+ const dir = path.join(tmpDir, "notes");
216
+ await fs.ensureDir(dir);
217
+ await fs.writeFile(path.join(dir, "note.md"), "# Hello");
218
+ expect(detectInitMode(dir)).toBe("existing");
219
+ });
220
+ it("returns 'obsidian-vault' when .obsidian/ exists", async () => {
221
+ const dir = path.join(tmpDir, "vault");
222
+ await fs.ensureDir(path.join(dir, ".obsidian"));
223
+ expect(detectInitMode(dir)).toBe("obsidian-vault");
158
224
  });
159
225
  });
160
226
  //# sourceMappingURL=create.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create.test.js","sourceRoot":"","sources":["../../../src/vault/__tests__/create.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create.test.js","sourceRoot":"","sources":["../../../src/vault/__tests__/create.test.ts"],"names":[],"mappings":"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"}
@@ -12,45 +12,56 @@ afterEach(async () => {
12
12
  await fs.remove(tmpDir);
13
13
  });
14
14
  const GLOSSARY_TEMPLATE = `---
15
- title: "Test Glossary"
15
+ title: Glossary
16
16
  type: reference
17
- tags: [glossary]
17
+ status: active
18
+ tags: [glossary, reference]
18
19
  ---
19
20
 
20
- # Test Glossary
21
+ # Glossary
21
22
 
22
- ## Core Terms
23
+ Domain terms and key concepts in this knowledge base.
24
+ Maintained by /weave — run it to discover and add new terms.
23
25
 
24
- | Term | Definition |
25
- |------|-----------|
26
- | **API** | Application programming interface |
27
-
28
- ---
29
-
30
- ## How to Add a New Term
31
-
32
- Just add it.
26
+ | Term | Definition | Domain |
27
+ |------|-----------|--------|
28
+ | **API** | Application programming interface | engineering |
33
29
  `;
34
30
  describe("addGlossaryTerm", () => {
35
- it("appends term to existing Core Terms table", async () => {
31
+ it("appends term to existing glossary table", async () => {
36
32
  await fs.writeFile(path.join(tmpDir, "Knowledge/Glossary.md"), GLOSSARY_TEMPLATE);
37
33
  const result = await addGlossaryTerm({
38
34
  vaultPath: tmpDir,
39
35
  term: "SDK",
40
36
  definition: "Software development kit",
37
+ domain: "engineering",
41
38
  });
42
39
  expect(result.termAdded).toBe("SDK");
43
40
  const content = await fs.readFile(path.join(tmpDir, "Knowledge/Glossary.md"), "utf-8");
44
41
  expect(content).toContain("**SDK**");
45
42
  expect(content).toContain("Software development kit");
43
+ expect(content).toContain("| engineering |");
46
44
  // Original term still present
47
45
  expect(content).toContain("**API**");
48
46
  });
47
+ it("appends term with empty domain when domain not provided", async () => {
48
+ await fs.writeFile(path.join(tmpDir, "Knowledge/Glossary.md"), GLOSSARY_TEMPLATE);
49
+ const result = await addGlossaryTerm({
50
+ vaultPath: tmpDir,
51
+ term: "TDD",
52
+ definition: "Test-driven development",
53
+ domain: "",
54
+ });
55
+ expect(result.termAdded).toBe("TDD");
56
+ const content = await fs.readFile(path.join(tmpDir, "Knowledge/Glossary.md"), "utf-8");
57
+ expect(content).toContain("**TDD**");
58
+ });
49
59
  it("throws when Glossary.md does not exist", async () => {
50
60
  await expect(addGlossaryTerm({
51
61
  vaultPath: tmpDir,
52
62
  term: "Test",
53
63
  definition: "A test",
64
+ domain: "",
54
65
  })).rejects.toThrow("Glossary not found");
55
66
  });
56
67
  });
@@ -1 +1 @@
1
- {"version":3,"file":"glossary.test.js","sourceRoot":"","sources":["../../../src/vault/__tests__/glossary.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,IAAI,MAAc,CAAC;AAEnB,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,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;AACrD,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;CAmBzB,CAAC;AAEF,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,uBAAuB,CAAC,EAC1C,iBAAiB,CAClB,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;YACnC,SAAS,EAAE,MAAM;YACjB,IAAI,EAAE,KAAK;YACX,UAAU,EAAE,0BAA0B;SACvC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAErC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAC/B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,uBAAuB,CAAC,EAC1C,OAAO,CACR,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACrC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QACtD,8BAA8B;QAC9B,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,MAAM,CACV,eAAe,CAAC;YACd,SAAS,EAAE,MAAM;YACjB,IAAI,EAAE,MAAM;YACZ,UAAU,EAAE,QAAQ;SACrB,CAAC,CACH,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"glossary.test.js","sourceRoot":"","sources":["../../../src/vault/__tests__/glossary.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
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
+ let tmpDir;
6
+ beforeEach(async () => {
7
+ tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "byoao-manifest-"));
8
+ });
9
+ afterEach(async () => {
10
+ await fs.remove(tmpDir);
11
+ });
12
+ describe("writeManifest", () => {
13
+ it("creates .byoao/manifest.json with correct structure", async () => {
14
+ const { writeManifest } = await import("../manifest.js");
15
+ const installedFiles = {
16
+ skills: [".opencode/skills/byoao-conventions.md"],
17
+ commands: [".opencode/commands/vault-doctor.md"],
18
+ obsidianConfig: [".obsidian/core-plugins.json"],
19
+ templates: ["Knowledge/templates/Daily Note.md"],
20
+ };
21
+ await writeManifest(tmpDir, "pm-tpm", installedFiles);
22
+ const manifestPath = path.join(tmpDir, ".byoao", "manifest.json");
23
+ expect(await fs.pathExists(manifestPath)).toBe(true);
24
+ const manifest = await fs.readJson(manifestPath);
25
+ expect(manifest.version).toBeDefined();
26
+ expect(manifest.preset).toBe("pm-tpm");
27
+ expect(manifest.createdAt).toBeDefined();
28
+ expect(manifest.updatedAt).toBeDefined();
29
+ expect(manifest.infrastructure.skills).toEqual([".opencode/skills/byoao-conventions.md"]);
30
+ expect(manifest.infrastructure.commands).toEqual([".opencode/commands/vault-doctor.md"]);
31
+ expect(manifest.infrastructure.obsidianConfig).toEqual([".obsidian/core-plugins.json"]);
32
+ expect(manifest.infrastructure.templates).toEqual(["Knowledge/templates/Daily Note.md"]);
33
+ });
34
+ it("creates .byoao/ directory if it does not exist", async () => {
35
+ const { writeManifest } = await import("../manifest.js");
36
+ await writeManifest(tmpDir, "pm-tpm", {
37
+ skills: [], commands: [], obsidianConfig: [], templates: [],
38
+ });
39
+ expect(await fs.pathExists(path.join(tmpDir, ".byoao"))).toBe(true);
40
+ });
41
+ });
42
+ describe("readManifest", () => {
43
+ it("returns parsed manifest when valid", async () => {
44
+ const { readManifest, writeManifest } = await import("../manifest.js");
45
+ await writeManifest(tmpDir, "pm-tpm", {
46
+ skills: [".opencode/skills/test.md"],
47
+ commands: [],
48
+ obsidianConfig: [],
49
+ templates: [],
50
+ });
51
+ const result = await readManifest(tmpDir);
52
+ expect(result).not.toBeNull();
53
+ expect(result.preset).toBe("pm-tpm");
54
+ expect(result.infrastructure.skills).toEqual([".opencode/skills/test.md"]);
55
+ });
56
+ it("returns null when manifest does not exist", async () => {
57
+ const { readManifest } = await import("../manifest.js");
58
+ const result = await readManifest(tmpDir);
59
+ expect(result).toBeNull();
60
+ });
61
+ it("returns null when manifest has invalid JSON", async () => {
62
+ const { readManifest } = await import("../manifest.js");
63
+ await fs.ensureDir(path.join(tmpDir, ".byoao"));
64
+ await fs.writeFile(path.join(tmpDir, ".byoao", "manifest.json"), "{ broken json");
65
+ const result = await readManifest(tmpDir);
66
+ expect(result).toBeNull();
67
+ });
68
+ it("returns null when manifest fails schema validation", async () => {
69
+ const { readManifest } = await import("../manifest.js");
70
+ await fs.ensureDir(path.join(tmpDir, ".byoao"));
71
+ await fs.writeJson(path.join(tmpDir, ".byoao", "manifest.json"), { version: 123, wrong: "schema" });
72
+ const result = await readManifest(tmpDir);
73
+ expect(result).toBeNull();
74
+ });
75
+ });
76
+ //# sourceMappingURL=manifest.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.test.js","sourceRoot":"","sources":["../../../src/vault/__tests__/manifest.test.ts"],"names":[],"mappings":"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"}
@@ -53,8 +53,7 @@ type: reference
53
53
  expect(updated).toContain("[[Bob]]");
54
54
  expect(updated).toContain("PM");
55
55
  });
56
- it("updates AGENT.md and CLAUDE.md wikilinks", async () => {
57
- // Create AGENT.md and CLAUDE.md with placeholder
56
+ it("updates AGENT.md wikilinks", async () => {
58
57
  const agentContent = `# Agent
59
58
 
60
59
  ## Team
@@ -62,14 +61,13 @@ type: reference
62
61
  (No members added yet — create notes in People/)
63
62
  `;
64
63
  await fs.writeFile(path.join(tmpDir, "AGENT.md"), agentContent);
65
- await fs.writeFile(path.join(tmpDir, "CLAUDE.md"), agentContent);
66
64
  const result = await addMember({
67
65
  vaultPath: tmpDir,
68
66
  name: "Carol",
69
67
  role: "Designer",
70
68
  team: "Platform",
71
69
  });
72
- expect(result.wikilinksAdded).toBeGreaterThanOrEqual(2);
70
+ expect(result.wikilinksAdded).toBeGreaterThanOrEqual(1);
73
71
  const agent = await fs.readFile(path.join(tmpDir, "AGENT.md"), "utf-8");
74
72
  expect(agent).toContain("[[Carol]]");
75
73
  expect(agent).not.toContain("No members added yet");
@@ -1 +1 @@
1
- {"version":3,"file":"member.test.js","sourceRoot":"","sources":["../../../src/vault/__tests__/member.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"member.test.js","sourceRoot":"","sources":["../../../src/vault/__tests__/member.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,181 @@
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
+ beforeEach(async () => {
7
+ tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "byoao-upgrade-"));
8
+ });
9
+ afterEach(async () => {
10
+ await fs.remove(tmpDir);
11
+ });
12
+ describe("scanInstalledAssets", () => {
13
+ it("finds skills, commands, obsidian config, and templates", async () => {
14
+ const { scanInstalledAssets } = await import("../upgrade.js");
15
+ // Set up vault with infrastructure files
16
+ await fs.ensureDir(path.join(tmpDir, ".opencode", "skills"));
17
+ await fs.writeFile(path.join(tmpDir, ".opencode", "skills", "test.md"), "# Skill");
18
+ await fs.ensureDir(path.join(tmpDir, ".opencode", "commands"));
19
+ await fs.writeFile(path.join(tmpDir, ".opencode", "commands", "cmd.md"), "# Cmd");
20
+ await fs.ensureDir(path.join(tmpDir, ".obsidian"));
21
+ await fs.writeFile(path.join(tmpDir, ".obsidian", "core-plugins.json"), "[]");
22
+ await fs.ensureDir(path.join(tmpDir, "Knowledge", "templates"));
23
+ await fs.writeFile(path.join(tmpDir, "Knowledge", "templates", "Daily Note.md"), "# DN");
24
+ const result = await scanInstalledAssets(tmpDir);
25
+ expect(result.skills).toContain(".opencode/skills/test.md");
26
+ expect(result.commands).toContain(".opencode/commands/cmd.md");
27
+ expect(result.obsidianConfig).toContain(".obsidian/core-plugins.json");
28
+ expect(result.templates).toContain("Knowledge/templates/Daily Note.md");
29
+ });
30
+ it("returns empty arrays when no infrastructure exists", async () => {
31
+ const { scanInstalledAssets } = await import("../upgrade.js");
32
+ const result = await scanInstalledAssets(tmpDir);
33
+ expect(result.skills).toEqual([]);
34
+ expect(result.commands).toEqual([]);
35
+ expect(result.obsidianConfig).toEqual([]);
36
+ expect(result.templates).toEqual([]);
37
+ });
38
+ });
39
+ describe("bootstrapManifest", () => {
40
+ it("creates manifest with version 0.0.0", async () => {
41
+ const { bootstrapManifest } = await import("../upgrade.js");
42
+ const { readManifest } = await import("../manifest.js");
43
+ await fs.ensureDir(path.join(tmpDir, ".obsidian"));
44
+ await fs.writeFile(path.join(tmpDir, "AGENT.md"), "# Agent");
45
+ await fs.ensureDir(path.join(tmpDir, ".opencode", "skills"));
46
+ await fs.writeFile(path.join(tmpDir, ".opencode", "skills", "s.md"), "skill");
47
+ await bootstrapManifest(tmpDir);
48
+ const manifest = await readManifest(tmpDir);
49
+ expect(manifest).not.toBeNull();
50
+ expect(manifest.version).toBe("0.0.0");
51
+ expect(manifest.preset).toBe("pm-tpm");
52
+ expect(manifest.infrastructure.skills).toContain(".opencode/skills/s.md");
53
+ });
54
+ it("accepts preset override", async () => {
55
+ const { bootstrapManifest } = await import("../upgrade.js");
56
+ const { readManifest } = await import("../manifest.js");
57
+ await bootstrapManifest(tmpDir, "custom-preset");
58
+ const manifest = await readManifest(tmpDir);
59
+ expect(manifest.preset).toBe("custom-preset");
60
+ });
61
+ });
62
+ describe("buildUpgradePlan", () => {
63
+ it("marks missing files as add and existing files as update", async () => {
64
+ const { buildUpgradePlan } = await import("../upgrade.js");
65
+ // Vault has one skill on disk
66
+ await fs.ensureDir(path.join(tmpDir, ".opencode", "skills"));
67
+ await fs.writeFile(path.join(tmpDir, ".opencode", "skills", "existing.md"), "old content");
68
+ const manifest = {
69
+ version: "0.3.0",
70
+ preset: "pm-tpm",
71
+ createdAt: "2026-03-20",
72
+ updatedAt: "2026-03-20",
73
+ infrastructure: {
74
+ skills: [".opencode/skills/existing.md"],
75
+ commands: [],
76
+ obsidianConfig: [],
77
+ templates: [],
78
+ },
79
+ };
80
+ // Package ships two skills: existing.md and new.md
81
+ const packageAssets = {
82
+ skills: [
83
+ { relativePath: ".opencode/skills/existing.md", sourcePath: "/fake/existing.md" },
84
+ { relativePath: ".opencode/skills/new.md", sourcePath: "/fake/new.md" },
85
+ ],
86
+ commands: [],
87
+ obsidianConfig: [],
88
+ templates: [],
89
+ };
90
+ const plan = buildUpgradePlan(tmpDir, manifest, packageAssets);
91
+ const addItem = plan.items.find((i) => i.file === ".opencode/skills/new.md");
92
+ const updateItem = plan.items.find((i) => i.file === ".opencode/skills/existing.md");
93
+ expect(addItem).toBeDefined();
94
+ expect(addItem.action).toBe("add");
95
+ expect(updateItem).toBeDefined();
96
+ expect(updateItem.action).toBe("update");
97
+ });
98
+ it("marks files in manifest but not in package as deprecated", async () => {
99
+ const { buildUpgradePlan } = await import("../upgrade.js");
100
+ const manifest = {
101
+ version: "0.3.0",
102
+ preset: "pm-tpm",
103
+ createdAt: "2026-03-20",
104
+ updatedAt: "2026-03-20",
105
+ infrastructure: {
106
+ skills: [".opencode/skills/removed.md"],
107
+ commands: [],
108
+ obsidianConfig: [],
109
+ templates: [],
110
+ },
111
+ };
112
+ const packageAssets = {
113
+ skills: [],
114
+ commands: [],
115
+ obsidianConfig: [],
116
+ templates: [],
117
+ };
118
+ const plan = buildUpgradePlan(tmpDir, manifest, packageAssets);
119
+ const deprecated = plan.items.find((i) => i.file === ".opencode/skills/removed.md");
120
+ expect(deprecated).toBeDefined();
121
+ expect(deprecated.action).toBe("deprecated");
122
+ });
123
+ });
124
+ describe("upgradeVault", () => {
125
+ it("returns up-to-date result when versions match", async () => {
126
+ vi.resetModules();
127
+ const { writeManifest, getPackageVersion } = await import("../manifest.js");
128
+ const version = getPackageVersion();
129
+ await fs.ensureDir(path.join(tmpDir, ".obsidian"));
130
+ await fs.writeFile(path.join(tmpDir, "AGENT.md"), "# Agent");
131
+ await writeManifest(tmpDir, "pm-tpm", {
132
+ skills: [], commands: [], obsidianConfig: [], templates: [],
133
+ });
134
+ const { upgradeVault } = await import("../upgrade.js");
135
+ const result = await upgradeVault(tmpDir);
136
+ expect(result.fromVersion).toBe(version);
137
+ expect(result.toVersion).toBe(version);
138
+ expect(result.added).toEqual([]);
139
+ expect(result.updated).toEqual([]);
140
+ });
141
+ it("proceeds when force is true even if versions match", async () => {
142
+ vi.resetModules();
143
+ const { writeManifest } = await import("../manifest.js");
144
+ await fs.ensureDir(path.join(tmpDir, ".obsidian"));
145
+ await fs.writeFile(path.join(tmpDir, "AGENT.md"), "# Agent");
146
+ await writeManifest(tmpDir, "pm-tpm", {
147
+ skills: [], commands: [], obsidianConfig: [], templates: [],
148
+ });
149
+ const { upgradeVault } = await import("../upgrade.js");
150
+ const result = await upgradeVault(tmpDir, { force: true });
151
+ expect(result.dryRun).toBe(false);
152
+ });
153
+ it("returns dry-run result without modifying files", async () => {
154
+ vi.resetModules();
155
+ await fs.ensureDir(path.join(tmpDir, ".obsidian"));
156
+ await fs.writeFile(path.join(tmpDir, "AGENT.md"), "# Agent");
157
+ const { bootstrapManifest } = await import("../upgrade.js");
158
+ await bootstrapManifest(tmpDir);
159
+ vi.resetModules();
160
+ const { upgradeVault } = await import("../upgrade.js");
161
+ const result = await upgradeVault(tmpDir, { dryRun: true });
162
+ expect(result.dryRun).toBe(true);
163
+ const { readManifest } = await import("../manifest.js");
164
+ const manifest = await readManifest(tmpDir);
165
+ expect(manifest.version).toBe("0.0.0");
166
+ });
167
+ it("bootstraps manifest when none exists", async () => {
168
+ vi.resetModules();
169
+ await fs.ensureDir(path.join(tmpDir, ".obsidian"));
170
+ await fs.writeFile(path.join(tmpDir, "AGENT.md"), "# Agent");
171
+ const { upgradeVault } = await import("../upgrade.js");
172
+ const result = await upgradeVault(tmpDir, { force: true });
173
+ expect(result.fromVersion).toBe("0.0.0");
174
+ });
175
+ it("throws when vault path is not a BYOAO vault", async () => {
176
+ vi.resetModules();
177
+ const { upgradeVault } = await import("../upgrade.js");
178
+ await expect(upgradeVault(tmpDir)).rejects.toThrow(/No BYOAO vault detected/);
179
+ });
180
+ });
181
+ //# sourceMappingURL=upgrade.test.js.map