@jayjiang/byoao 0.3.3 → 0.5.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/cli/cli-program.js +118 -0
- package/dist/cli/cli-program.js.map +1 -1
- package/dist/hooks/system-transform.js +19 -1
- package/dist/hooks/system-transform.js.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/tools/graph-health.js +25 -0
- package/dist/tools/graph-health.js.map +1 -0
- package/dist/tools/note-read.js +19 -0
- package/dist/tools/note-read.js.map +1 -0
- package/dist/tools/search-vault.js +22 -0
- package/dist/tools/search-vault.js.map +1 -0
- package/dist/tools/vault-upgrade.js +77 -0
- package/dist/tools/vault-upgrade.js.map +1 -0
- package/dist/vault/__tests__/create.test.js +12 -0
- package/dist/vault/__tests__/create.test.js.map +1 -1
- package/dist/vault/__tests__/graph-health.test.js +102 -0
- package/dist/vault/__tests__/graph-health.test.js.map +1 -0
- package/dist/vault/__tests__/manifest.test.js +76 -0
- package/dist/vault/__tests__/manifest.test.js.map +1 -0
- package/dist/vault/__tests__/note-read.test.js +71 -0
- package/dist/vault/__tests__/note-read.test.js.map +1 -0
- package/dist/vault/__tests__/search-vault.test.js +93 -0
- package/dist/vault/__tests__/search-vault.test.js.map +1 -0
- package/dist/vault/__tests__/upgrade.test.js +181 -0
- package/dist/vault/__tests__/upgrade.test.js.map +1 -0
- package/dist/vault/__tests__/vault-detect.test.js +54 -0
- package/dist/vault/__tests__/vault-detect.test.js.map +1 -0
- package/dist/vault/create.js +20 -3
- package/dist/vault/create.js.map +1 -1
- package/dist/vault/graph-health.js +83 -0
- package/dist/vault/graph-health.js.map +1 -0
- package/dist/vault/manifest.js +68 -0
- package/dist/vault/manifest.js.map +1 -0
- package/dist/vault/note-read.js +70 -0
- package/dist/vault/note-read.js.map +1 -0
- package/dist/vault/retrieval-types.js +5 -0
- package/dist/vault/retrieval-types.js.map +1 -0
- package/dist/vault/search-vault.js +87 -0
- package/dist/vault/search-vault.js.map +1 -0
- package/dist/vault/upgrade.js +266 -0
- package/dist/vault/upgrade.js.map +1 -0
- package/dist/vault/vault-detect.js +29 -0
- package/dist/vault/vault-detect.js.map +1 -0
- package/package.json +3 -1
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import fs from "fs-extra";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { readManifest, writeManifest, getPackageVersion, } from "./manifest.js";
|
|
4
|
+
import { loadPreset, getCommonDir } from "./preset.js";
|
|
5
|
+
import { detectVaultContext } from "./vault-detect.js";
|
|
6
|
+
// ── Constants ───────────────────────────────────────────────────
|
|
7
|
+
const OBSIDIAN_CONFIG_FILES = [
|
|
8
|
+
"core-plugins.json",
|
|
9
|
+
"daily-notes.json",
|
|
10
|
+
"templates.json",
|
|
11
|
+
];
|
|
12
|
+
// ── Scanning ────────────────────────────────────────────────────
|
|
13
|
+
/** Scan vault for installed infrastructure files. Returns relative paths. */
|
|
14
|
+
export async function scanInstalledAssets(vaultPath) {
|
|
15
|
+
const skills = await scanDir(vaultPath, ".opencode/skills", ".md");
|
|
16
|
+
const commands = await scanDir(vaultPath, ".opencode/commands", ".md");
|
|
17
|
+
const templates = await scanDir(vaultPath, "Knowledge/templates", ".md");
|
|
18
|
+
const obsidianConfig = [];
|
|
19
|
+
for (const file of OBSIDIAN_CONFIG_FILES) {
|
|
20
|
+
const abs = path.join(vaultPath, ".obsidian", file);
|
|
21
|
+
if (await fs.pathExists(abs)) {
|
|
22
|
+
obsidianConfig.push(`.obsidian/${file}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return { skills, commands, obsidianConfig, templates };
|
|
26
|
+
}
|
|
27
|
+
async function scanDir(vaultPath, relDir, ext) {
|
|
28
|
+
const absDir = path.join(vaultPath, relDir);
|
|
29
|
+
if (!(await fs.pathExists(absDir)))
|
|
30
|
+
return [];
|
|
31
|
+
const files = await fs.readdir(absDir);
|
|
32
|
+
return files
|
|
33
|
+
.filter((f) => f.endsWith(ext))
|
|
34
|
+
.map((f) => `${relDir}/${f}`);
|
|
35
|
+
}
|
|
36
|
+
// ── Bootstrap ───────────────────────────────────────────────────
|
|
37
|
+
const DEFAULT_PRESET = "pm-tpm";
|
|
38
|
+
/** Bootstrap a manifest for vaults created before the manifest existed. */
|
|
39
|
+
export async function bootstrapManifest(vaultPath, preset) {
|
|
40
|
+
const installedFiles = await scanInstalledAssets(vaultPath);
|
|
41
|
+
await writeManifest(vaultPath, preset ?? DEFAULT_PRESET, installedFiles, "0.0.0");
|
|
42
|
+
const manifest = await readManifest(vaultPath);
|
|
43
|
+
return manifest;
|
|
44
|
+
}
|
|
45
|
+
// ── Plan Building ───────────────────────────────────────────────
|
|
46
|
+
/** Build an upgrade plan by comparing package assets against vault state. */
|
|
47
|
+
export function buildUpgradePlan(vaultPath, manifest, packageAssets) {
|
|
48
|
+
const items = [];
|
|
49
|
+
const pkgVersion = getPackageVersion();
|
|
50
|
+
const categories = [
|
|
51
|
+
{ key: "skills", category: "skills" },
|
|
52
|
+
{ key: "commands", category: "commands" },
|
|
53
|
+
{ key: "obsidianConfig", category: "obsidianConfig" },
|
|
54
|
+
{ key: "templates", category: "templates" },
|
|
55
|
+
];
|
|
56
|
+
for (const { key, category } of categories) {
|
|
57
|
+
const shipped = packageAssets[key];
|
|
58
|
+
const installed = new Set(manifest.infrastructure[key]);
|
|
59
|
+
const shippedPaths = new Set(shipped.map((s) => s.relativePath));
|
|
60
|
+
for (const entry of shipped) {
|
|
61
|
+
const onDisk = fs.existsSync(path.join(vaultPath, entry.relativePath));
|
|
62
|
+
items.push({
|
|
63
|
+
file: entry.relativePath,
|
|
64
|
+
action: onDisk ? "update" : "add",
|
|
65
|
+
category,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
for (const installedPath of installed) {
|
|
69
|
+
if (!shippedPaths.has(installedPath)) {
|
|
70
|
+
items.push({
|
|
71
|
+
file: installedPath,
|
|
72
|
+
action: "deprecated",
|
|
73
|
+
category,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
fromVersion: manifest.version,
|
|
80
|
+
toVersion: pkgVersion,
|
|
81
|
+
items,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
// ── Asset Resolution ────────────────────────────────────────────
|
|
85
|
+
function resolveAssetsDir() {
|
|
86
|
+
const srcAssets = path.resolve(import.meta.dirname, "..", "assets");
|
|
87
|
+
const distAssets = path.resolve(import.meta.dirname, "..", "..", "src", "assets");
|
|
88
|
+
if (fs.existsSync(srcAssets))
|
|
89
|
+
return srcAssets;
|
|
90
|
+
if (fs.existsSync(distAssets))
|
|
91
|
+
return distAssets;
|
|
92
|
+
return srcAssets;
|
|
93
|
+
}
|
|
94
|
+
function resolveSkillsDir() {
|
|
95
|
+
const srcSkills = path.resolve(import.meta.dirname, "..", "skills");
|
|
96
|
+
const distSkills = path.resolve(import.meta.dirname, "..", "..", "src", "skills");
|
|
97
|
+
if (fs.existsSync(srcSkills))
|
|
98
|
+
return srcSkills;
|
|
99
|
+
if (fs.existsSync(distSkills))
|
|
100
|
+
return distSkills;
|
|
101
|
+
return srcSkills;
|
|
102
|
+
}
|
|
103
|
+
/** Resolve package assets for a given preset. */
|
|
104
|
+
function resolvePackageAssets(preset) {
|
|
105
|
+
const assetsDir = resolveAssetsDir();
|
|
106
|
+
const skillsDir = resolveSkillsDir();
|
|
107
|
+
const commonDir = getCommonDir();
|
|
108
|
+
const skills = [];
|
|
109
|
+
const commands = [];
|
|
110
|
+
const obsidianConfig = [];
|
|
111
|
+
const templates = [];
|
|
112
|
+
// 1. Obsidian skills → .opencode/skills/
|
|
113
|
+
const obsidianSkillsDir = path.join(assetsDir, "obsidian-skills");
|
|
114
|
+
if (fs.existsSync(obsidianSkillsDir)) {
|
|
115
|
+
for (const file of fs.readdirSync(obsidianSkillsDir)) {
|
|
116
|
+
if (file.endsWith(".md")) {
|
|
117
|
+
skills.push({
|
|
118
|
+
relativePath: `.opencode/skills/${file}`,
|
|
119
|
+
sourcePath: path.join(obsidianSkillsDir, file),
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// 2. BYOAO commands (src/skills/) → .opencode/commands/
|
|
125
|
+
if (fs.existsSync(skillsDir)) {
|
|
126
|
+
for (const file of fs.readdirSync(skillsDir)) {
|
|
127
|
+
if (file.endsWith(".md")) {
|
|
128
|
+
commands.push({
|
|
129
|
+
relativePath: `.opencode/commands/${file}`,
|
|
130
|
+
sourcePath: path.join(skillsDir, file),
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// 3. Obsidian config from common
|
|
136
|
+
const obsidianSrcDir = path.join(commonDir, "obsidian");
|
|
137
|
+
if (fs.existsSync(obsidianSrcDir)) {
|
|
138
|
+
for (const file of OBSIDIAN_CONFIG_FILES) {
|
|
139
|
+
const srcPath = path.join(obsidianSrcDir, file);
|
|
140
|
+
if (fs.existsSync(srcPath)) {
|
|
141
|
+
obsidianConfig.push({
|
|
142
|
+
relativePath: `.obsidian/${file}`,
|
|
143
|
+
sourcePath: srcPath,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// 4. Templates: common + preset
|
|
149
|
+
const commonTemplatesDir = path.join(commonDir, "templates");
|
|
150
|
+
if (fs.existsSync(commonTemplatesDir)) {
|
|
151
|
+
for (const file of fs.readdirSync(commonTemplatesDir)) {
|
|
152
|
+
if (file.endsWith(".md")) {
|
|
153
|
+
templates.push({
|
|
154
|
+
relativePath: `Knowledge/templates/${file}`,
|
|
155
|
+
sourcePath: path.join(commonTemplatesDir, file),
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
try {
|
|
161
|
+
const { presetsDir } = loadPreset(preset);
|
|
162
|
+
const presetTemplatesDir = path.join(presetsDir, preset, "templates");
|
|
163
|
+
if (fs.existsSync(presetTemplatesDir)) {
|
|
164
|
+
for (const file of fs.readdirSync(presetTemplatesDir)) {
|
|
165
|
+
if (file.endsWith(".md")) {
|
|
166
|
+
templates.push({
|
|
167
|
+
relativePath: `Knowledge/templates/${file}`,
|
|
168
|
+
sourcePath: path.join(presetTemplatesDir, file),
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
/* Preset not found — use common templates only */
|
|
176
|
+
}
|
|
177
|
+
return { skills, commands, obsidianConfig, templates };
|
|
178
|
+
}
|
|
179
|
+
// ── Upgrade Execution ───────────────────────────────────────────
|
|
180
|
+
/** Upgrade a BYOAO vault's infrastructure files to the current package version. */
|
|
181
|
+
export async function upgradeVault(vaultPath, options) {
|
|
182
|
+
const { preset, dryRun = false, force = false } = options ?? {};
|
|
183
|
+
// 1. Validate this is a BYOAO vault
|
|
184
|
+
const detectedPath = detectVaultContext(vaultPath);
|
|
185
|
+
if (!detectedPath) {
|
|
186
|
+
throw new Error(`No BYOAO vault detected at "${vaultPath}". ` +
|
|
187
|
+
"Expected .obsidian/ and AGENT.md or Knowledge/Glossary.md.");
|
|
188
|
+
}
|
|
189
|
+
// 2. Read or bootstrap manifest
|
|
190
|
+
let manifest = await readManifest(vaultPath);
|
|
191
|
+
if (!manifest) {
|
|
192
|
+
manifest = await bootstrapManifest(vaultPath, preset);
|
|
193
|
+
}
|
|
194
|
+
const pkgVersion = getPackageVersion();
|
|
195
|
+
const fromVersion = manifest.version;
|
|
196
|
+
// 3. Check if upgrade needed
|
|
197
|
+
if (fromVersion === pkgVersion && !force) {
|
|
198
|
+
return {
|
|
199
|
+
fromVersion,
|
|
200
|
+
toVersion: pkgVersion,
|
|
201
|
+
added: [],
|
|
202
|
+
updated: [],
|
|
203
|
+
deprecated: [],
|
|
204
|
+
errors: [],
|
|
205
|
+
dryRun,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
// 4. Resolve package assets and build plan
|
|
209
|
+
const effectivePreset = preset ?? manifest.preset;
|
|
210
|
+
const packageAssets = resolvePackageAssets(effectivePreset);
|
|
211
|
+
const plan = buildUpgradePlan(vaultPath, manifest, packageAssets);
|
|
212
|
+
// 5. Execute plan (or dry run)
|
|
213
|
+
const added = [];
|
|
214
|
+
const updated = [];
|
|
215
|
+
const deprecated = [];
|
|
216
|
+
const errors = [];
|
|
217
|
+
if (!dryRun) {
|
|
218
|
+
// Build lookup from relativePath → sourcePath
|
|
219
|
+
const sourceMap = new Map();
|
|
220
|
+
for (const category of ["skills", "commands", "obsidianConfig", "templates"]) {
|
|
221
|
+
for (const entry of packageAssets[category]) {
|
|
222
|
+
sourceMap.set(entry.relativePath, entry.sourcePath);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
for (const item of plan.items) {
|
|
226
|
+
try {
|
|
227
|
+
if (item.action === "add" || item.action === "update") {
|
|
228
|
+
const source = sourceMap.get(item.file);
|
|
229
|
+
if (source) {
|
|
230
|
+
const dest = path.join(vaultPath, item.file);
|
|
231
|
+
await fs.ensureDir(path.dirname(dest));
|
|
232
|
+
await fs.copy(source, dest, { overwrite: true });
|
|
233
|
+
if (item.action === "add") {
|
|
234
|
+
added.push(item.file);
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
updated.push(item.file);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
else if (item.action === "deprecated") {
|
|
242
|
+
deprecated.push(item.file);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
catch (err) {
|
|
246
|
+
errors.push({
|
|
247
|
+
file: item.file,
|
|
248
|
+
error: err instanceof Error ? err.message : String(err),
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// 6. Update manifest with new version and current file list
|
|
253
|
+
const installedFiles = await scanInstalledAssets(vaultPath);
|
|
254
|
+
await writeManifest(vaultPath, effectivePreset, installedFiles);
|
|
255
|
+
}
|
|
256
|
+
return {
|
|
257
|
+
fromVersion,
|
|
258
|
+
toVersion: pkgVersion,
|
|
259
|
+
added,
|
|
260
|
+
updated,
|
|
261
|
+
deprecated,
|
|
262
|
+
errors,
|
|
263
|
+
dryRun,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=upgrade.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/vault/upgrade.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import fs from "fs-extra";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Detect whether a directory is (or is inside) a BYOAO vault.
|
|
5
|
+
* Returns the vault root path if detected, null otherwise.
|
|
6
|
+
*
|
|
7
|
+
* A directory is a BYOAO vault if:
|
|
8
|
+
* - .obsidian/ exists AND AGENT.md exists, OR
|
|
9
|
+
* - .obsidian/ exists AND Knowledge/Glossary.md exists
|
|
10
|
+
*
|
|
11
|
+
* Checks the given directory and its immediate parent.
|
|
12
|
+
*/
|
|
13
|
+
export function detectVaultContext(dir) {
|
|
14
|
+
const candidates = [dir, path.dirname(dir)];
|
|
15
|
+
for (const candidate of candidates) {
|
|
16
|
+
if (!fs.existsSync(candidate))
|
|
17
|
+
continue;
|
|
18
|
+
const hasObsidian = fs.existsSync(path.join(candidate, ".obsidian"));
|
|
19
|
+
if (!hasObsidian)
|
|
20
|
+
continue;
|
|
21
|
+
const hasAgentMd = fs.existsSync(path.join(candidate, "AGENT.md"));
|
|
22
|
+
const hasGlossary = fs.existsSync(path.join(candidate, "Knowledge", "Glossary.md"));
|
|
23
|
+
if (hasAgentMd || hasGlossary) {
|
|
24
|
+
return candidate;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=vault-detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-detect.js","sourceRoot":"","sources":["../../src/vault/vault-detect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAE5C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,SAAS;QAExC,MAAM,WAAW,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;QACrE,IAAI,CAAC,WAAW;YAAE,SAAS;QAE3B,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;QACnE,MAAM,WAAW,GAAG,EAAE,CAAC,UAAU,CAC/B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,aAAa,CAAC,CACjD,CAAC;QAEF,IAAI,UAAU,IAAI,WAAW,EAAE,CAAC;YAC9B,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jayjiang/byoao",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Build Your Own AI OS — Obsidian + AI Agent",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
@@ -50,12 +50,14 @@
|
|
|
50
50
|
"gray-matter": "^4.0.0",
|
|
51
51
|
"handlebars": "^4.7.0",
|
|
52
52
|
"inquirer": "^9.0.0",
|
|
53
|
+
"semver": "^7.7.4",
|
|
53
54
|
"zod": "^3.23.0"
|
|
54
55
|
},
|
|
55
56
|
"devDependencies": {
|
|
56
57
|
"@types/fs-extra": "^11.0.0",
|
|
57
58
|
"@types/inquirer": "^9.0.0",
|
|
58
59
|
"@types/node": "^20.0.0",
|
|
60
|
+
"@types/semver": "^7.7.1",
|
|
59
61
|
"tsx": "^4.21.0",
|
|
60
62
|
"typescript": "^5.4.0",
|
|
61
63
|
"vitest": "^4.1.0"
|