@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,70 +0,0 @@
1
- import { isObsidianCliAvailable, execObsidianCmd } from "./obsidian-cli.js";
2
- import { MAX_SNIPPET_LENGTH } from "./retrieval-types.js";
3
- /**
4
- * Read a note from the vault using Obsidian CLI.
5
- * Returns runtime_unavailable if CLI is not available — no internal fallback.
6
- */
7
- export async function readNote(input) {
8
- const { vaultPath, file } = input;
9
- const mode = "read";
10
- const base = {
11
- mode,
12
- vault: vaultPath,
13
- fallback: "none",
14
- };
15
- // 1. Check CLI availability
16
- if (!isObsidianCliAvailable()) {
17
- return {
18
- ...base,
19
- status: "runtime_unavailable",
20
- summary: "Obsidian CLI not available",
21
- results: [],
22
- truncated: false,
23
- diagnostics: ["Obsidian CLI not available"],
24
- };
25
- }
26
- // 2. Execute read command
27
- const cliResult = execObsidianCmd(["read", "--vault", vaultPath, file]);
28
- if (!cliResult.success) {
29
- return {
30
- ...base,
31
- status: "runtime_unavailable",
32
- summary: `Failed to read note "${file}"`,
33
- results: [],
34
- truncated: false,
35
- diagnostics: [cliResult.error ?? "Unknown CLI error"],
36
- };
37
- }
38
- // 3. Handle empty output
39
- const content = cliResult.output.trim();
40
- if (content.length === 0) {
41
- return {
42
- ...base,
43
- status: "no_results",
44
- summary: `Note "${file}" is empty or not found`,
45
- results: [],
46
- truncated: false,
47
- diagnostics: [],
48
- };
49
- }
50
- // 4. Build result — full content as snippet (truncated for the summary item)
51
- const snippet = content.length > MAX_SNIPPET_LENGTH
52
- ? content.substring(0, MAX_SNIPPET_LENGTH)
53
- : content;
54
- return {
55
- ...base,
56
- status: "ok",
57
- summary: `Read note "${file}" (${content.length} chars)`,
58
- results: [
59
- {
60
- title: file,
61
- path: "",
62
- file,
63
- snippet,
64
- },
65
- ],
66
- truncated: false,
67
- diagnostics: [],
68
- };
69
- }
70
- //# sourceMappingURL=note-read.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"note-read.js","sourceRoot":"","sources":["../../src/vault/note-read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAE5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAO1D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAAoB;IACjD,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IAClC,MAAM,IAAI,GAAG,MAAM,CAAC;IACpB,MAAM,IAAI,GAAyD;QACjE,IAAI;QACJ,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,MAAM;KACjB,CAAC;IAEF,4BAA4B;IAC5B,IAAI,CAAC,sBAAsB,EAAE,EAAE,CAAC;QAC9B,OAAO;YACL,GAAG,IAAI;YACP,MAAM,EAAE,qBAAqB;YAC7B,OAAO,EAAE,4BAA4B;YACrC,OAAO,EAAE,EAAE;YACX,SAAS,EAAE,KAAK;YAChB,WAAW,EAAE,CAAC,4BAA4B,CAAC;SAC5C,CAAC;IACJ,CAAC;IAED,0BAA0B;IAC1B,MAAM,SAAS,GAAG,eAAe,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;IAExE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QACvB,OAAO;YACL,GAAG,IAAI;YACP,MAAM,EAAE,qBAAqB;YAC7B,OAAO,EAAE,wBAAwB,IAAI,GAAG;YACxC,OAAO,EAAE,EAAE;YACX,SAAS,EAAE,KAAK;YAChB,WAAW,EAAE,CAAC,SAAS,CAAC,KAAK,IAAI,mBAAmB,CAAC;SACtD,CAAC;IACJ,CAAC;IAED,yBAAyB;IACzB,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACxC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,GAAG,IAAI;YACP,MAAM,EAAE,YAAY;YACpB,OAAO,EAAE,SAAS,IAAI,yBAAyB;YAC/C,OAAO,EAAE,EAAE;YACX,SAAS,EAAE,KAAK;YAChB,WAAW,EAAE,EAAE;SAChB,CAAC;IACJ,CAAC;IAED,6EAA6E;IAC7E,MAAM,OAAO,GACX,OAAO,CAAC,MAAM,GAAG,kBAAkB;QACjC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,kBAAkB,CAAC;QAC1C,CAAC,CAAC,OAAO,CAAC;IAEd,OAAO;QACL,GAAG,IAAI;QACP,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,cAAc,IAAI,MAAM,OAAO,CAAC,MAAM,SAAS;QACxD,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,IAAI;gBACX,IAAI,EAAE,EAAE;gBACR,IAAI;gBACJ,OAAO;aACR;SACF;QACD,SAAS,EAAE,KAAK;QAChB,WAAW,EAAE,EAAE;KAChB,CAAC;AACJ,CAAC"}
@@ -1,68 +0,0 @@
1
- import { fs } from "../lib/cjs-modules.js";
2
- import path from "node:path";
3
- import { today } from "./template.js";
4
- export async function addProject(input) {
5
- const { vaultPath, name, description, team } = input;
6
- let wikilinksAdded = 0;
7
- // 1. Create project note
8
- const projectPath = path.join(vaultPath, `Projects/${name}.md`);
9
- if (await fs.pathExists(projectPath)) {
10
- throw new Error(`Project note already exists: ${projectPath}`);
11
- }
12
- const content = `---
13
- title: "${name}"
14
- type: feature
15
- status: active
16
- date: ${today()}
17
- team: "${team}"
18
- jira: ""
19
- stakeholders: []
20
- priority: ""
21
- tags: [project]
22
- ---
23
-
24
- # ${name}
25
-
26
- ${description}
27
- `;
28
- await fs.writeFile(projectPath, content);
29
- // 2. Update team index if it exists
30
- const peoplePath = path.join(vaultPath, "People");
31
- if (await fs.pathExists(peoplePath)) {
32
- const teamFiles = await fs.readdir(peoplePath);
33
- const teamIndexFile = teamFiles.find((f) => f.endsWith("Team.md"));
34
- if (teamIndexFile) {
35
- const teamIndexPath = path.join(peoplePath, teamIndexFile);
36
- let teamContent = await fs.readFile(teamIndexPath, "utf-8");
37
- const projectLine = `- [[${name}]] — ${description}`;
38
- if (teamContent.includes("(No projects added yet)")) {
39
- teamContent = teamContent.replace("(No projects added yet)", projectLine);
40
- }
41
- else if (teamContent.includes("## Active Projects")) {
42
- // Append to the projects section
43
- teamContent = teamContent.replace(/(## Active Projects\n\n)([\s\S]*?)(\n\n|$)/, `$1$2\n${projectLine}$3`);
44
- }
45
- wikilinksAdded++;
46
- await fs.writeFile(teamIndexPath, teamContent);
47
- }
48
- }
49
- // 3. Update AGENTS.md wikilinks (check AGENTS.md first, fallback to AGENT.md)
50
- for (const agentFile of ["AGENTS.md", "AGENT.md"]) {
51
- const agentPath = path.join(vaultPath, agentFile);
52
- if (await fs.pathExists(agentPath)) {
53
- let agentContent = await fs.readFile(agentPath, "utf-8");
54
- const projectLine = `- [[${name}]] — ${description}`;
55
- if (agentContent.includes("(No projects added yet")) {
56
- agentContent = agentContent.replace(/\(No projects added yet[^)]*\)/, projectLine);
57
- wikilinksAdded++;
58
- }
59
- else if (agentContent.includes("## Active Projects")) {
60
- agentContent = agentContent.replace(/(## Active Projects[^\n]*\n\n)([\s\S]*?)(\n\n|$)/, `$1$2\n${projectLine}$3`);
61
- wikilinksAdded++;
62
- }
63
- await fs.writeFile(agentPath, agentContent);
64
- }
65
- }
66
- return { filePath: projectPath, wikilinksAdded };
67
- }
68
- //# sourceMappingURL=project.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/vault/project.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- /** Default maximum number of results to return. */
2
- export const DEFAULT_RESULT_LIMIT = 20;
3
- /** Default maximum snippet length per result (characters). */
4
- export const MAX_SNIPPET_LENGTH = 240;
5
- //# sourceMappingURL=retrieval-types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"retrieval-types.js","sourceRoot":"","sources":["../../src/vault/retrieval-types.ts"],"names":[],"mappings":"AA4CA,mDAAmD;AACnD,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEvC,8DAA8D;AAC9D,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC"}
@@ -1,87 +0,0 @@
1
- import path from "node:path";
2
- import { isObsidianCliAvailable, execObsidianCmd } from "./obsidian-cli.js";
3
- import { DEFAULT_RESULT_LIMIT, MAX_SNIPPET_LENGTH } from "./retrieval-types.js";
4
- /**
5
- * Search vault notes using Obsidian CLI search:context.
6
- * Returns runtime_unavailable if CLI is not available — no internal fallback.
7
- */
8
- export async function searchVault(input) {
9
- const { vaultPath, query, limit = DEFAULT_RESULT_LIMIT } = input;
10
- const mode = "search:context";
11
- const base = {
12
- mode,
13
- vault: vaultPath,
14
- fallback: "none",
15
- };
16
- // 1. Check CLI availability
17
- if (!isObsidianCliAvailable()) {
18
- return {
19
- ...base,
20
- status: "runtime_unavailable",
21
- summary: "Obsidian CLI not available",
22
- results: [],
23
- truncated: false,
24
- diagnostics: ["Obsidian CLI not available"],
25
- };
26
- }
27
- // 2. Execute search:context
28
- const cliResult = execObsidianCmd([
29
- "search:context",
30
- "--vault",
31
- vaultPath,
32
- query,
33
- ]);
34
- if (!cliResult.success) {
35
- return {
36
- ...base,
37
- status: "runtime_unavailable",
38
- summary: "Obsidian CLI command failed",
39
- results: [],
40
- truncated: false,
41
- diagnostics: [cliResult.error ?? "Unknown CLI error"],
42
- };
43
- }
44
- // 3. Parse output lines (format: path/to/note.md:context line)
45
- const lines = cliResult.output.split("\n").filter((l) => l.trim().length > 0);
46
- if (lines.length === 0) {
47
- return {
48
- ...base,
49
- status: "no_results",
50
- summary: `No matches for "${query}"`,
51
- results: [],
52
- truncated: false,
53
- diagnostics: [],
54
- };
55
- }
56
- // 4. Build result items
57
- const allItems = [];
58
- for (const line of lines) {
59
- const colonIdx = line.indexOf(":");
60
- if (colonIdx === -1)
61
- continue;
62
- const filePath = line.substring(0, colonIdx);
63
- const snippet = line.substring(colonIdx + 1).trim();
64
- const title = path.basename(filePath, ".md");
65
- allItems.push({
66
- title,
67
- path: filePath,
68
- file: title,
69
- snippet: snippet.length > MAX_SNIPPET_LENGTH
70
- ? snippet.substring(0, MAX_SNIPPET_LENGTH)
71
- : snippet,
72
- });
73
- }
74
- // 5. Apply limit
75
- const truncated = allItems.length > limit;
76
- const results = allItems.slice(0, limit);
77
- return {
78
- ...base,
79
- status: "ok",
80
- summary: `${allItems.length} matching notes for "${query}"`,
81
- results,
82
- truncated,
83
- totalMatches: allItems.length,
84
- diagnostics: [],
85
- };
86
- }
87
- //# sourceMappingURL=search-vault.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"search-vault.js","sourceRoot":"","sources":["../../src/vault/search-vault.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- {
2
- "folder": "Daily",
3
- "format": "YYYY-MM-DD",
4
- "template": "Knowledge/templates/Daily Note"
5
- }
@@ -1,3 +0,0 @@
1
- {
2
- "folder": "Knowledge/templates"
3
- }
@@ -1,19 +0,0 @@
1
- ---
2
- title: "{{date}}"
3
- type: daily
4
- status: active
5
- date: {{date}}
6
- tags: [daily]
7
- ---
8
-
9
- ## Focus
10
-
11
- -
12
-
13
- ## Notes
14
-
15
- -
16
-
17
- ## Action Items
18
-
19
- - [ ]
@@ -1,32 +0,0 @@
1
- ---
2
- title: ""
3
- type: decision
4
- status: draft
5
- date: {{date}}
6
- decision: ""
7
- decided-by: []
8
- alternatives-considered: []
9
- tags: [decision]
10
- ---
11
-
12
- ## Context
13
-
14
- What is the situation that requires a decision?
15
-
16
- ## Decision
17
-
18
- What was decided.
19
-
20
- ## Alternatives Considered
21
-
22
- | Option | Pros | Cons |
23
- |--------|------|------|
24
- | | | |
25
-
26
- ## Rationale
27
-
28
- Why this option was chosen over alternatives.
29
-
30
- ## Consequences
31
-
32
- What changes as a result of this decision.
@@ -1,34 +0,0 @@
1
- ---
2
- title: ""
3
- type: investigation
4
- status: draft
5
- date: {{date}}
6
- jira: ""
7
- hypothesis: ""
8
- conclusion: ""
9
- tags: [investigation, spike]
10
- ---
11
-
12
- ## Question
13
-
14
- What are we trying to find out?
15
-
16
- ## Hypothesis
17
-
18
- What we expect to find and why.
19
-
20
- ## Method
21
-
22
- How we investigated (queries, tools, data sources).
23
-
24
- ## Findings
25
-
26
- -
27
-
28
- ## Conclusion
29
-
30
- Summary of what we learned. Does it confirm or refute the hypothesis?
31
-
32
- ## Next Steps
33
-
34
- -
@@ -1,25 +0,0 @@
1
- ---
2
- title: ""
3
- type: meeting
4
- status: active
5
- date: {{date}}
6
- participants: []
7
- meeting-type: ""
8
- tags: [meeting]
9
- ---
10
-
11
- ## Agenda
12
-
13
- 1.
14
-
15
- ## Notes
16
-
17
- -
18
-
19
- ## Decisions
20
-
21
- -
22
-
23
- ## Action Items
24
-
25
- - [ ] @person — task — due date
@@ -1,168 +0,0 @@
1
- ---
2
- name: emerge
3
- description: Surface conclusions, patterns, and insights the vault implies but never explicitly states. Analyzes clusters, orphans, and cross-domain connections. Use when the user asks "what patterns do you see", "what am I missing", "analyze my vault", "find hidden connections", or wants a big-picture review of their knowledge base.
4
- ---
5
-
6
- # /emerge — Surface Hidden Patterns
7
-
8
- You are a pattern recognition analyst. Your job is to read across the user's vault and surface insights that the notes collectively imply but never explicitly state — hidden conclusions, recurring themes, unnoticed contradictions, and latent connections.
9
-
10
- ## Prerequisites Check
11
-
12
- ```bash
13
- obsidian --version
14
- ```
15
-
16
- If this fails, STOP and display the Obsidian CLI availability message (see /weave for the full error text).
17
-
18
- ## Tool Selection
19
-
20
- Use `obsidian` CLI for content operations (read, search, backlinks, properties, tags). Use BYOAO tools (`byoao_search_vault`, `byoao_graph_health`) when Obsidian CLI is unavailable or for graph-level structural queries.
21
-
22
- ## Parameters
23
-
24
- - **scope** (optional): Limit analysis to a folder, domain, or tag. Default: entire vault.
25
- - **depth** (optional): "quick" (top-level scan) or "deep" (read every note in scope). Default: "quick".
26
- - **output** (optional): If set, save findings as a note at this path.
27
-
28
- ## Process
29
-
30
- ### Sampling Strategy
31
-
32
- If a domain or search returns more than 30 notes, prioritize: (1) most recent 10, (2) most-linked 10 (highest backlink count), (3) notes with `status: active`. Read these first, then scan remaining titles and frontmatter to check for outliers before synthesizing.
33
-
34
- ### Step 1: Map the Vault
35
-
36
- Build a structural picture:
37
-
38
- ```bash
39
- obsidian list
40
- obsidian properties sort=count counts
41
- obsidian tags
42
- ```
43
-
44
- Identify:
45
- - Total notes and their distribution across folders/domains
46
- - Most-used tags and properties
47
- - Cluster density (which areas have many interconnected notes vs sparse ones)
48
-
49
- ### Step 2: Find Structural Signals
50
-
51
- Use graph-level queries to identify interesting patterns:
52
-
53
- **Orphan notes** — notes with no links in or out:
54
- Use `byoao_graph_health` or scan notes checking for those with zero wikilinks (no `[[` in content) and zero backlinks.
55
- Orphans may contain ideas the user hasn't connected yet.
56
-
57
- **Dead-end notes** — notes that link out but nobody links to them:
58
- Scan for notes with outgoing wikilinks but no backlinks.
59
-
60
- **Hub notes** — notes with unusually many backlinks:
61
- ```bash
62
- obsidian backlinks "<note>"
63
- ```
64
- Hubs reveal what the user's thinking centers around.
65
-
66
- **Tag clusters** — tags that always co-occur:
67
- If `#migration` and `#payments` always appear together, there's an implicit connection.
68
-
69
- ### Step 3: Cross-Domain Analysis
70
-
71
- For each domain (from frontmatter `domain` field or folder grouping):
72
-
73
- 1. **Read a sample of notes** (5-10 per domain, prioritizing recent and highly-linked)
74
- 2. **Extract key themes** — what topics recur within the domain?
75
- 3. **Look for cross-domain bridges** — concepts mentioned in multiple domains
76
- 4. **Identify tension** — contradictory statements across domains or time periods
77
-
78
- ### Step 4: Pattern Detection
79
-
80
- Look for these specific pattern types:
81
-
82
- **Recurring questions**: The same question asked in multiple notes but never answered.
83
- > "You've asked 'what's our rollback strategy?' in 4 different meeting notes but no note contains an answer."
84
-
85
- **Implicit decisions**: A direction was taken without a documented decision.
86
- > "Notes shifted from Option A to Option B around April, but no decision record exists."
87
-
88
- **Convergent threads**: Separate lines of thinking that are heading toward the same conclusion.
89
- > "Your notes on 'API rate limiting' and 'user quotas' both point toward a tiered access model, but neither note references the other."
90
-
91
- **Forgotten threads**: Topics that received attention then went silent.
92
- > "'Data mesh' appears in 6 notes between Jan-Mar but hasn't been mentioned since."
93
-
94
- **Expertise gaps**: The vault references a topic repeatedly but always superficially.
95
- > "'Kubernetes networking' appears in 12 notes but always as a dependency, never deeply explored."
96
-
97
- **Contradictions**: Conflicting statements across notes.
98
- > "In [[Note A]] you wrote 'we should avoid microservices' but [[Note B]] proposes splitting the monolith."
99
-
100
- ### Step 5: Synthesize Insights
101
-
102
- For each pattern found, formulate an insight:
103
-
104
- ```markdown
105
- ## Insight: {title}
106
-
107
- **Pattern**: {what you observed}
108
- **Evidence**: {list of notes with brief quotes}
109
- **Implication**: {what this might mean — phrased as a question, not a conclusion}
110
- **Suggested action**: {what the user could do — write a note, make a decision, connect notes}
111
- ```
112
-
113
- ### Step 6: Present Findings
114
-
115
- ```markdown
116
- # Emerge: Vault Patterns
117
-
118
- Analyzed {N} notes across {M} domains.
119
-
120
- ## Key Findings
121
-
122
- ### 1. {Insight title}
123
- {Pattern, evidence, implication, action}
124
-
125
- ### 2. {Insight title}
126
- ...
127
-
128
- ## Structural Observations
129
-
130
- - **Most connected**: [[Note]] ({N} backlinks) — your thinking hub
131
- - **Most isolated**: {N} orphan notes that may contain undeveloped ideas
132
- - **Busiest domain**: {domain} ({N} notes)
133
- - **Thinnest domain**: {domain} ({N} notes) — possible blind spot
134
-
135
- ## Suggested Next Steps
136
-
137
- 1. {Actionable suggestion — e.g. "Connect [[A]] and [[B]] — they discuss the same problem"}
138
- 2. {Actionable suggestion — e.g. "Write a decision record for the implicit choice between X and Y"}
139
- 3. {Actionable suggestion — e.g. "Run /trace on 'data mesh' to understand why it was abandoned"}
140
- ```
141
-
142
- ### Step 7: Save (Optional)
143
-
144
- At the end of your findings, ask:
145
-
146
- > "Would you like me to save this as a note?"
147
-
148
- If the user confirms, save with frontmatter:
149
-
150
- ```yaml
151
- ---
152
- title: "Emerge: Vault Patterns"
153
- note_type: literature
154
- type: analysis
155
- date: <today>
156
- tags: [emerge, patterns]
157
- ---
158
- ```
159
-
160
- Use `obsidian create` to save. Ask the user where they'd like it saved.
161
-
162
- ## Key Principles
163
-
164
- - **Show, don't tell**: Always cite specific notes and quotes. Never claim a pattern exists without evidence.
165
- - **Questions over conclusions**: Frame implications as questions the user should consider, not answers you've decided.
166
- - **Respect user judgment**: The user may be aware of patterns and have chosen not to act. Present findings neutrally.
167
- - **Prioritize actionable insights**: "These two notes should link to each other" is more useful than "your vault has 12 orphans."
168
- - **Deep mode means thorough**: In "deep" mode, read every note in scope. In "quick" mode, use structural signals and sampling.