@goondocks/myco 0.12.5 → 0.12.7
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/{agent-run-M5MRCHHK.js → agent-run-WM3PFA3Y.js} +4 -4
- package/dist/{agent-tasks-XWU2J6RM.js → agent-tasks-MONSZFG7.js} +4 -4
- package/dist/{chunk-OCHZEEBW.js → chunk-46C4ADA4.js} +2 -2
- package/dist/{chunk-DQN227GB.js → chunk-NYG4YIFJ.js} +2 -2
- package/dist/{chunk-GYX5ORTK.js → chunk-R52WNQIK.js} +44 -25
- package/dist/chunk-R52WNQIK.js.map +1 -0
- package/dist/{chunk-DFRUX73Z.js → chunk-SBJKSZZE.js} +2 -2
- package/dist/{chunk-4TWNYT2A.js → chunk-TIFE27JS.js} +2 -2
- package/dist/{cli-WV44ASNA.js → cli-D6SW3X7M.js} +32 -32
- package/dist/{client-RLYDYEAQ.js → client-JHV6WMHB.js} +3 -3
- package/dist/{doctor-PBAWC4MH.js → doctor-X5CVDZCL.js} +4 -4
- package/dist/{executor-DRMZPQ2R.js → executor-QRGGW4H7.js} +2 -2
- package/dist/{init-AEVRCGI6.js → init-US52M3AV.js} +7 -7
- package/dist/{init-wizard-NLCS3OPH.js → init-wizard-CNW3KWND.js} +2 -2
- package/dist/{main-Q7EYHMF2.js → main-2ZCTH6JF.js} +8 -8
- package/dist/{open-CUPTWLTS.js → open-LDE3NMWS.js} +4 -4
- package/dist/{post-compact-EBJQPOP3.js → post-compact-BNBLIHBB.js} +4 -4
- package/dist/{post-tool-use-X2ULS4EV.js → post-tool-use-OAVV3HJ6.js} +3 -3
- package/dist/{post-tool-use-failure-FEKUCHV7.js → post-tool-use-failure-DRM7FKKO.js} +4 -4
- package/dist/{pre-compact-AWI47WPI.js → pre-compact-BU5P4VUK.js} +4 -4
- package/dist/{remove-LEAA4ZST.js → remove-XOKHXEC5.js} +4 -4
- package/dist/{restart-PW5HZAXE.js → restart-K7WW6HT5.js} +5 -5
- package/dist/{search-TO3NM34A.js → search-W45MUD6X.js} +4 -4
- package/dist/{server-2MBRXGJ7.js → server-YAMYC52G.js} +3 -3
- package/dist/{session-MVTTUSDI.js → session-VBAXOCYP.js} +4 -4
- package/dist/{session-end-D7DZLDQT.js → session-end-MS7QSOOG.js} +3 -3
- package/dist/{session-start-ISWAH5FP.js → session-start-YVLOEHSJ.js} +3 -3
- package/dist/{setup-llm-EFI3VVVP.js → setup-llm-X7M3CCZU.js} +4 -4
- package/dist/src/cli.js +1 -1
- package/dist/src/daemon/main.js +1 -1
- package/dist/src/hooks/post-tool-use.js +1 -1
- package/dist/src/hooks/session-end.js +1 -1
- package/dist/src/hooks/session-start.js +1 -1
- package/dist/src/hooks/stop.js +1 -1
- package/dist/src/hooks/user-prompt-submit.js +1 -1
- package/dist/src/mcp/server.js +1 -1
- package/dist/{stats-S53OHF7M.js → stats-HJS43XXW.js} +5 -5
- package/dist/{stop-CW5THY32.js → stop-O7ZCYIFZ.js} +3 -3
- package/dist/{stop-failure-2R7ZDDGP.js → stop-failure-MRJBYLFU.js} +4 -4
- package/dist/{subagent-start-PEHXZOCI.js → subagent-start-DUHEJR4K.js} +4 -4
- package/dist/{subagent-stop-NTYF7YAC.js → subagent-stop-OBPIXEIL.js} +4 -4
- package/dist/{task-completed-GQWZMW3X.js → task-completed-JJOH4QFA.js} +4 -4
- package/dist/{update-4NS4RE4J.js → update-Q3AU7UDC.js} +4 -4
- package/dist/{user-prompt-submit-QNOWUBXR.js → user-prompt-submit-PL4IH4GZ.js} +3 -3
- package/dist/{version-YEDZSMTK.js → version-DPPJB3HZ.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-GYX5ORTK.js.map +0 -1
- /package/dist/{agent-run-M5MRCHHK.js.map → agent-run-WM3PFA3Y.js.map} +0 -0
- /package/dist/{agent-tasks-XWU2J6RM.js.map → agent-tasks-MONSZFG7.js.map} +0 -0
- /package/dist/{chunk-OCHZEEBW.js.map → chunk-46C4ADA4.js.map} +0 -0
- /package/dist/{chunk-DQN227GB.js.map → chunk-NYG4YIFJ.js.map} +0 -0
- /package/dist/{chunk-DFRUX73Z.js.map → chunk-SBJKSZZE.js.map} +0 -0
- /package/dist/{chunk-4TWNYT2A.js.map → chunk-TIFE27JS.js.map} +0 -0
- /package/dist/{cli-WV44ASNA.js.map → cli-D6SW3X7M.js.map} +0 -0
- /package/dist/{client-RLYDYEAQ.js.map → client-JHV6WMHB.js.map} +0 -0
- /package/dist/{doctor-PBAWC4MH.js.map → doctor-X5CVDZCL.js.map} +0 -0
- /package/dist/{executor-DRMZPQ2R.js.map → executor-QRGGW4H7.js.map} +0 -0
- /package/dist/{init-AEVRCGI6.js.map → init-US52M3AV.js.map} +0 -0
- /package/dist/{init-wizard-NLCS3OPH.js.map → init-wizard-CNW3KWND.js.map} +0 -0
- /package/dist/{main-Q7EYHMF2.js.map → main-2ZCTH6JF.js.map} +0 -0
- /package/dist/{open-CUPTWLTS.js.map → open-LDE3NMWS.js.map} +0 -0
- /package/dist/{post-compact-EBJQPOP3.js.map → post-compact-BNBLIHBB.js.map} +0 -0
- /package/dist/{post-tool-use-X2ULS4EV.js.map → post-tool-use-OAVV3HJ6.js.map} +0 -0
- /package/dist/{post-tool-use-failure-FEKUCHV7.js.map → post-tool-use-failure-DRM7FKKO.js.map} +0 -0
- /package/dist/{pre-compact-AWI47WPI.js.map → pre-compact-BU5P4VUK.js.map} +0 -0
- /package/dist/{remove-LEAA4ZST.js.map → remove-XOKHXEC5.js.map} +0 -0
- /package/dist/{restart-PW5HZAXE.js.map → restart-K7WW6HT5.js.map} +0 -0
- /package/dist/{search-TO3NM34A.js.map → search-W45MUD6X.js.map} +0 -0
- /package/dist/{server-2MBRXGJ7.js.map → server-YAMYC52G.js.map} +0 -0
- /package/dist/{session-MVTTUSDI.js.map → session-VBAXOCYP.js.map} +0 -0
- /package/dist/{session-end-D7DZLDQT.js.map → session-end-MS7QSOOG.js.map} +0 -0
- /package/dist/{session-start-ISWAH5FP.js.map → session-start-YVLOEHSJ.js.map} +0 -0
- /package/dist/{setup-llm-EFI3VVVP.js.map → setup-llm-X7M3CCZU.js.map} +0 -0
- /package/dist/{stats-S53OHF7M.js.map → stats-HJS43XXW.js.map} +0 -0
- /package/dist/{stop-CW5THY32.js.map → stop-O7ZCYIFZ.js.map} +0 -0
- /package/dist/{stop-failure-2R7ZDDGP.js.map → stop-failure-MRJBYLFU.js.map} +0 -0
- /package/dist/{subagent-start-PEHXZOCI.js.map → subagent-start-DUHEJR4K.js.map} +0 -0
- /package/dist/{subagent-stop-NTYF7YAC.js.map → subagent-stop-OBPIXEIL.js.map} +0 -0
- /package/dist/{task-completed-GQWZMW3X.js.map → task-completed-JJOH4QFA.js.map} +0 -0
- /package/dist/{update-4NS4RE4J.js.map → update-Q3AU7UDC.js.map} +0 -0
- /package/dist/{user-prompt-submit-QNOWUBXR.js.map → user-prompt-submit-PL4IH4GZ.js.map} +0 -0
- /package/dist/{version-YEDZSMTK.js.map → version-DPPJB3HZ.js.map} +0 -0
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
connectToDaemon
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-R52WNQIK.js";
|
|
5
5
|
import "./chunk-SAKJMNSR.js";
|
|
6
6
|
import "./chunk-LUQBT2Y4.js";
|
|
7
7
|
import "./chunk-MYX5NCRH.js";
|
|
8
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-TIFE27JS.js";
|
|
9
9
|
import "./chunk-PIRWYDOH.js";
|
|
10
10
|
import "./chunk-S6I62FAH.js";
|
|
11
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-46C4ADA4.js";
|
|
12
12
|
import "./chunk-LPUQPDC2.js";
|
|
13
13
|
import "./chunk-PZUWP5VK.js";
|
|
14
14
|
|
|
@@ -31,4 +31,4 @@ async function run(args, vaultDir) {
|
|
|
31
31
|
export {
|
|
32
32
|
run
|
|
33
33
|
};
|
|
34
|
-
//# sourceMappingURL=agent-run-
|
|
34
|
+
//# sourceMappingURL=agent-run-WM3PFA3Y.js.map
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
connectToDaemon
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-R52WNQIK.js";
|
|
5
5
|
import "./chunk-SAKJMNSR.js";
|
|
6
6
|
import "./chunk-LUQBT2Y4.js";
|
|
7
7
|
import "./chunk-MYX5NCRH.js";
|
|
8
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-TIFE27JS.js";
|
|
9
9
|
import "./chunk-PIRWYDOH.js";
|
|
10
10
|
import "./chunk-S6I62FAH.js";
|
|
11
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-46C4ADA4.js";
|
|
12
12
|
import "./chunk-LPUQPDC2.js";
|
|
13
13
|
import "./chunk-PZUWP5VK.js";
|
|
14
14
|
|
|
@@ -177,4 +177,4 @@ async function run(args, vaultDir) {
|
|
|
177
177
|
export {
|
|
178
178
|
run
|
|
179
179
|
};
|
|
180
|
-
//# sourceMappingURL=agent-tasks-
|
|
180
|
+
//# sourceMappingURL=agent-tasks-MONSZFG7.js.map
|
|
@@ -11,7 +11,7 @@ var cached;
|
|
|
11
11
|
function getPluginVersion() {
|
|
12
12
|
if (cached) return cached;
|
|
13
13
|
if (true) {
|
|
14
|
-
cached = "0.12.
|
|
14
|
+
cached = "0.12.7";
|
|
15
15
|
return cached;
|
|
16
16
|
}
|
|
17
17
|
const root = findPackageRoot(path.dirname(fileURLToPath(import.meta.url)));
|
|
@@ -32,4 +32,4 @@ function getPluginVersion() {
|
|
|
32
32
|
export {
|
|
33
33
|
getPluginVersion
|
|
34
34
|
};
|
|
35
|
-
//# sourceMappingURL=chunk-
|
|
35
|
+
//# sourceMappingURL=chunk-46C4ADA4.js.map
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
} from "./chunk-RR75ZKEV.js";
|
|
9
9
|
import {
|
|
10
10
|
DaemonClient
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-TIFE27JS.js";
|
|
12
12
|
import {
|
|
13
13
|
resolveVaultDir
|
|
14
14
|
} from "./chunk-JTYZRPX5.js";
|
|
@@ -39,4 +39,4 @@ async function sendEvent(hookName, buildEvent) {
|
|
|
39
39
|
export {
|
|
40
40
|
sendEvent
|
|
41
41
|
};
|
|
42
|
-
//# sourceMappingURL=chunk-
|
|
42
|
+
//# sourceMappingURL=chunk-NYG4YIFJ.js.map
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
} from "./chunk-MYX5NCRH.js";
|
|
11
11
|
import {
|
|
12
12
|
DaemonClient
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-TIFE27JS.js";
|
|
14
14
|
|
|
15
15
|
// src/symbionts/installer.ts
|
|
16
16
|
import fs from "fs";
|
|
@@ -318,29 +318,57 @@ var SymbiontInstaller = class {
|
|
|
318
318
|
return [];
|
|
319
319
|
}
|
|
320
320
|
}
|
|
321
|
-
/**
|
|
321
|
+
/**
|
|
322
|
+
* Reconcile Myco-owned skill entries in project .gitignore.
|
|
323
|
+
* Computes the desired entry set, strips any existing Myco block
|
|
324
|
+
* (and legacy entries), then writes the current block if changed.
|
|
325
|
+
*/
|
|
322
326
|
updateGitignore() {
|
|
323
327
|
const reg = this.manifest.registration;
|
|
324
328
|
if (!reg?.skillsTarget) return;
|
|
325
329
|
const skillNames = this.listSkillDirs();
|
|
326
|
-
const
|
|
327
|
-
`${CANONICAL_SKILLS_DIR}
|
|
330
|
+
const desired = [
|
|
331
|
+
...skillNames.map((name) => `${CANONICAL_SKILLS_DIR}/${name}`),
|
|
328
332
|
...reg.skillsTarget !== CANONICAL_SKILLS_DIR ? skillNames.map((name) => `${reg.skillsTarget}/${name}`) : []
|
|
329
333
|
];
|
|
330
334
|
const gitignorePath = path.join(this.projectRoot, ".gitignore");
|
|
331
|
-
let
|
|
335
|
+
let content = "";
|
|
332
336
|
try {
|
|
333
|
-
|
|
337
|
+
content = fs.readFileSync(gitignorePath, "utf-8");
|
|
334
338
|
} catch {
|
|
335
339
|
}
|
|
336
|
-
const
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
340
|
+
const stripped = this.stripMycoGitignoreBlock(content, skillNames);
|
|
341
|
+
const desiredBlock = desired.length > 0 ? `${GITIGNORE_SKILLS_COMMENT}
|
|
342
|
+
${desired.join("\n")}
|
|
343
|
+
` : "";
|
|
344
|
+
if (stripped === content && desiredBlock === "") return;
|
|
345
|
+
const separator = stripped.length > 0 && !stripped.endsWith("\n") ? "\n" : "";
|
|
346
|
+
const spacer = stripped.length > 0 && desiredBlock.length > 0 ? "\n" : "";
|
|
347
|
+
const result = stripped + separator + spacer + desiredBlock;
|
|
348
|
+
if (result === content) return;
|
|
349
|
+
fs.writeFileSync(gitignorePath, result, "utf-8");
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Remove all Myco-owned gitignore entries: the comment header, per-skill
|
|
353
|
+
* entries for both canonical and agent-specific paths, and legacy blanket
|
|
354
|
+
* directory entries. Returns the cleaned content.
|
|
355
|
+
*/
|
|
356
|
+
stripMycoGitignoreBlock(content, skillNames) {
|
|
357
|
+
const reg = this.manifest.registration;
|
|
358
|
+
const ownedLines = /* @__PURE__ */ new Set([
|
|
359
|
+
GITIGNORE_SKILLS_COMMENT,
|
|
360
|
+
`${CANONICAL_SKILLS_DIR}/`
|
|
361
|
+
// legacy blanket entry
|
|
362
|
+
]);
|
|
363
|
+
for (const name of skillNames) {
|
|
364
|
+
ownedLines.add(`${CANONICAL_SKILLS_DIR}/${name}`);
|
|
365
|
+
if (reg?.skillsTarget && reg.skillsTarget !== CANONICAL_SKILLS_DIR) {
|
|
366
|
+
ownedLines.add(`${reg.skillsTarget}/${name}`);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
const lines = content.split("\n");
|
|
370
|
+
const filtered = lines.filter((line) => !ownedLines.has(line));
|
|
371
|
+
return filtered.join("\n").replace(/\n{3,}/g, "\n\n").trimEnd() + (filtered.length > 0 ? "\n" : "");
|
|
344
372
|
}
|
|
345
373
|
/**
|
|
346
374
|
* Merge hooks template into the target settings file.
|
|
@@ -597,16 +625,7 @@ ${newEntries.join("\n")}
|
|
|
597
625
|
} catch {
|
|
598
626
|
return;
|
|
599
627
|
}
|
|
600
|
-
const
|
|
601
|
-
const skillNames = reg?.skillsTarget && reg.skillsTarget !== CANONICAL_SKILLS_DIR ? this.listSkillDirs() : [];
|
|
602
|
-
const lines = content.split("\n");
|
|
603
|
-
const filtered = lines.filter((line) => {
|
|
604
|
-
if (line === GITIGNORE_SKILLS_COMMENT) return false;
|
|
605
|
-
if (line === `${CANONICAL_SKILLS_DIR}/`) return false;
|
|
606
|
-
if (skillNames.some((name) => line === `${reg.skillsTarget}/${name}`)) return false;
|
|
607
|
-
return true;
|
|
608
|
-
});
|
|
609
|
-
const cleaned = filtered.join("\n").replace(/\n{3,}/g, "\n\n").trim();
|
|
628
|
+
const cleaned = this.stripMycoGitignoreBlock(content, this.listSkillDirs()).trim();
|
|
610
629
|
if (cleaned) {
|
|
611
630
|
fs.writeFileSync(gitignorePath, cleaned + "\n", "utf-8");
|
|
612
631
|
} else {
|
|
@@ -864,4 +883,4 @@ export {
|
|
|
864
883
|
VAULT_GITIGNORE,
|
|
865
884
|
registerSymbionts
|
|
866
885
|
};
|
|
867
|
-
//# sourceMappingURL=chunk-
|
|
886
|
+
//# sourceMappingURL=chunk-R52WNQIK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/symbionts/installer.ts","../src/cli/shared.ts"],"sourcesContent":["import type { SymbiontManifest } from './manifest-schema.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\n/** Prefix used to identify Myco-owned hooks in settings files. */\nconst MYCO_HOOK_COMMAND_PREFIX = 'myco-run';\nconst MYCO_HOOK_GUARD_PREFIX = 'node .agents/myco-hook.cjs';\n\n/** Check if a command string belongs to Myco (old or new guard format). */\nfunction isMycoHookCommand(command: string): boolean {\n return command.startsWith(MYCO_HOOK_COMMAND_PREFIX) || command.startsWith(MYCO_HOOK_GUARD_PREFIX);\n}\n\n/**\n * Check if a hook group is Myco-owned.\n * Handles both nested format (Claude Code, Codex, etc.) and flat format (Windsurf).\n *\n * Nested: { hooks: [{ command: \"node .agents/myco-hook.cjs ...\" }] }\n * Flat: { command: \"node .agents/myco-hook.cjs ...\" }\n */\nfunction isMycoHookGroup(group: Record<string, unknown>): boolean {\n // Nested format: { hooks: [{ command: \"...\" }] }\n if (Array.isArray(group.hooks) && group.hooks.some((h: { command?: string }) => h.command && isMycoHookCommand(h.command))) return true;\n // Flat format: { command: \"...\" }\n if (typeof group.command === 'string' && isMycoHookCommand(group.command)) return true;\n return false;\n}\n\n/** Comment header for Myco entries in .gitignore. */\nconst GITIGNORE_SKILLS_COMMENT = '# Myco skill symlinks (machine-specific)';\n\n/** Subdirectory within the package where symbiont templates live. */\nconst TEMPLATES_SUBDIR = 'src/symbionts/templates';\n\n/** Filename of the hook guard template in the templates directory. */\nconst HOOK_GUARD_TEMPLATE_FILENAME = 'hook-guard.cjs';\n\n/** Filename when installed into the project .agents/ directory. */\nconst HOOK_GUARD_INSTALLED_FILENAME = 'myco-hook.cjs';\n\n/** Project-relative path where the hook guard is installed. */\nconst HOOK_GUARD_PROJECT_PATH = `.agents/${HOOK_GUARD_INSTALLED_FILENAME}`;\n\n/** Subdirectory within the package where skills live. */\nconst SKILLS_SUBDIR = 'skills';\n\n/** Canonical cross-agent skills directory. */\nconst CANONICAL_SKILLS_DIR = '.agents/skills';\n\n/** MCP server name used by Myco in all symbiont configurations. */\nexport const MYCO_MCP_SERVER_NAME = 'myco';\n\n/** Marker text used to identify unmodified instruction stubs. */\nconst INSTRUCTIONS_STUB_MARKER = 'Edit AGENTS.md, not this file';\n\n/** Start/end markers for the reference block prepended to existing instruction files. */\nconst INSTRUCTIONS_REF_START = '<!-- myco:agents-ref:start -->';\nconst INSTRUCTIONS_REF_END = '<!-- myco:agents-ref:end -->';\n\n/** Reference block prepended to existing instruction files. */\nconst INSTRUCTIONS_REF_BLOCK = `${INSTRUCTIONS_REF_START}\n> **Project intelligence:** This project uses [Myco](https://myco.sh). The canonical project rules are in [\\`AGENTS.md\\`](AGENTS.md) — read and follow it alongside this file.\n${INSTRUCTIONS_REF_END}\n\n`;\n\nexport interface InstallResult {\n hooks: boolean;\n mcp: boolean;\n skills: boolean;\n settings: boolean;\n instructions: boolean;\n}\n\nexport class SymbiontInstaller {\n constructor(\n private manifest: SymbiontManifest,\n private projectRoot: string,\n private packageRoot: string,\n ) {}\n\n /**\n * Copy the hook-guard script into .agents/myco-hook.cjs.\n * Returns true if the file was written (or updated); false if skipped or N/A.\n */\n installHookGuard(): boolean {\n const reg = this.manifest.registration;\n if (!reg?.hooksTarget) return false;\n\n const guardTemplate = this.loadHookGuardTemplate();\n if (!guardTemplate) return false;\n\n const targetPath = path.join(this.projectRoot, HOOK_GUARD_PROJECT_PATH);\n\n // Skip if already current\n try {\n if (fs.readFileSync(targetPath, 'utf-8') === guardTemplate) return false;\n } catch { /* doesn't exist — proceed */ }\n\n fs.mkdirSync(path.dirname(targetPath), { recursive: true });\n fs.writeFileSync(targetPath, guardTemplate, 'utf-8');\n return true;\n }\n\n /**\n * Remove the hook-guard script from .agents/myco-hook.cjs.\n * Returns true if the file was removed; false otherwise.\n */\n uninstallHookGuard(): boolean {\n const reg = this.manifest.registration;\n if (!reg?.hooksTarget) return false;\n\n const targetPath = path.join(this.projectRoot, HOOK_GUARD_PROJECT_PATH);\n try {\n fs.unlinkSync(targetPath);\n return true;\n } catch {\n return false;\n }\n }\n\n /** Load the hook-guard template from package root. */\n private loadHookGuardTemplate(): string | null {\n const candidates = [\n path.join(this.packageRoot, TEMPLATES_SUBDIR, HOOK_GUARD_TEMPLATE_FILENAME),\n path.join(this.packageRoot, 'dist', TEMPLATES_SUBDIR, HOOK_GUARD_TEMPLATE_FILENAME),\n ];\n for (const p of candidates) {\n try { return fs.readFileSync(p, 'utf-8'); } catch { /* try next */ }\n }\n return null;\n }\n\n /** Load a JSON template file for this symbiont. Returns null if not found. */\n loadTemplate(name: string): Record<string, unknown> | null {\n // Check both source layout and dist layout\n const candidates = [\n path.join(this.packageRoot, TEMPLATES_SUBDIR, this.manifest.name, `${name}.json`),\n // tsup preserves the src/ prefix under dist/, so the same subdir works in both layouts\n path.join(this.packageRoot, 'dist', TEMPLATES_SUBDIR, this.manifest.name, `${name}.json`),\n ];\n for (const filePath of candidates) {\n try {\n return JSON.parse(fs.readFileSync(filePath, 'utf-8'));\n } catch { /* not found or malformed — try next */ }\n }\n return null;\n }\n\n /** Run all registration steps. */\n install(): InstallResult {\n const reg = this.manifest.registration;\n // Install hook guard before hooks so the guard script is in place when hooks reference it\n this.installHookGuard();\n const result = this.shouldBatchJsonTargets(reg)\n ? this.installBatchedJson(reg!)\n : {\n hooks: this.installHooks(),\n mcp: this.installMcp(),\n skills: this.installSkills(),\n settings: this.installSettings(),\n instructions: this.installInstructions(),\n };\n this.updateGitignore();\n return result;\n }\n\n /**\n * Check if ALL non-null JSON targets share the same file (e.g., Gemini).\n * Only batches when every target resolves to one path — partial overlaps\n * (e.g., Claude Code: hooks+settings share but MCP is separate) use normal path.\n */\n private shouldBatchJsonTargets(reg: typeof this.manifest.registration): boolean {\n if (!reg) return false;\n const mcpFormat = reg.mcpFormat ?? 'json';\n if (mcpFormat !== 'json') return false;\n const targets = [reg.hooksTarget, reg.mcpTarget, reg.settingsTarget].filter(Boolean);\n return targets.length > 1 && new Set(targets).size === 1;\n }\n\n /**\n * Batched install for agents where hooks, MCP, and settings share one JSON file.\n * Single read → apply all transforms in memory → single write.\n */\n private installBatchedJson(reg: NonNullable<typeof this.manifest.registration>): InstallResult {\n const targetPath = path.join(this.projectRoot, reg.hooksTarget ?? reg.mcpTarget ?? reg.settingsTarget!);\n let data = readJsonFile(targetPath);\n let hooks = false, mcp = false, settings = false;\n\n // Apply hooks transform\n const hooksTemplate = reg.hooksTarget ? this.loadTemplate('hooks') : null;\n if (hooksTemplate) {\n const existingHooks = (data.hooks ?? {}) as Record<string, unknown[]>;\n const mergedHooks: Record<string, unknown[]> = {};\n for (const [event, groups] of Object.entries(existingHooks)) {\n const nonMyco = (groups as Array<Record<string, unknown>>).filter((g) => !isMycoHookGroup(g));\n if (nonMyco.length > 0) mergedHooks[event] = nonMyco;\n }\n for (const [event, groups] of Object.entries(hooksTemplate)) {\n mergedHooks[event] = [...(mergedHooks[event] ?? []), ...(groups as unknown[])];\n }\n data.hooks = mergedHooks;\n hooks = true;\n }\n\n // Apply MCP transform\n const mcpTemplate = reg.mcpTarget ? this.loadTemplate('mcp') : null;\n if (mcpTemplate) {\n const servers = (data.mcpServers ?? {}) as Record<string, unknown>;\n for (const [name, def] of Object.entries(mcpTemplate)) {\n servers[name] = def;\n }\n data.mcpServers = servers;\n mcp = true;\n }\n\n // Apply settings transform\n const settingsTemplate = reg.settingsTarget ? this.loadTemplate('settings') : null;\n if (settingsTemplate) {\n data = deepMergeSettings(data, settingsTemplate);\n settings = true;\n }\n\n writeJsonFile(targetPath, data);\n\n return {\n hooks,\n mcp,\n skills: this.installSkills(),\n settings,\n instructions: this.installInstructions(),\n };\n }\n\n /** Remove all Myco registration from this symbiont's project files. */\n uninstall(): InstallResult {\n const reg = this.manifest.registration;\n const result = this.shouldBatchJsonTargets(reg)\n ? this.uninstallBatchedJson(reg!)\n : {\n hooks: this.uninstallHooks(),\n mcp: this.uninstallMcp(),\n skills: this.uninstallSkills(),\n settings: this.uninstallSettings(),\n instructions: this.uninstallInstructions(),\n };\n // Remove hook guard after hooks/settings so the file is cleaned up last\n this.uninstallHookGuard();\n this.cleanGitignore();\n return result;\n }\n\n /**\n * Batched uninstall for agents where hooks, MCP, and settings share one JSON file.\n */\n private uninstallBatchedJson(reg: NonNullable<typeof this.manifest.registration>): InstallResult {\n const targetPath = path.join(this.projectRoot, reg.hooksTarget ?? reg.mcpTarget ?? reg.settingsTarget!);\n const data = readJsonFile(targetPath);\n if (Object.keys(data).length === 0) {\n return { hooks: false, mcp: false, skills: this.uninstallSkills(), settings: false, instructions: this.uninstallInstructions() };\n }\n\n let hooks = false, mcp = false, settings = false;\n\n // Remove hooks\n if (reg.hooksTarget) {\n const existingHooks = (data.hooks ?? {}) as Record<string, unknown[]>;\n if (Object.keys(existingHooks).length > 0) {\n const cleaned: Record<string, unknown[]> = {};\n for (const [event, groups] of Object.entries(existingHooks)) {\n const nonMyco = (groups as Array<Record<string, unknown>>).filter((g) => !isMycoHookGroup(g));\n if (nonMyco.length > 0) cleaned[event] = nonMyco;\n }\n if (Object.keys(cleaned).length === 0) {\n delete data.hooks;\n } else {\n data.hooks = cleaned;\n }\n hooks = true;\n }\n }\n\n // Remove MCP\n if (reg.mcpTarget) {\n const servers = (data.mcpServers ?? {}) as Record<string, unknown>;\n if (servers[MYCO_MCP_SERVER_NAME]) {\n delete servers[MYCO_MCP_SERVER_NAME];\n if (Object.keys(servers).length === 0) delete data.mcpServers;\n else data.mcpServers = servers;\n mcp = true;\n }\n }\n\n // Remove settings\n const settingsTemplate = reg.settingsTarget ? this.loadTemplate('settings') : null;\n if (settingsTemplate) {\n settings = deepRemoveSettings(data, settingsTemplate);\n }\n\n writeOrDeleteJsonFile(targetPath, data);\n\n return { hooks, mcp, skills: this.uninstallSkills(), settings, instructions: this.uninstallInstructions() };\n }\n\n /**\n * Ensure the instruction file references AGENTS.md.\n * - File doesn't exist: write the full stub template.\n * - File exists without reference: prepend a reference block.\n * - File already has reference: skip (idempotent).\n *\n * Also ensures AGENTS.md exists — creates a starter if missing.\n */\n installInstructions(): boolean {\n const reg = this.manifest.registration;\n if (!reg?.instructionsFile) return false;\n\n // Ensure AGENTS.md exists before creating stubs that reference it\n ensureAgentsMd(this.projectRoot, this.packageRoot);\n\n const targetPath = path.join(this.projectRoot, reg.instructionsFile);\n\n // Check if file already exists\n let existing: string | null = null;\n try { existing = fs.readFileSync(targetPath, 'utf-8'); } catch { /* doesn't exist */ }\n\n if (existing !== null) {\n // File exists — check if it already has our reference\n if (existing.includes(INSTRUCTIONS_REF_START) || existing.includes(INSTRUCTIONS_STUB_MARKER)) {\n return false; // Already has reference — idempotent\n }\n // Prepend reference block to existing content\n fs.writeFileSync(targetPath, INSTRUCTIONS_REF_BLOCK + existing, 'utf-8');\n return true;\n }\n\n // File doesn't exist — write the full stub template\n const templateCandidates = [\n path.join(this.packageRoot, 'src/symbionts/templates/instructions-stub.md'),\n path.join(this.packageRoot, 'dist/src/symbionts/templates/instructions-stub.md'),\n ];\n let stub: string | null = null;\n for (const p of templateCandidates) {\n try { stub = fs.readFileSync(p, 'utf-8'); break; } catch { /* try next */ }\n }\n if (!stub) return false;\n\n stub = stub.replace('{agentDisplayName}', this.manifest.displayName);\n fs.mkdirSync(path.dirname(targetPath), { recursive: true });\n fs.writeFileSync(targetPath, stub, 'utf-8');\n return true;\n }\n\n /**\n * Remove Myco's instruction file reference.\n * - If file is the full stub (only Myco content): delete it.\n * - If file has user content + prepended reference: remove just the reference block.\n */\n uninstallInstructions(): boolean {\n const reg = this.manifest.registration;\n if (!reg?.instructionsFile) return false;\n\n const targetPath = path.join(this.projectRoot, reg.instructionsFile);\n let content: string;\n try { content = fs.readFileSync(targetPath, 'utf-8'); } catch { return false; }\n\n // Case 1: Full stub — delete the file entirely\n if (content.includes(INSTRUCTIONS_STUB_MARKER)) {\n fs.unlinkSync(targetPath);\n return true;\n }\n\n // Case 2: Prepended reference block — remove just the block\n if (content.includes(INSTRUCTIONS_REF_START)) {\n const startIdx = content.indexOf(INSTRUCTIONS_REF_START);\n const endIdx = content.indexOf(INSTRUCTIONS_REF_END);\n if (endIdx > startIdx) {\n // Remove from start marker through end marker + trailing whitespace\n const afterEnd = endIdx + INSTRUCTIONS_REF_END.length;\n const cleaned = (content.slice(0, startIdx) + content.slice(afterEnd)).replace(/^\\n+/, '');\n fs.writeFileSync(targetPath, cleaned, 'utf-8');\n return true;\n }\n }\n\n return false;\n }\n\n /** List skill directory names from the package root. Returns empty array if not found. */\n private listSkillDirs(): string[] {\n try {\n return fs.readdirSync(path.join(this.packageRoot, SKILLS_SUBDIR), { withFileTypes: true })\n .filter((d) => d.isDirectory())\n .map((d) => d.name);\n } catch { return []; }\n }\n\n /**\n * Reconcile Myco-owned skill entries in project .gitignore.\n * Computes the desired entry set, strips any existing Myco block\n * (and legacy entries), then writes the current block if changed.\n */\n private updateGitignore(): void {\n const reg = this.manifest.registration;\n if (!reg?.skillsTarget) return;\n\n const skillNames = this.listSkillDirs();\n\n // Desired state: per-skill entries for canonical + agent-specific paths\n const desired = [\n ...skillNames.map((name) => `${CANONICAL_SKILLS_DIR}/${name}`),\n ...(reg.skillsTarget !== CANONICAL_SKILLS_DIR\n ? skillNames.map((name) => `${reg.skillsTarget}/${name}`)\n : []\n ),\n ];\n\n const gitignorePath = path.join(this.projectRoot, '.gitignore');\n let content = '';\n try { content = fs.readFileSync(gitignorePath, 'utf-8'); } catch { /* doesn't exist yet */ }\n\n // Strip existing Myco block and any legacy entries\n const stripped = this.stripMycoGitignoreBlock(content, skillNames);\n\n // Build the new block\n const desiredBlock = desired.length > 0\n ? `${GITIGNORE_SKILLS_COMMENT}\\n${desired.join('\\n')}\\n`\n : '';\n\n // Check if anything changed\n if (stripped === content && desiredBlock === '') return;\n const separator = stripped.length > 0 && !stripped.endsWith('\\n') ? '\\n' : '';\n const spacer = stripped.length > 0 && desiredBlock.length > 0 ? '\\n' : '';\n const result = stripped + separator + spacer + desiredBlock;\n if (result === content) return;\n\n fs.writeFileSync(gitignorePath, result, 'utf-8');\n }\n\n /**\n * Remove all Myco-owned gitignore entries: the comment header, per-skill\n * entries for both canonical and agent-specific paths, and legacy blanket\n * directory entries. Returns the cleaned content.\n */\n private stripMycoGitignoreBlock(content: string, skillNames: string[]): string {\n const reg = this.manifest.registration;\n const ownedLines = new Set<string>([\n GITIGNORE_SKILLS_COMMENT,\n `${CANONICAL_SKILLS_DIR}/`, // legacy blanket entry\n ]);\n for (const name of skillNames) {\n ownedLines.add(`${CANONICAL_SKILLS_DIR}/${name}`);\n if (reg?.skillsTarget && reg.skillsTarget !== CANONICAL_SKILLS_DIR) {\n ownedLines.add(`${reg.skillsTarget}/${name}`);\n }\n }\n\n const lines = content.split('\\n');\n const filtered = lines.filter((line) => !ownedLines.has(line));\n return filtered.join('\\n').replace(/\\n{3,}/g, '\\n\\n').trimEnd() + (filtered.length > 0 ? '\\n' : '');\n }\n\n /**\n * Merge hooks template into the target settings file.\n * Replaces all Myco-owned hook groups; preserves non-Myco hooks.\n */\n installHooks(): boolean {\n const reg = this.manifest.registration;\n if (!reg?.hooksTarget) return false;\n\n const template = this.loadTemplate('hooks');\n if (!template) return false;\n\n const targetPath = path.join(this.projectRoot, reg.hooksTarget);\n const settings = readJsonFile(targetPath);\n const existingHooks = (settings.hooks ?? {}) as Record<string, unknown[]>;\n\n // Build merged hooks: for each event, keep non-Myco groups + add template groups\n const mergedHooks: Record<string, unknown[]> = {};\n\n // Preserve non-Myco hooks from existing config\n for (const [event, groups] of Object.entries(existingHooks)) {\n const nonMycoGroups = (groups as Array<Record<string, unknown>>).filter(\n (group) => !isMycoHookGroup(group),\n );\n if (nonMycoGroups.length > 0) {\n mergedHooks[event] = nonMycoGroups;\n }\n }\n\n // Add template hooks\n for (const [event, groups] of Object.entries(template)) {\n mergedHooks[event] = [...(mergedHooks[event] ?? []), ...(groups as unknown[])];\n }\n\n settings.hooks = mergedHooks;\n writeJsonFile(targetPath, settings);\n return true;\n }\n\n /**\n * Merge MCP server template into the target config file.\n * Replaces the `myco` server entry; preserves other servers.\n */\n installMcp(): boolean {\n const reg = this.manifest.registration;\n if (!reg?.mcpTarget) return false;\n\n const template = this.loadTemplate('mcp');\n if (!template) return false;\n\n const targetPath = path.join(this.projectRoot, reg.mcpTarget);\n const mcpFormat = reg.mcpFormat ?? 'json';\n\n if (mcpFormat === 'toml') {\n return this.installMcpToml(targetPath, template);\n }\n return this.installMcpJson(targetPath, template);\n }\n\n /** Write MCP servers to a JSON config file. */\n private installMcpJson(targetPath: string, template: Record<string, unknown>): boolean {\n const config = readJsonFile(targetPath);\n const servers = (config.mcpServers ?? {}) as Record<string, unknown>;\n\n for (const [name, def] of Object.entries(template)) {\n servers[name] = def;\n }\n\n config.mcpServers = servers;\n writeJsonFile(targetPath, config);\n return true;\n }\n\n /** Write MCP servers to a TOML config file. */\n private installMcpToml(targetPath: string, template: Record<string, unknown>): boolean {\n let raw = '';\n try { raw = fs.readFileSync(targetPath, 'utf-8'); } catch { /* doesn't exist */ }\n\n for (const [name, def] of Object.entries(template)) {\n raw = buildTomlMcpSection(raw, name, def as Record<string, unknown>);\n }\n\n fs.mkdirSync(path.dirname(targetPath), { recursive: true });\n fs.writeFileSync(targetPath, raw, 'utf-8');\n return true;\n }\n\n /**\n * Create symlinks for skills through .agents/skills/ canonical layer.\n * Canonical: .agents/skills/<name> -> <packageRoot>/skills/<name>\n * Agent-specific: <skillsTarget>/<name> -> ../../.agents/skills/<name>\n */\n installSkills(): boolean {\n const reg = this.manifest.registration;\n if (!reg?.skillsTarget) return false;\n\n const skillNames = this.listSkillDirs();\n if (skillNames.length === 0) return false;\n\n const skillsSrc = path.join(this.packageRoot, SKILLS_SUBDIR);\n\n // Create canonical symlinks: .agents/skills/<name> -> package skills\n const canonicalDir = path.join(this.projectRoot, CANONICAL_SKILLS_DIR);\n fs.mkdirSync(canonicalDir, { recursive: true });\n\n for (const name of skillNames) {\n const canonicalLink = path.join(canonicalDir, name);\n const target = path.join(skillsSrc, name);\n ensureSymlink(canonicalLink, target);\n }\n\n // Create agent-specific symlinks if skillsTarget differs from canonical\n const agentSkillsDir = path.join(this.projectRoot, reg.skillsTarget);\n const canonicalRel = path.relative(agentSkillsDir, canonicalDir);\n\n if (reg.skillsTarget !== CANONICAL_SKILLS_DIR) {\n fs.mkdirSync(agentSkillsDir, { recursive: true });\n for (const name of skillNames) {\n const agentLink = path.join(agentSkillsDir, name);\n const relTarget = path.join(canonicalRel, name);\n ensureSymlink(agentLink, relTarget);\n }\n }\n\n return true;\n }\n\n /**\n * Merge settings template into the target settings file.\n * Deep merges objects and deduplicates arrays.\n */\n installSettings(): boolean {\n const reg = this.manifest.registration;\n if (!reg?.settingsTarget) return false;\n\n const template = this.loadTemplate('settings');\n if (!template) return false;\n\n const targetPath = path.join(this.projectRoot, reg.settingsTarget);\n const existing = readJsonFile(targetPath);\n const merged = deepMergeSettings(existing, template);\n writeJsonFile(targetPath, merged);\n return true;\n }\n\n /**\n * Remove Myco entries from the target settings file.\n * Template-driven: loads the settings template and removes matching values.\n * Arrays: filter out values present in the template.\n * Objects: delete keys present in the template.\n */\n uninstallSettings(): boolean {\n const reg = this.manifest.registration;\n if (!reg?.settingsTarget) return false;\n\n const template = this.loadTemplate('settings');\n if (!template) return false;\n\n const targetPath = path.join(this.projectRoot, reg.settingsTarget);\n const settings = readJsonFile(targetPath);\n if (Object.keys(settings).length === 0) return false;\n\n const changed = deepRemoveSettings(settings, template);\n if (!changed) return false;\n\n writeOrDeleteJsonFile(targetPath, settings);\n return true;\n }\n\n /** Remove Myco hook groups from the target settings file. */\n uninstallHooks(): boolean {\n const reg = this.manifest.registration;\n if (!reg?.hooksTarget) return false;\n\n const targetPath = path.join(this.projectRoot, reg.hooksTarget);\n const settings = readJsonFile(targetPath);\n const existingHooks = (settings.hooks ?? {}) as Record<string, unknown[]>;\n if (Object.keys(existingHooks).length === 0) return false;\n\n const cleaned: Record<string, unknown[]> = {};\n for (const [event, groups] of Object.entries(existingHooks)) {\n const nonMyco = (groups as Array<Record<string, unknown>>).filter(\n (group) => !isMycoHookGroup(group),\n );\n if (nonMyco.length > 0) {\n cleaned[event] = nonMyco;\n }\n }\n\n if (Object.keys(cleaned).length === 0) {\n delete settings.hooks;\n } else {\n settings.hooks = cleaned;\n }\n\n writeOrDeleteJsonFile(targetPath, settings);\n return true;\n }\n\n /** Remove Myco MCP server entry from the target config file. */\n uninstallMcp(): boolean {\n const reg = this.manifest.registration;\n if (!reg?.mcpTarget) return false;\n\n const targetPath = path.join(this.projectRoot, reg.mcpTarget);\n const mcpFormat = reg.mcpFormat ?? 'json';\n\n if (mcpFormat === 'toml') {\n return this.uninstallMcpToml(targetPath);\n }\n return this.uninstallMcpJson(targetPath);\n }\n\n private uninstallMcpJson(targetPath: string): boolean {\n const config = readJsonFile(targetPath);\n const servers = (config.mcpServers ?? {}) as Record<string, unknown>;\n if (!servers[MYCO_MCP_SERVER_NAME]) return false;\n\n delete servers[MYCO_MCP_SERVER_NAME];\n\n if (Object.keys(servers).length === 0) {\n delete config.mcpServers;\n } else {\n config.mcpServers = servers;\n }\n\n writeOrDeleteJsonFile(targetPath, config);\n return true;\n }\n\n private uninstallMcpToml(targetPath: string): boolean {\n let raw = '';\n try { raw = fs.readFileSync(targetPath, 'utf-8'); } catch { return false; }\n\n const sectionHeader = `[mcp_servers.${MYCO_MCP_SERVER_NAME}]`;\n if (!raw.includes(sectionHeader)) return false;\n\n const startIdx = raw.indexOf(sectionHeader);\n const endIdx = findTomlSectionEnd(raw, startIdx + sectionHeader.length, MYCO_MCP_SERVER_NAME);\n const before = raw.slice(0, startIdx).trimEnd();\n const after = raw.slice(endIdx).trimStart();\n const updated = (before + (before && after ? '\\n\\n' : '') + after).trimEnd();\n\n if (!updated.trim()) {\n try { fs.unlinkSync(targetPath); } catch { /* ignore */ }\n } else {\n fs.writeFileSync(targetPath, updated + '\\n', 'utf-8');\n }\n return true;\n }\n\n /** Remove skill symlinks (canonical + agent-specific). */\n uninstallSkills(): boolean {\n const reg = this.manifest.registration;\n if (!reg?.skillsTarget) return false;\n\n const skillNames = this.listSkillDirs();\n if (skillNames.length === 0) return false;\n\n let removed = false;\n\n // Remove agent-specific symlinks\n if (reg.skillsTarget !== CANONICAL_SKILLS_DIR) {\n for (const name of skillNames) {\n const link = path.join(this.projectRoot, reg.skillsTarget, name);\n try { fs.unlinkSync(link); removed = true; } catch { /* doesn't exist */ }\n }\n // Remove agent skills dir if now empty (rmdirSync fails atomically if non-empty)\n try { fs.rmdirSync(path.join(this.projectRoot, reg.skillsTarget)); } catch { /* not empty or missing */ }\n }\n\n // Remove canonical symlinks\n const canonicalDir = path.join(this.projectRoot, CANONICAL_SKILLS_DIR);\n for (const name of skillNames) {\n const link = path.join(canonicalDir, name);\n try { fs.unlinkSync(link); removed = true; } catch { /* doesn't exist */ }\n }\n // Remove empty dirs (rmdirSync fails atomically if non-empty)\n try { fs.rmdirSync(canonicalDir); } catch { /* not empty or missing */ }\n try { fs.rmdirSync(path.join(this.projectRoot, '.agents')); } catch { /* not empty or missing */ }\n\n return removed;\n }\n\n /** Remove Myco entries from project .gitignore. */\n private cleanGitignore(): void {\n const gitignorePath = path.join(this.projectRoot, '.gitignore');\n let content = '';\n try { content = fs.readFileSync(gitignorePath, 'utf-8'); } catch { return; }\n\n const cleaned = this.stripMycoGitignoreBlock(content, this.listSkillDirs()).trim();\n if (cleaned) {\n fs.writeFileSync(gitignorePath, cleaned + '\\n', 'utf-8');\n } else {\n try { fs.unlinkSync(gitignorePath); } catch { /* ignore */ }\n }\n }\n}\n\n// --- TOML helpers ---\n\n/** TOML section header pattern. */\nconst TOML_SECTION_RE = /^\\[([^\\]]+)\\]/;\n\n/** Find where a [mcp_servers.<name>] section ends in a TOML string. */\nfunction findTomlSectionEnd(raw: string, searchStart: number, serverName: string): number {\n const subsectionPrefix = `mcp_servers.${serverName}.`;\n const rawLines = raw.slice(searchStart).split('\\n');\n let offset = searchStart;\n for (const line of rawLines) {\n offset += line.length + 1;\n const m = line.match(TOML_SECTION_RE);\n if (m && !m[1].startsWith(subsectionPrefix) && m[1] !== `mcp_servers.${serverName}`) {\n return offset - line.length - 1;\n }\n }\n return raw.length;\n}\n\n/**\n * Build/update a specific mcp_servers entry in a TOML string.\n * Pure transformation — returns updated content without writing to disk.\n */\nfunction buildTomlMcpSection(\n raw: string,\n serverName: string,\n server: Record<string, unknown>,\n): string {\n const sectionHeader = `[mcp_servers.${serverName}]`;\n\n // Build the TOML block for this server\n const lines: string[] = [sectionHeader];\n for (const [key, val] of Object.entries(server)) {\n if (key === 'env' && typeof val === 'object' && val !== null) continue; // Handle env as subtable\n if (typeof val === 'string') {\n lines.push(`${key} = \"${val}\"`);\n } else if (Array.isArray(val)) {\n lines.push(`${key} = [${val.map((v: unknown) => `\"${v}\"`).join(', ')}]`);\n } else if (typeof val === 'boolean') {\n lines.push(`${key} = ${val}`);\n }\n }\n\n // Add env subtable if present\n const env = server.env as Record<string, string> | undefined;\n if (env && Object.keys(env).length > 0) {\n lines.push('');\n lines.push(`[mcp_servers.${serverName}.env]`);\n for (const [key, val] of Object.entries(env)) {\n lines.push(`${key} = \"${val}\"`);\n }\n }\n\n const block = lines.join('\\n');\n\n let updated: string;\n if (raw.includes(sectionHeader)) {\n const startIdx = raw.indexOf(sectionHeader);\n const endIdx = findTomlSectionEnd(raw, startIdx + sectionHeader.length, serverName);\n const before = raw.slice(0, startIdx).trimEnd();\n const after = raw.slice(endIdx);\n const separator = before ? '\\n\\n' : '';\n updated = (before + separator + block + after).trimEnd() + '\\n';\n } else {\n // Append new section\n const separator = raw.trim() ? '\\n\\n' : '';\n updated = (raw.trimEnd() + separator + block).trimEnd() + '\\n';\n }\n\n return updated;\n}\n\n// --- Settings merge helpers ---\n\n/** Deep merge two settings objects. Arrays are appended + deduplicated; objects recurse. */\nfunction deepMergeSettings(\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n): Record<string, unknown> {\n const result = { ...target };\n for (const [key, sourceVal] of Object.entries(source)) {\n const targetVal = result[key];\n if (Array.isArray(sourceVal) && Array.isArray(targetVal)) {\n result[key] = [...new Set([...targetVal, ...sourceVal])];\n } else if (isPlainObject(sourceVal) && isPlainObject(targetVal)) {\n result[key] = deepMergeSettings(\n targetVal as Record<string, unknown>,\n sourceVal as Record<string, unknown>,\n );\n } else {\n result[key] = sourceVal;\n }\n }\n return result;\n}\n\nfunction isPlainObject(val: unknown): val is Record<string, unknown> {\n return typeof val === 'object' && val !== null && !Array.isArray(val);\n}\n\n/**\n * Remove values from target that match the template structure.\n * Arrays: filter out values present in the template array.\n * Objects: delete keys present in the template object, recurse into nested objects.\n * Returns true if anything was removed.\n */\nfunction deepRemoveSettings(\n target: Record<string, unknown>,\n template: Record<string, unknown>,\n): boolean {\n let changed = false;\n for (const [key, templateVal] of Object.entries(template)) {\n const targetVal = target[key];\n if (targetVal === undefined) continue;\n\n if (Array.isArray(templateVal) && Array.isArray(targetVal)) {\n // Filter out values that appear in the template array\n const templateSet = new Set(templateVal.map(String));\n const filtered = targetVal.filter((v) => !templateSet.has(String(v)));\n if (filtered.length !== targetVal.length) {\n if (filtered.length > 0) {\n target[key] = filtered;\n } else {\n delete target[key];\n }\n changed = true;\n }\n } else if (isPlainObject(templateVal) && isPlainObject(targetVal)) {\n // Recurse into nested objects, then prune if empty\n if (deepRemoveSettings(targetVal, templateVal)) {\n if (Object.keys(targetVal).length === 0) {\n delete target[key];\n }\n changed = true;\n }\n } else {\n // Scalar: delete if value matches\n if (String(targetVal) === String(templateVal)) {\n delete target[key];\n changed = true;\n }\n }\n }\n return changed;\n}\n\n// --- JSON helpers ---\n\nfunction readJsonFile(filePath: string): Record<string, unknown> {\n try {\n return JSON.parse(fs.readFileSync(filePath, 'utf-8'));\n } catch {\n return {};\n }\n}\n\nfunction writeJsonFile(filePath: string, data: Record<string, unknown>): void {\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n fs.writeFileSync(filePath, JSON.stringify(data, null, 2) + '\\n', 'utf-8');\n}\n\n/** Write a JSON file, or delete it if the object is empty. */\nfunction writeOrDeleteJsonFile(filePath: string, data: Record<string, unknown>): void {\n if (Object.keys(data).length === 0) {\n try { fs.unlinkSync(filePath); } catch { /* ignore */ }\n } else {\n writeJsonFile(filePath, data);\n }\n}\n\n/**\n * Create a starter AGENTS.md if the project doesn't have one.\n * Idempotent — skips if AGENTS.md already exists.\n */\nfunction ensureAgentsMd(projectRoot: string, packageRoot: string): void {\n const agentsMdPath = path.join(projectRoot, 'AGENTS.md');\n if (fs.existsSync(agentsMdPath)) return;\n\n const candidates = [\n path.join(packageRoot, 'src/symbionts/templates/agents-starter.md'),\n path.join(packageRoot, 'dist/src/symbionts/templates/agents-starter.md'),\n ];\n for (const p of candidates) {\n try {\n const content = fs.readFileSync(p, 'utf-8');\n fs.writeFileSync(agentsMdPath, content, 'utf-8');\n return;\n } catch { /* try next */ }\n }\n}\n\nfunction ensureSymlink(linkPath: string, target: string): void {\n try {\n if (fs.readlinkSync(linkPath) === target) return;\n } catch { /* does not exist or is not a symlink — proceed */ }\n try { fs.rmSync(linkPath, { recursive: true, force: true }); } catch { /* ignore */ }\n fs.symlinkSync(target, linkPath);\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { OllamaBackend } from '../intelligence/ollama.js';\nimport { LmStudioBackend } from '../intelligence/lm-studio.js';\n\nimport { DaemonClient } from '../hooks/client.js';\nimport { initDatabase, closeDatabase, vaultDbPath } from '../db/client.js';\nimport { SymbiontInstaller } from '../symbionts/installer.js';\nimport type { SymbiontManifest } from '../symbionts/manifest-schema.js';\n\nexport { parseStringFlag, parseIntFlag } from '../logs/format.js';\n\n/**\n * Initialize the singleton database for direct CLI reads.\n * Used by CLI commands that only need reads (stats, search, session).\n * Does NOT require the daemon to be running — WAL mode allows concurrent reads.\n *\n * @returns a cleanup function that closes the database.\n */\nexport function initVaultDb(vaultDir: string): () => void {\n initDatabase(vaultDbPath(vaultDir));\n return closeDatabase;\n}\n\n/** Connect to the daemon, ensuring it's running. Exits on failure. */\nexport async function connectToDaemon(vaultDir: string): Promise<DaemonClient> {\n const client = new DaemonClient(vaultDir);\n const healthy = await client.ensureRunning();\n if (!healthy) {\n console.error('Failed to connect to daemon');\n process.exit(1);\n }\n return client;\n}\n\n/** Load .env from cwd (not script location — that's the plugin install dir). */\nexport function loadEnv(): void {\n const envPath = path.resolve(process.cwd(), '.env');\n if (!fs.existsSync(envPath)) return;\n for (const line of fs.readFileSync(envPath, 'utf-8').split('\\n')) {\n const match = line.match(/^\\s*([^#=]+?)\\s*=\\s*(.*?)\\s*$/);\n if (match && !process.env[match[1]]) {\n process.env[match[1]] = match[2];\n }\n }\n}\n\nexport function isProcessAlive(pid: number): boolean {\n try { process.kill(pid, 0); return true; } catch { return false; }\n}\n\n// --- Provider defaults (sourced from backend classes) ---\nexport const PROVIDER_DEFAULTS: Record<string, { base_url: string }> = {\n ollama: { base_url: OllamaBackend.DEFAULT_BASE_URL },\n 'lm-studio': { base_url: LmStudioBackend.DEFAULT_BASE_URL },\n};\n\n\nexport const VAULT_GITIGNORE = `# SQLite database\nmyco.db*\nvectors.db*\n\n# Daemon state — per-machine, ephemeral\ndaemon.json\nbuffer/\nlogs/\n\n# Secrets — API keys for cloud providers\nsecrets.env\n\n# Machine ID\nmachine_id\n\n# Binary attachments — screenshots captured from transcripts\nattachments/\n\n# Team worker deployment — patched wrangler.toml + source copy\n.team-worker/\n`;\n\n/** Collapse an absolute home-dir path to its `~/` form for portable config storage. */\nexport function collapseHomePath(absPath: string): string {\n const home = os.homedir();\n if (absPath.startsWith(home + path.sep) || absPath === home) {\n return '~' + absPath.slice(home.length);\n }\n return absPath;\n}\n\n/**\n * Run the SymbiontInstaller for each symbiont manifest and log results.\n * Shared between myco init and myco update.\n */\nexport function registerSymbionts(\n manifests: SymbiontManifest[],\n projectRoot: string,\n packageRoot: string,\n verb: 'Registered' | 'Updated',\n): number {\n let count = 0;\n for (const manifest of manifests) {\n try {\n const installer = new SymbiontInstaller(manifest, projectRoot, packageRoot);\n const result = installer.install();\n\n const installed = [\n result.hooks && 'hooks',\n result.mcp && 'MCP server',\n result.skills && 'skills',\n result.settings && 'settings',\n result.instructions && 'instructions',\n ].filter(Boolean);\n\n if (installed.length > 0) {\n console.log(` \\u2713 ${verb} ${manifest.displayName}: ${installed.join(', ')}`);\n count++;\n } else {\n console.log(` \\u2013 ${manifest.displayName}: no registration targets configured`);\n }\n } catch (err) {\n console.error(` \\u2717 Failed to register ${manifest.displayName}: ${(err as Error).message}`);\n }\n }\n return count;\n}\n\n"],"mappings":"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","names":["fs","path","path","fs"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
isProcessAlive
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-R52WNQIK.js";
|
|
5
5
|
import {
|
|
6
6
|
loadConfig
|
|
7
7
|
} from "./chunk-MAZOVVDU.js";
|
|
@@ -184,4 +184,4 @@ export {
|
|
|
184
184
|
getEmbeddingQueueDepth,
|
|
185
185
|
gatherStats
|
|
186
186
|
};
|
|
187
|
-
//# sourceMappingURL=chunk-
|
|
187
|
+
//# sourceMappingURL=chunk-SBJKSZZE.js.map
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
} from "./chunk-PIRWYDOH.js";
|
|
8
8
|
import {
|
|
9
9
|
getPluginVersion
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-46C4ADA4.js";
|
|
11
11
|
|
|
12
12
|
// src/hooks/client.ts
|
|
13
13
|
import fs from "fs";
|
|
@@ -168,4 +168,4 @@ export {
|
|
|
168
168
|
resolveCliEntryPath,
|
|
169
169
|
DaemonClient
|
|
170
170
|
};
|
|
171
|
-
//# sourceMappingURL=chunk-
|
|
171
|
+
//# sourceMappingURL=chunk-TIFE27JS.js.map
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
3
3
|
import {
|
|
4
4
|
loadEnv
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-R52WNQIK.js";
|
|
6
6
|
import "./chunk-SAKJMNSR.js";
|
|
7
7
|
import "./chunk-LUQBT2Y4.js";
|
|
8
8
|
import "./chunk-MYX5NCRH.js";
|
|
9
|
-
import "./chunk-
|
|
9
|
+
import "./chunk-TIFE27JS.js";
|
|
10
10
|
import "./chunk-PIRWYDOH.js";
|
|
11
11
|
import "./chunk-S6I62FAH.js";
|
|
12
|
-
import "./chunk-
|
|
12
|
+
import "./chunk-46C4ADA4.js";
|
|
13
13
|
import "./chunk-LPUQPDC2.js";
|
|
14
14
|
import {
|
|
15
15
|
resolveVaultDir
|
|
@@ -53,29 +53,29 @@ async function main() {
|
|
|
53
53
|
process.stdout.write(USAGE);
|
|
54
54
|
return;
|
|
55
55
|
}
|
|
56
|
-
if (cmd === "init") return (await import("./init-
|
|
56
|
+
if (cmd === "init") return (await import("./init-US52M3AV.js")).run(args);
|
|
57
57
|
if (cmd === "detect-providers") return (await import("./detect-providers-JFE3QLJI.js")).run(args);
|
|
58
58
|
if (cmd === "version" || cmd === "--version" || cmd === "-v") {
|
|
59
|
-
const { getPluginVersion } = await import("./version-
|
|
59
|
+
const { getPluginVersion } = await import("./version-DPPJB3HZ.js");
|
|
60
60
|
console.log(getPluginVersion());
|
|
61
61
|
return;
|
|
62
62
|
}
|
|
63
|
-
if (cmd === "mcp") return (await import("./server-
|
|
63
|
+
if (cmd === "mcp") return (await import("./server-YAMYC52G.js")).main();
|
|
64
64
|
if (cmd === "hook") {
|
|
65
65
|
const hookName = args[0];
|
|
66
66
|
const HOOK_DISPATCH = {
|
|
67
|
-
"session-start": () => import("./session-start-
|
|
68
|
-
"session-end": () => import("./session-end-
|
|
69
|
-
"stop": () => import("./stop-
|
|
70
|
-
"user-prompt-submit": () => import("./user-prompt-submit-
|
|
71
|
-
"post-tool-use": () => import("./post-tool-use-
|
|
72
|
-
"post-tool-use-failure": () => import("./post-tool-use-failure-
|
|
73
|
-
"subagent-start": () => import("./subagent-start-
|
|
74
|
-
"subagent-stop": () => import("./subagent-stop-
|
|
75
|
-
"stop-failure": () => import("./stop-failure-
|
|
76
|
-
"task-completed": () => import("./task-completed-
|
|
77
|
-
"pre-compact": () => import("./pre-compact-
|
|
78
|
-
"post-compact": () => import("./post-compact-
|
|
67
|
+
"session-start": () => import("./session-start-YVLOEHSJ.js"),
|
|
68
|
+
"session-end": () => import("./session-end-MS7QSOOG.js"),
|
|
69
|
+
"stop": () => import("./stop-O7ZCYIFZ.js"),
|
|
70
|
+
"user-prompt-submit": () => import("./user-prompt-submit-PL4IH4GZ.js"),
|
|
71
|
+
"post-tool-use": () => import("./post-tool-use-OAVV3HJ6.js"),
|
|
72
|
+
"post-tool-use-failure": () => import("./post-tool-use-failure-DRM7FKKO.js"),
|
|
73
|
+
"subagent-start": () => import("./subagent-start-DUHEJR4K.js"),
|
|
74
|
+
"subagent-stop": () => import("./subagent-stop-OBPIXEIL.js"),
|
|
75
|
+
"stop-failure": () => import("./stop-failure-MRJBYLFU.js"),
|
|
76
|
+
"task-completed": () => import("./task-completed-JJOH4QFA.js"),
|
|
77
|
+
"pre-compact": () => import("./pre-compact-BU5P4VUK.js"),
|
|
78
|
+
"post-compact": () => import("./post-compact-BNBLIHBB.js")
|
|
79
79
|
};
|
|
80
80
|
const loader = HOOK_DISPATCH[hookName];
|
|
81
81
|
if (!loader) {
|
|
@@ -84,13 +84,13 @@ async function main() {
|
|
|
84
84
|
}
|
|
85
85
|
return (await loader()).main();
|
|
86
86
|
}
|
|
87
|
-
if (cmd === "daemon") return (await import("./main-
|
|
87
|
+
if (cmd === "daemon") return (await import("./main-2ZCTH6JF.js")).main();
|
|
88
88
|
if (cmd === "doctor") {
|
|
89
89
|
const vaultDir2 = resolveVaultDir();
|
|
90
|
-
return (await import("./doctor-
|
|
90
|
+
return (await import("./doctor-X5CVDZCL.js")).run(args, vaultDir2);
|
|
91
91
|
}
|
|
92
|
-
if (cmd === "update") return (await import("./update-
|
|
93
|
-
if (cmd === "remove") return (await import("./remove-
|
|
92
|
+
if (cmd === "update") return (await import("./update-Q3AU7UDC.js")).run(args);
|
|
93
|
+
if (cmd === "remove") return (await import("./remove-XOKHXEC5.js")).run(args);
|
|
94
94
|
const vaultDir = resolveVaultDir();
|
|
95
95
|
if (!fs.existsSync(path.join(vaultDir, "myco.yaml"))) {
|
|
96
96
|
console.error(`No myco.yaml found in ${vaultDir}. Run 'myco init' first.`);
|
|
@@ -102,21 +102,21 @@ async function main() {
|
|
|
102
102
|
case "verify":
|
|
103
103
|
return (await import("./verify-D7EDVXO5.js")).run(args, vaultDir);
|
|
104
104
|
case "stats":
|
|
105
|
-
return (await import("./stats-
|
|
105
|
+
return (await import("./stats-HJS43XXW.js")).run(args, vaultDir);
|
|
106
106
|
case "search":
|
|
107
|
-
return (await import("./search-
|
|
107
|
+
return (await import("./search-W45MUD6X.js")).run(args, vaultDir);
|
|
108
108
|
case "vectors":
|
|
109
|
-
return (await import("./search-
|
|
109
|
+
return (await import("./search-W45MUD6X.js")).runVectors(args, vaultDir);
|
|
110
110
|
case "session":
|
|
111
|
-
return (await import("./session-
|
|
111
|
+
return (await import("./session-VBAXOCYP.js")).run(args, vaultDir);
|
|
112
112
|
case "setup-llm":
|
|
113
|
-
return (await import("./setup-llm-
|
|
113
|
+
return (await import("./setup-llm-X7M3CCZU.js")).run(args, vaultDir);
|
|
114
114
|
case "setup-digest":
|
|
115
115
|
return (await import("./setup-digest-4KDSXAIV.js")).run(args, vaultDir);
|
|
116
116
|
case "agent":
|
|
117
|
-
return (await import("./agent-run-
|
|
117
|
+
return (await import("./agent-run-WM3PFA3Y.js")).run(args, vaultDir);
|
|
118
118
|
case "task":
|
|
119
|
-
return (await import("./agent-tasks-
|
|
119
|
+
return (await import("./agent-tasks-MONSZFG7.js")).run(args, vaultDir);
|
|
120
120
|
case "team": {
|
|
121
121
|
const sub = args[0];
|
|
122
122
|
if (sub === "init") return (await import("./team-TBS5OILG.js")).teamInit(vaultDir);
|
|
@@ -126,9 +126,9 @@ async function main() {
|
|
|
126
126
|
break;
|
|
127
127
|
}
|
|
128
128
|
case "open":
|
|
129
|
-
return (await import("./open-
|
|
129
|
+
return (await import("./open-LDE3NMWS.js")).run(args, vaultDir);
|
|
130
130
|
case "restart":
|
|
131
|
-
return (await import("./restart-
|
|
131
|
+
return (await import("./restart-K7WW6HT5.js")).run(args, vaultDir);
|
|
132
132
|
case "logs":
|
|
133
133
|
return (await import("./logs-LXHPDKUA.js")).run(args, vaultDir);
|
|
134
134
|
default:
|
|
@@ -141,4 +141,4 @@ main().catch((err) => {
|
|
|
141
141
|
console.error(`myco: ${err.message}`);
|
|
142
142
|
process.exit(1);
|
|
143
143
|
});
|
|
144
|
-
//# sourceMappingURL=cli-
|
|
144
|
+
//# sourceMappingURL=cli-D6SW3X7M.js.map
|
|
@@ -2,14 +2,14 @@ import { createRequire as __cr } from 'node:module'; const require = __cr(import
|
|
|
2
2
|
import {
|
|
3
3
|
DaemonClient,
|
|
4
4
|
resolveCliEntryPath
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-TIFE27JS.js";
|
|
6
6
|
import "./chunk-PIRWYDOH.js";
|
|
7
7
|
import "./chunk-S6I62FAH.js";
|
|
8
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-46C4ADA4.js";
|
|
9
9
|
import "./chunk-LPUQPDC2.js";
|
|
10
10
|
import "./chunk-PZUWP5VK.js";
|
|
11
11
|
export {
|
|
12
12
|
DaemonClient,
|
|
13
13
|
resolveCliEntryPath
|
|
14
14
|
};
|
|
15
|
-
//# sourceMappingURL=client-
|
|
15
|
+
//# sourceMappingURL=client-JHV6WMHB.js.map
|
|
@@ -2,14 +2,14 @@ import { createRequire as __cr } from 'node:module'; const require = __cr(import
|
|
|
2
2
|
import {
|
|
3
3
|
MYCO_MCP_SERVER_NAME,
|
|
4
4
|
isProcessAlive
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-R52WNQIK.js";
|
|
6
6
|
import "./chunk-SAKJMNSR.js";
|
|
7
7
|
import "./chunk-LUQBT2Y4.js";
|
|
8
8
|
import "./chunk-MYX5NCRH.js";
|
|
9
|
-
import "./chunk-
|
|
9
|
+
import "./chunk-TIFE27JS.js";
|
|
10
10
|
import "./chunk-PIRWYDOH.js";
|
|
11
11
|
import "./chunk-S6I62FAH.js";
|
|
12
|
-
import "./chunk-
|
|
12
|
+
import "./chunk-46C4ADA4.js";
|
|
13
13
|
import "./chunk-LPUQPDC2.js";
|
|
14
14
|
import "./chunk-PZUWP5VK.js";
|
|
15
15
|
|
|
@@ -249,4 +249,4 @@ export {
|
|
|
249
249
|
run,
|
|
250
250
|
runChecks
|
|
251
251
|
};
|
|
252
|
-
//# sourceMappingURL=doctor-
|
|
252
|
+
//# sourceMappingURL=doctor-X5CVDZCL.js.map
|
|
@@ -71,7 +71,7 @@ import {
|
|
|
71
71
|
import "./chunk-S6I62FAH.js";
|
|
72
72
|
import {
|
|
73
73
|
getPluginVersion
|
|
74
|
-
} from "./chunk-
|
|
74
|
+
} from "./chunk-46C4ADA4.js";
|
|
75
75
|
import {
|
|
76
76
|
findPackageRoot
|
|
77
77
|
} from "./chunk-LPUQPDC2.js";
|
|
@@ -1451,4 +1451,4 @@ export {
|
|
|
1451
1451
|
computeWaves,
|
|
1452
1452
|
runAgent
|
|
1453
1453
|
};
|
|
1454
|
-
//# sourceMappingURL=executor-
|
|
1454
|
+
//# sourceMappingURL=executor-QRGGW4H7.js.map
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
VAULT_GITIGNORE,
|
|
7
7
|
registerSymbionts
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-R52WNQIK.js";
|
|
9
9
|
import {
|
|
10
10
|
parseStringFlag
|
|
11
11
|
} from "./chunk-SAKJMNSR.js";
|
|
@@ -23,10 +23,10 @@ import {
|
|
|
23
23
|
initDatabase,
|
|
24
24
|
vaultDbPath
|
|
25
25
|
} from "./chunk-MYX5NCRH.js";
|
|
26
|
-
import "./chunk-
|
|
26
|
+
import "./chunk-TIFE27JS.js";
|
|
27
27
|
import "./chunk-PIRWYDOH.js";
|
|
28
28
|
import "./chunk-S6I62FAH.js";
|
|
29
|
-
import "./chunk-
|
|
29
|
+
import "./chunk-46C4ADA4.js";
|
|
30
30
|
import {
|
|
31
31
|
detectSymbionts,
|
|
32
32
|
loadManifests,
|
|
@@ -51,7 +51,7 @@ async function run(args) {
|
|
|
51
51
|
const nonInteractive = args.includes("--non-interactive");
|
|
52
52
|
const isInteractive = !nonInteractive && !!process.stdin.isTTY;
|
|
53
53
|
if (isInteractive) {
|
|
54
|
-
const { printBanner } = await import("./init-wizard-
|
|
54
|
+
const { printBanner } = await import("./init-wizard-CNW3KWND.js");
|
|
55
55
|
printBanner();
|
|
56
56
|
}
|
|
57
57
|
const vaultDir = vaultPath ? vaultPath.startsWith("~/") ? path.join(os.homedir(), vaultPath.slice(2)) : path.resolve(vaultPath) : path.join(resolveVaultDir());
|
|
@@ -81,7 +81,7 @@ async function run(args) {
|
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
83
|
if (shouldRunWizard) {
|
|
84
|
-
const { runWizard, buildEmbeddingConfig, buildAgentConfig } = await import("./init-wizard-
|
|
84
|
+
const { runWizard, buildEmbeddingConfig, buildAgentConfig } = await import("./init-wizard-CNW3KWND.js");
|
|
85
85
|
const answers = await runWizard();
|
|
86
86
|
wizardAnswers = answers;
|
|
87
87
|
if (answers.embeddingProvider !== "skip") {
|
|
@@ -162,7 +162,7 @@ async function run(args) {
|
|
|
162
162
|
registerSymbionts(selectedManifests, projectRoot, pkgRoot, "Registered");
|
|
163
163
|
}
|
|
164
164
|
}
|
|
165
|
-
const { DaemonClient } = await import("./client-
|
|
165
|
+
const { DaemonClient } = await import("./client-JHV6WMHB.js");
|
|
166
166
|
const client = new DaemonClient(vaultDir);
|
|
167
167
|
const daemonHealthy = await client.ensureRunning();
|
|
168
168
|
let daemonUrl = "";
|
|
@@ -192,4 +192,4 @@ async function run(args) {
|
|
|
192
192
|
export {
|
|
193
193
|
run
|
|
194
194
|
};
|
|
195
|
-
//# sourceMappingURL=init-
|
|
195
|
+
//# sourceMappingURL=init-US52M3AV.js.map
|
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
import "./chunk-S6I62FAH.js";
|
|
20
20
|
import {
|
|
21
21
|
getPluginVersion
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-46C4ADA4.js";
|
|
23
23
|
import "./chunk-LPUQPDC2.js";
|
|
24
24
|
import "./chunk-PZUWP5VK.js";
|
|
25
25
|
|
|
@@ -291,4 +291,4 @@ export {
|
|
|
291
291
|
printBanner,
|
|
292
292
|
runWizard
|
|
293
293
|
};
|
|
294
|
-
//# sourceMappingURL=init-wizard-
|
|
294
|
+
//# sourceMappingURL=init-wizard-CNW3KWND.js.map
|