@jayjiang/byoao 0.8.1 → 0.8.3
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 +109 -16
- package/dist/cli/cli-program.js.map +1 -1
- package/dist/cli/installer.js +12 -3
- package/dist/cli/installer.js.map +1 -1
- package/dist/hooks/bigquery-token.js +74 -0
- package/dist/hooks/bigquery-token.js.map +1 -0
- package/dist/hooks/system-transform.js +49 -0
- package/dist/hooks/system-transform.js.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/plugin-config.js +14 -4
- package/dist/plugin-config.js.map +1 -1
- package/dist/tools/mcp-auth.js +127 -0
- package/dist/tools/mcp-auth.js.map +1 -0
- package/dist/vault/__tests__/create.test.js +1 -0
- package/dist/vault/__tests__/create.test.js.map +1 -1
- package/dist/vault/__tests__/mcp.test.js +64 -4
- package/dist/vault/__tests__/mcp.test.js.map +1 -1
- package/dist/vault/__tests__/self-update.test.js +92 -0
- package/dist/vault/__tests__/self-update.test.js.map +1 -0
- package/dist/vault/__tests__/toolbox.test.js +17 -0
- package/dist/vault/__tests__/toolbox.test.js.map +1 -0
- package/dist/vault/create.js +28 -4
- package/dist/vault/create.js.map +1 -1
- package/dist/vault/mcp.js +46 -3
- package/dist/vault/mcp.js.map +1 -1
- package/dist/vault/self-update.js +64 -0
- package/dist/vault/self-update.js.map +1 -0
- package/dist/vault/toolbox.js +51 -0
- package/dist/vault/toolbox.js.map +1 -0
- package/package.json +1 -1
- package/src/assets/presets/common/Start Here.md.hbs +15 -0
- package/src/assets/presets/pm-tpm/preset.json +8 -1
package/dist/vault/mcp.js
CHANGED
|
@@ -1,9 +1,48 @@
|
|
|
1
|
+
import os from "node:os";
|
|
1
2
|
import { findOpencodeConfig, readOpencodeConfig, writeOpencodeConfig, } from "./opencode-config.js";
|
|
3
|
+
/**
|
|
4
|
+
* Resolve `~/` and `~/.byoao/` prefixes in a path to absolute form.
|
|
5
|
+
*/
|
|
6
|
+
function resolveHomePath(p) {
|
|
7
|
+
if (p.startsWith("~/") || p === "~") {
|
|
8
|
+
return p.replace("~", os.homedir());
|
|
9
|
+
}
|
|
10
|
+
return p;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Replace `${VAR}` placeholders in env values using the provided variables map.
|
|
14
|
+
*/
|
|
15
|
+
function resolveEnvVars(env, vars) {
|
|
16
|
+
const resolved = {};
|
|
17
|
+
for (const [key, value] of Object.entries(env)) {
|
|
18
|
+
resolved[key] = value.replace(/\$\{(\w+)\}/g, (_match, name) => vars[name] ?? "");
|
|
19
|
+
}
|
|
20
|
+
return resolved;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Build the OpenCode MCP config entry for a server.
|
|
24
|
+
* - remote: pass through as-is
|
|
25
|
+
* - local: resolve ~ paths in command array, replace env var placeholders
|
|
26
|
+
*/
|
|
27
|
+
function buildServerConfig(serverConfig, vars = {}) {
|
|
28
|
+
if (serverConfig.type === "remote") {
|
|
29
|
+
return { type: serverConfig.type, url: serverConfig.url };
|
|
30
|
+
}
|
|
31
|
+
// local (stdio)
|
|
32
|
+
const result = {
|
|
33
|
+
type: serverConfig.type,
|
|
34
|
+
command: serverConfig.command.map(resolveHomePath),
|
|
35
|
+
};
|
|
36
|
+
if (serverConfig.environment) {
|
|
37
|
+
result.environment = resolveEnvVars(serverConfig.environment, vars);
|
|
38
|
+
}
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
2
41
|
/**
|
|
3
42
|
* Merge a preset's MCP servers into the global OpenCode config.
|
|
4
43
|
* Preserves existing entries — only adds servers not already configured.
|
|
5
44
|
*/
|
|
6
|
-
export async function configureMcp(presetConfig) {
|
|
45
|
+
export async function configureMcp(presetConfig, options = {}) {
|
|
7
46
|
const mcpServers = presetConfig.mcpServers;
|
|
8
47
|
if (!mcpServers || Object.keys(mcpServers).length === 0) {
|
|
9
48
|
return null;
|
|
@@ -13,12 +52,16 @@ export async function configureMcp(presetConfig) {
|
|
|
13
52
|
const existingMcp = config.mcp || {};
|
|
14
53
|
const serversAdded = [];
|
|
15
54
|
const serversSkipped = [];
|
|
55
|
+
const skipSet = new Set(options.skip ?? []);
|
|
16
56
|
for (const [name, serverConfig] of Object.entries(mcpServers)) {
|
|
17
|
-
if (
|
|
57
|
+
if (skipSet.has(name)) {
|
|
58
|
+
serversSkipped.push(name);
|
|
59
|
+
}
|
|
60
|
+
else if (existingMcp[name]) {
|
|
18
61
|
serversSkipped.push(name);
|
|
19
62
|
}
|
|
20
63
|
else {
|
|
21
|
-
existingMcp[name] = serverConfig;
|
|
64
|
+
existingMcp[name] = buildServerConfig(serverConfig, options.vars ?? {});
|
|
22
65
|
serversAdded.push(name);
|
|
23
66
|
}
|
|
24
67
|
}
|
package/dist/vault/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/vault/mcp.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/vault/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import semver from "semver";
|
|
4
|
+
const require = createRequire(import.meta.url);
|
|
5
|
+
const PKG_VERSION = require("../../package.json").version;
|
|
6
|
+
// ── Constants ───────────────────────────────────────────────────
|
|
7
|
+
const PACKAGE_NAME = "@jayjiang/byoao";
|
|
8
|
+
const REGISTRY_TIMEOUT_MS = 5_000;
|
|
9
|
+
/**
|
|
10
|
+
* Check npm registry for a newer version of the CLI.
|
|
11
|
+
* Uses `npm view` so it inherits the user's registry/proxy config.
|
|
12
|
+
* Returns updateAvailable=false on any failure (timeout, network, etc.).
|
|
13
|
+
*/
|
|
14
|
+
export async function checkForCliUpdate() {
|
|
15
|
+
const current = PKG_VERSION;
|
|
16
|
+
let latest;
|
|
17
|
+
try {
|
|
18
|
+
const raw = execSync(`npm view ${PACKAGE_NAME} version`, {
|
|
19
|
+
timeout: REGISTRY_TIMEOUT_MS,
|
|
20
|
+
encoding: "utf-8",
|
|
21
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
22
|
+
});
|
|
23
|
+
latest = raw.trim();
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return { current, latest: current, updateAvailable: false };
|
|
27
|
+
}
|
|
28
|
+
if (!semver.valid(latest)) {
|
|
29
|
+
return { current, latest: current, updateAvailable: false };
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
current,
|
|
33
|
+
latest,
|
|
34
|
+
updateAvailable: semver.lt(current, latest),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Install a specific version of the CLI globally via npm.
|
|
39
|
+
* Never runs sudo — on permission errors, returns the manual command.
|
|
40
|
+
*/
|
|
41
|
+
export async function selfUpdateCli(targetVersion) {
|
|
42
|
+
const installCmd = `npm install -g ${PACKAGE_NAME}@${targetVersion}`;
|
|
43
|
+
try {
|
|
44
|
+
execSync(installCmd, {
|
|
45
|
+
encoding: "utf-8",
|
|
46
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
47
|
+
});
|
|
48
|
+
return { success: true };
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
52
|
+
if (message.includes("EACCES") || message.includes("permission denied")) {
|
|
53
|
+
return {
|
|
54
|
+
success: false,
|
|
55
|
+
error: `Permission denied. Run manually:\n sudo ${installCmd}`,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
success: false,
|
|
60
|
+
error: `Update failed. Run manually:\n ${installCmd}\n\n${message}`,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=self-update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"self-update.js","sourceRoot":"","sources":["../../src/vault/self-update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,WAAW,GACf,OAAO,CAAC,oBAAoB,CAC7B,CAAC,OAAiB,CAAC;AAEpB,mEAAmE;AAEnE,MAAM,YAAY,GAAG,iBAAiB,CAAC;AACvC,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAUlC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,OAAO,GAAG,WAAW,CAAC;IAC5B,IAAI,MAAc,CAAC;IAEnB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,QAAQ,CAAC,YAAY,YAAY,UAAU,EAAE;YACvD,OAAO,EAAE,mBAAmB;YAC5B,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;IAC9D,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;IAC9D,CAAC;IAED,OAAO;QACL,OAAO;QACP,MAAM;QACN,eAAe,EAAE,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;KAC5C,CAAC;AACJ,CAAC;AASD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,aAAqB;IAErB,MAAM,UAAU,GAAG,kBAAkB,YAAY,IAAI,aAAa,EAAE,CAAC;IAErE,IAAI,CAAC;QACH,QAAQ,CAAC,UAAU,EAAE;YACnB,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GACX,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAEnD,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACxE,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EACH,4CAA4C,UAAU,EAAE;aAC3D,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EACH,mCAAmC,UAAU,OAAO,OAAO,EAAE;SAChE,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
/**
|
|
3
|
+
* Check if gcloud CLI is installed and return version info.
|
|
4
|
+
*/
|
|
5
|
+
export function checkGcloud() {
|
|
6
|
+
try {
|
|
7
|
+
const output = execSync("gcloud --version", {
|
|
8
|
+
encoding: "utf-8",
|
|
9
|
+
timeout: 10_000,
|
|
10
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
11
|
+
});
|
|
12
|
+
const match = output.match(/Google Cloud SDK (\S+)/);
|
|
13
|
+
return { installed: true, version: match?.[1] ?? "unknown" };
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return { installed: false, version: "" };
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Check if ADC (Application Default Credentials) has a valid token.
|
|
21
|
+
*/
|
|
22
|
+
export function isAdcValid() {
|
|
23
|
+
try {
|
|
24
|
+
execSync("gcloud auth application-default print-access-token", {
|
|
25
|
+
encoding: "utf-8",
|
|
26
|
+
timeout: 10_000,
|
|
27
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
28
|
+
});
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Check if npx is available (Node.js installed).
|
|
37
|
+
*/
|
|
38
|
+
export function isNpxAvailable() {
|
|
39
|
+
try {
|
|
40
|
+
execSync("npx --version", {
|
|
41
|
+
encoding: "utf-8",
|
|
42
|
+
timeout: 5_000,
|
|
43
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
44
|
+
});
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=toolbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolbox.js","sourceRoot":"","sources":["../../src/vault/toolbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,kBAAkB,EAAE;YAC1C,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,MAAM;YACf,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACrD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC3C,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,QAAQ,CAAC,oDAAoD,EAAE;YAC7D,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,MAAM;YACf,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC;QACH,QAAQ,CAAC,eAAe,EAAE;YACxB,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -63,6 +63,21 @@ that /weave discovered.
|
|
|
63
63
|
| `/drift` | Compare intentions vs actions over time |
|
|
64
64
|
| `/diagnose` | Check knowledge graph health |
|
|
65
65
|
|
|
66
|
+
{{#if HAS_MCP_SERVICES}}
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Connected Services
|
|
71
|
+
|
|
72
|
+
Your AI agent can access external services configured during setup:
|
|
73
|
+
{{#each MCP_SERVICES}}
|
|
74
|
+
- **{{this.name}}** — {{this.description}}
|
|
75
|
+
{{/each}}
|
|
76
|
+
|
|
77
|
+
These services authenticate via your browser. If a connection expires,
|
|
78
|
+
tell the agent: "reconnect to {service name}".
|
|
79
|
+
|
|
80
|
+
{{/if}}
|
|
66
81
|
---
|
|
67
82
|
|
|
68
83
|
## Key Files
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pm-tpm",
|
|
3
3
|
"displayName": "PM / TPM",
|
|
4
|
-
"description": "Project tracking, sprint cycles, stakeholder management",
|
|
4
|
+
"description": "Project tracking, sprint cycles, stakeholder management, data analysis",
|
|
5
5
|
"directories": ["Projects", "Sprints"],
|
|
6
6
|
"agentDescription": "PM/TPM knowledge base",
|
|
7
7
|
"frontmatterExtras": {
|
|
@@ -13,6 +13,13 @@
|
|
|
13
13
|
"atlassian": {
|
|
14
14
|
"type": "remote",
|
|
15
15
|
"url": "https://mcp.atlassian.com/v1/sse"
|
|
16
|
+
},
|
|
17
|
+
"bigquery": {
|
|
18
|
+
"type": "local",
|
|
19
|
+
"command": ["npx", "-y", "@toolbox-sdk/server", "--prebuilt=bigquery", "--stdio"],
|
|
20
|
+
"environment": {
|
|
21
|
+
"BIGQUERY_PROJECT": "${GCP_PROJECT_ID}"
|
|
22
|
+
}
|
|
16
23
|
}
|
|
17
24
|
},
|
|
18
25
|
"obsidianPlugins": {
|