@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.
- package/dist/__tests__/plugin-config.test.js +7 -10
- package/dist/__tests__/plugin-config.test.js.map +1 -1
- package/dist/assets/obsidian-skills/byoao-conventions.md +30 -54
- package/dist/assets/obsidian-skills/vault-thinking.md +6 -5
- package/dist/assets/presets/common/AGENTS.md.hbs +29 -46
- package/dist/assets/presets/common/SCHEMA.md.hbs +57 -0
- package/dist/assets/presets/common/Start Here.md.hbs +29 -40
- package/dist/assets/presets/minimal/preset.json +3 -3
- package/dist/assets/presets/pm-tpm/preset.json +2 -2
- package/dist/assets/skills/ask.md +28 -27
- package/dist/assets/skills/challenge.md +79 -121
- package/dist/assets/skills/connect.md +75 -163
- package/dist/assets/skills/cook.md +167 -0
- package/dist/assets/skills/diagnose.md +102 -43
- package/dist/assets/skills/drift.md +64 -165
- package/dist/assets/skills/health.md +63 -0
- package/dist/assets/skills/ideas.md +11 -10
- package/dist/assets/skills/organize.md +56 -155
- package/dist/assets/skills/prep.md +63 -0
- package/dist/assets/skills/trace.md +75 -90
- package/dist/assets/skills/wiki.md +77 -178
- package/dist/cli/cli-program.js +17 -14
- package/dist/cli/cli-program.js.map +1 -1
- package/dist/cli/installer.js +10 -4
- package/dist/cli/installer.js.map +1 -1
- package/dist/hooks/idle-suggestions.js +4 -4
- package/dist/hooks/idle-suggestions.js.map +1 -1
- package/dist/hooks/system-transform.js +35 -1
- package/dist/hooks/system-transform.js.map +1 -1
- package/dist/index.js +395 -623
- package/dist/index.js.map +1 -1
- package/dist/plugin-config.js +6 -32
- package/dist/plugin-config.js.map +1 -1
- package/dist/tools/init-vault.js +8 -38
- package/dist/tools/init-vault.js.map +1 -1
- package/dist/tools/vault-doctor.js +1 -1
- package/dist/tools/vault-doctor.js.map +1 -1
- package/dist/tools/vault-status.js +1 -1
- package/dist/tools/vault-status.js.map +1 -1
- package/dist/vault/__tests__/create.test.js +47 -115
- package/dist/vault/__tests__/create.test.js.map +1 -1
- package/dist/vault/__tests__/doctor.test.js +14 -2
- package/dist/vault/__tests__/doctor.test.js.map +1 -1
- package/dist/vault/__tests__/manifest.test.js +2 -2
- package/dist/vault/__tests__/manifest.test.js.map +1 -1
- package/dist/vault/__tests__/status.test.js +12 -0
- package/dist/vault/__tests__/status.test.js.map +1 -1
- package/dist/vault/__tests__/upgrade.test.js +3 -3
- package/dist/vault/__tests__/upgrade.test.js.map +1 -1
- package/dist/vault/create.js +75 -188
- package/dist/vault/create.js.map +1 -1
- package/dist/vault/doctor.js +49 -0
- package/dist/vault/doctor.js.map +1 -1
- package/dist/vault/manifest.js +1 -1
- package/dist/vault/preset.js +10 -4
- package/dist/vault/preset.js.map +1 -1
- package/dist/vault/self-update.js +1 -1
- package/dist/vault/status.js +24 -0
- package/dist/vault/status.js.map +1 -1
- package/dist/vault/upgrade.js +120 -16
- package/dist/vault/upgrade.js.map +1 -1
- package/package.json +1 -1
- package/src/assets/obsidian-skills/byoao-conventions.md +9 -6
- package/src/assets/obsidian-skills/vault-thinking.md +6 -5
- package/src/assets/presets/common/AGENTS.md.hbs +23 -19
- package/src/assets/presets/common/SCHEMA.md.hbs +57 -0
- package/src/assets/presets/common/Start Here.md.hbs +29 -40
- package/src/assets/presets/minimal/preset.json +3 -3
- package/src/assets/presets/pm-tpm/preset.json +2 -2
- package/src/skills/ask.md +28 -27
- package/src/skills/challenge.md +79 -121
- package/src/skills/connect.md +75 -163
- package/src/skills/cook.md +167 -0
- package/src/skills/diagnose.md +102 -43
- package/src/skills/drift.md +64 -165
- package/src/skills/health.md +63 -0
- package/src/skills/ideas.md +11 -10
- package/src/skills/organize.md +56 -155
- package/src/skills/prep.md +63 -0
- package/src/skills/trace.md +75 -90
- package/src/skills/wiki.md +77 -178
- package/dist/assets/presets/common/Glossary.md.hbs +0 -16
- package/dist/assets/presets/common/obsidian/daily-notes.json +0 -5
- package/dist/assets/presets/common/obsidian/templates.json +0 -3
- package/dist/assets/presets/common/templates/Daily Note.md +0 -19
- package/dist/assets/presets/common/templates/Decision Record.md +0 -32
- package/dist/assets/presets/common/templates/Investigation.md +0 -34
- package/dist/assets/presets/common/templates/Meeting Notes.md +0 -25
- package/dist/assets/skills/emerge.md +0 -168
- package/dist/assets/skills/weave.md +0 -287
- package/dist/tools/add-glossary-term.js +0 -21
- package/dist/tools/add-glossary-term.js.map +0 -1
- package/dist/tools/add-person.js +0 -21
- package/dist/tools/add-person.js.map +0 -1
- package/dist/tools/add-project.js +0 -24
- package/dist/tools/add-project.js.map +0 -1
- package/dist/tools/graph-health.js +0 -25
- package/dist/tools/graph-health.js.map +0 -1
- package/dist/tools/note-read.js +0 -19
- package/dist/tools/note-read.js.map +0 -1
- package/dist/tools/search-vault.js +0 -22
- package/dist/tools/search-vault.js.map +0 -1
- package/dist/vault/__tests__/glossary.test.js +0 -68
- package/dist/vault/__tests__/glossary.test.js.map +0 -1
- package/dist/vault/__tests__/graph-health.test.js +0 -102
- package/dist/vault/__tests__/graph-health.test.js.map +0 -1
- package/dist/vault/__tests__/member.test.js +0 -85
- package/dist/vault/__tests__/member.test.js.map +0 -1
- package/dist/vault/__tests__/note-read.test.js +0 -71
- package/dist/vault/__tests__/note-read.test.js.map +0 -1
- package/dist/vault/__tests__/obsidian-cli.test.js +0 -108
- package/dist/vault/__tests__/obsidian-cli.test.js.map +0 -1
- package/dist/vault/__tests__/search-vault.test.js +0 -93
- package/dist/vault/__tests__/search-vault.test.js.map +0 -1
- package/dist/vault/glossary.js +0 -27
- package/dist/vault/glossary.js.map +0 -1
- package/dist/vault/graph-health.js +0 -83
- package/dist/vault/graph-health.js.map +0 -1
- package/dist/vault/member.js +0 -67
- package/dist/vault/member.js.map +0 -1
- package/dist/vault/note-read.js +0 -70
- package/dist/vault/note-read.js.map +0 -1
- package/dist/vault/project.js +0 -68
- package/dist/vault/project.js.map +0 -1
- package/dist/vault/retrieval-types.js +0 -5
- package/dist/vault/retrieval-types.js.map +0 -1
- package/dist/vault/search-vault.js +0 -87
- package/dist/vault/search-vault.js.map +0 -1
- package/src/assets/presets/common/obsidian/daily-notes.json +0 -5
- package/src/assets/presets/common/obsidian/templates.json +0 -3
- package/src/assets/presets/common/templates/Daily Note.md +0 -19
- package/src/assets/presets/common/templates/Decision Record.md +0 -32
- package/src/assets/presets/common/templates/Investigation.md +0 -34
- package/src/assets/presets/common/templates/Meeting Notes.md +0 -25
- package/src/skills/emerge.md +0 -168
- package/src/skills/weave.md +0 -287
package/dist/vault/note-read.js
DELETED
|
@@ -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"}
|
package/dist/vault/project.js
DELETED
|
@@ -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 +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,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
|
package/src/skills/emerge.md
DELETED
|
@@ -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.
|