@goondocks/myco 0.14.4 → 0.15.1
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-GZ5UVLDV.js → agent-run-T433ENJS.js} +6 -6
- package/dist/{agent-tasks-KKQ2GBBB.js → agent-tasks-TAIU3V5I.js} +6 -6
- package/dist/{chunk-X34OFKYU.js → chunk-23FJUKCN.js} +2 -2
- package/dist/{chunk-LD6U3L6O.js → chunk-2QMDRZPJ.js} +21 -17
- package/dist/chunk-2QMDRZPJ.js.map +1 -0
- package/dist/{chunk-KNTJOMWY.js → chunk-3MEOYXOW.js} +2 -2
- package/dist/{chunk-PSYLKCWQ.js → chunk-4BQ5QE76.js} +24 -5
- package/dist/chunk-4BQ5QE76.js.map +1 -0
- package/dist/{chunk-UZ5Y6XMP.js → chunk-4O3QNM5I.js} +2 -2
- package/dist/{chunk-JTYZRPX5.js → chunk-5ZT2Q6P5.js} +1 -1
- package/dist/{chunk-BCKYVLUZ.js → chunk-6GG2IVNV.js} +3 -3
- package/dist/{chunk-JJXVDCEX.js → chunk-75J2BR4P.js} +486 -488
- package/dist/chunk-75J2BR4P.js.map +1 -0
- package/dist/{chunk-TFBAV3PV.js → chunk-BFM6AM6R.js} +2 -2
- package/dist/{chunk-S6I62FAH.js → chunk-CUADDHHU.js} +4 -2
- package/dist/{chunk-S6I62FAH.js.map → chunk-CUADDHHU.js.map} +1 -1
- package/dist/{chunk-4VF6KQ2Z.js → chunk-DJQOYEK3.js} +87 -84
- package/dist/chunk-DJQOYEK3.js.map +1 -0
- package/dist/{chunk-OQVKLTQY.js → chunk-EYMKBNRP.js} +2 -2
- package/dist/{chunk-STBNNKL5.js → chunk-GCCBXCHF.js} +6 -6
- package/dist/{chunk-KH64DHOY.js → chunk-GDY63YAW.js} +279 -277
- package/dist/chunk-GDY63YAW.js.map +1 -0
- package/dist/{chunk-ZESTWGJT.js → chunk-GYIA6XLB.js} +2 -2
- package/dist/{chunk-S66YG6QK.js → chunk-LF5Z62X6.js} +46 -7
- package/dist/chunk-LF5Z62X6.js.map +1 -0
- package/dist/{chunk-PX5KIOKY.js → chunk-SPJGJEFV.js} +10 -2
- package/dist/{chunk-PX5KIOKY.js.map → chunk-SPJGJEFV.js.map} +1 -1
- package/dist/{chunk-QFMBZ72S.js → chunk-SV6UCB2Z.js} +2 -2
- package/dist/{chunk-GMTWRMLP.js → chunk-TQO4PF5K.js} +3 -3
- package/dist/{chunk-NVCGF2DS.js → chunk-X4XFJG6I.js} +10 -6
- package/dist/chunk-X4XFJG6I.js.map +1 -0
- package/dist/{chunk-TNCBMGWB.js → chunk-X5IXK5KO.js} +262 -226
- package/dist/chunk-X5IXK5KO.js.map +1 -0
- package/dist/{chunk-TVV6PZOC.js → chunk-Z7TZJ2SP.js} +2 -2
- package/dist/{cli-JLDCZ77U.js → cli-W37MRZHD.js} +45 -44
- package/dist/cli-W37MRZHD.js.map +1 -0
- package/dist/{client-LRQMMKLP.js → client-YNTTC75R.js} +4 -4
- package/dist/{config-H657SF6B.js → config-MOWCOJJ4.js} +4 -4
- package/dist/{detect-27DN6UTL.js → detect-GFYKKHLJ.js} +3 -3
- package/dist/{detect-providers-PAVE2X6O.js → detect-providers-EU35RUL3.js} +2 -2
- package/dist/{doctor-IG3CXMI7.js → doctor-PAAQU5AS.js} +38 -19
- package/dist/doctor-PAAQU5AS.js.map +1 -0
- package/dist/{executor-HKNINUWO.js → executor-4OXDK4ZA.js} +790 -312
- package/dist/executor-4OXDK4ZA.js.map +1 -0
- package/dist/{init-RHQUINC2.js → init-PHQAQANR.js} +41 -23
- package/dist/init-PHQAQANR.js.map +1 -0
- package/dist/{init-wizard-ZB3JRDLE.js → init-wizard-RFD46XAJ.js} +7 -7
- package/dist/{installer-25TSX4SR.js → installer-BTUNKWOU.js} +2 -2
- package/dist/{llm-T3QVHC3Y.js → llm-D4VWYUK7.js} +4 -4
- package/dist/{loader-WQKVWL5D.js → loader-WC4U5NM5.js} +4 -4
- package/dist/{loader-JQLO6K44.js → loader-WGDVRGLM.js} +6 -4
- package/dist/{logs-LXHPDKUA.js → logs-WFBX2I7C.js} +3 -3
- package/dist/{main-MVXPBP5Z.js → main-ADLCOYKM.js} +2351 -1914
- package/dist/main-ADLCOYKM.js.map +1 -0
- package/dist/{open-CVEMRH3Z.js → open-3VPUP3HD.js} +6 -6
- package/dist/{openai-embeddings-5T5ZP7LO.js → openai-embeddings-SEIV7AM3.js} +2 -2
- package/dist/{openrouter-RD2COFC7.js → openrouter-ELODIZRP.js} +2 -2
- package/dist/{post-compact-ALQ2UGZ7.js → post-compact-5NYLOC46.js} +9 -9
- package/dist/{post-tool-use-SPL7HIYU.js → post-tool-use-SNNXSZ5Y.js} +10 -10
- package/dist/{post-tool-use-failure-B3CUYBTR.js → post-tool-use-failure-POKVXQHY.js} +9 -9
- package/dist/{pre-compact-KPWC4V64.js → pre-compact-ZUICBJEX.js} +9 -9
- package/dist/{provider-check-QN7OGXZA.js → provider-check-B66E5PWS.js} +2 -2
- package/dist/{registry-2XQMCPA6.js → registry-DHWVHXWY.js} +5 -5
- package/dist/{remove-O2WCN6RC.js → remove-SVU2V4Q7.js} +52 -20
- package/dist/remove-SVU2V4Q7.js.map +1 -0
- package/dist/{resolution-events-5EVUEWHS.js → resolution-events-DBCRVZGU.js} +4 -4
- package/dist/{restart-S52VV3SP.js → restart-NBB5CXJ4.js} +7 -7
- package/dist/{search-IOJ5O37S.js → search-YUQZFRZX.js} +6 -6
- package/dist/{server-T4VPK6FU.js → server-NBRX56VL.js} +8 -8
- package/dist/{session-ID6BX72K.js → session-2QP4HMZ5.js} +8 -8
- package/dist/{session-end-I7ZABXRI.js → session-end-NNFBW7CQ.js} +10 -10
- package/dist/{session-start-VPOUY42U.js → session-start-NPNP4IXX.js} +15 -15
- package/dist/{setup-llm-G5UG5N3T.js → setup-llm-C3IGFLRN.js} +8 -8
- package/dist/src/agent/definitions/tasks/full-intelligence.yaml +8 -7
- package/dist/src/agent/definitions/tasks/skill-evolve.yaml +71 -144
- package/dist/src/agent/definitions/tasks/skill-generate.yaml +10 -62
- package/dist/src/agent/definitions/tasks/skill-survey.yaml +87 -53
- package/dist/src/agent/prompts/agent.md +1 -0
- 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/src/worker/src/schema.ts +14 -0
- package/dist/{stats-GRI4MTS2.js → stats-FEEXIRMS.js} +9 -9
- package/dist/{stop-UTZ2CXI2.js → stop-FGDGWXTK.js} +10 -10
- package/dist/{stop-failure-CECM5NB7.js → stop-failure-5YAGH2TQ.js} +9 -9
- package/dist/{subagent-start-SYZGJYUN.js → subagent-start-UCKVJDR4.js} +9 -9
- package/dist/{subagent-stop-7WWW7TGQ.js → subagent-stop-H25B3QEC.js} +9 -9
- package/dist/{task-completed-N7SIY6T6.js → task-completed-2JGZN2CF.js} +9 -9
- package/dist/{team-SJPDXELY.js → team-TG5WZXWO.js} +34 -26
- package/dist/team-TG5WZXWO.js.map +1 -0
- package/dist/ui/assets/index-7Vimyg7g.js +837 -0
- package/dist/ui/assets/{index-BmsHIwjl.css → index-DlEQ8A8Y.css} +1 -1
- package/dist/ui/index.html +2 -2
- package/dist/{update-DZZYQ4NJ.js → update-EG3N2EXI.js} +30 -14
- package/dist/update-EG3N2EXI.js.map +1 -0
- package/dist/{user-prompt-submit-UUNRRS5P.js → user-prompt-submit-7FFQ3ORA.js} +10 -10
- package/dist/{verify-JHIMXTY5.js → verify-2M3DYHEY.js} +6 -6
- package/dist/{version-VKNCAPZW.js → version-JUQU5W22.js} +2 -2
- package/package.json +3 -3
- package/dist/chunk-4VF6KQ2Z.js.map +0 -1
- package/dist/chunk-JJXVDCEX.js.map +0 -1
- package/dist/chunk-KH64DHOY.js.map +0 -1
- package/dist/chunk-LD6U3L6O.js.map +0 -1
- package/dist/chunk-NVCGF2DS.js.map +0 -1
- package/dist/chunk-PSYLKCWQ.js.map +0 -1
- package/dist/chunk-S66YG6QK.js.map +0 -1
- package/dist/chunk-TNCBMGWB.js.map +0 -1
- package/dist/cli-JLDCZ77U.js.map +0 -1
- package/dist/doctor-IG3CXMI7.js.map +0 -1
- package/dist/executor-HKNINUWO.js.map +0 -1
- package/dist/init-RHQUINC2.js.map +0 -1
- package/dist/main-MVXPBP5Z.js.map +0 -1
- package/dist/remove-O2WCN6RC.js.map +0 -1
- package/dist/resolve-3FEUV462.js +0 -9
- package/dist/team-SJPDXELY.js.map +0 -1
- package/dist/ui/assets/index-Cn6cQwJy.js +0 -842
- package/dist/update-DZZYQ4NJ.js.map +0 -1
- package/dist/version-VKNCAPZW.js.map +0 -1
- /package/dist/{agent-run-GZ5UVLDV.js.map → agent-run-T433ENJS.js.map} +0 -0
- /package/dist/{agent-tasks-KKQ2GBBB.js.map → agent-tasks-TAIU3V5I.js.map} +0 -0
- /package/dist/{chunk-X34OFKYU.js.map → chunk-23FJUKCN.js.map} +0 -0
- /package/dist/{chunk-KNTJOMWY.js.map → chunk-3MEOYXOW.js.map} +0 -0
- /package/dist/{chunk-UZ5Y6XMP.js.map → chunk-4O3QNM5I.js.map} +0 -0
- /package/dist/{chunk-JTYZRPX5.js.map → chunk-5ZT2Q6P5.js.map} +0 -0
- /package/dist/{chunk-BCKYVLUZ.js.map → chunk-6GG2IVNV.js.map} +0 -0
- /package/dist/{chunk-TFBAV3PV.js.map → chunk-BFM6AM6R.js.map} +0 -0
- /package/dist/{chunk-OQVKLTQY.js.map → chunk-EYMKBNRP.js.map} +0 -0
- /package/dist/{chunk-STBNNKL5.js.map → chunk-GCCBXCHF.js.map} +0 -0
- /package/dist/{chunk-ZESTWGJT.js.map → chunk-GYIA6XLB.js.map} +0 -0
- /package/dist/{chunk-QFMBZ72S.js.map → chunk-SV6UCB2Z.js.map} +0 -0
- /package/dist/{chunk-GMTWRMLP.js.map → chunk-TQO4PF5K.js.map} +0 -0
- /package/dist/{chunk-TVV6PZOC.js.map → chunk-Z7TZJ2SP.js.map} +0 -0
- /package/dist/{client-LRQMMKLP.js.map → client-YNTTC75R.js.map} +0 -0
- /package/dist/{config-H657SF6B.js.map → config-MOWCOJJ4.js.map} +0 -0
- /package/dist/{detect-27DN6UTL.js.map → detect-GFYKKHLJ.js.map} +0 -0
- /package/dist/{detect-providers-PAVE2X6O.js.map → detect-providers-EU35RUL3.js.map} +0 -0
- /package/dist/{init-wizard-ZB3JRDLE.js.map → init-wizard-RFD46XAJ.js.map} +0 -0
- /package/dist/{installer-25TSX4SR.js.map → installer-BTUNKWOU.js.map} +0 -0
- /package/dist/{llm-T3QVHC3Y.js.map → llm-D4VWYUK7.js.map} +0 -0
- /package/dist/{loader-JQLO6K44.js.map → loader-WC4U5NM5.js.map} +0 -0
- /package/dist/{loader-WQKVWL5D.js.map → loader-WGDVRGLM.js.map} +0 -0
- /package/dist/{logs-LXHPDKUA.js.map → logs-WFBX2I7C.js.map} +0 -0
- /package/dist/{open-CVEMRH3Z.js.map → open-3VPUP3HD.js.map} +0 -0
- /package/dist/{openai-embeddings-5T5ZP7LO.js.map → openai-embeddings-SEIV7AM3.js.map} +0 -0
- /package/dist/{openrouter-RD2COFC7.js.map → openrouter-ELODIZRP.js.map} +0 -0
- /package/dist/{post-compact-ALQ2UGZ7.js.map → post-compact-5NYLOC46.js.map} +0 -0
- /package/dist/{post-tool-use-SPL7HIYU.js.map → post-tool-use-SNNXSZ5Y.js.map} +0 -0
- /package/dist/{post-tool-use-failure-B3CUYBTR.js.map → post-tool-use-failure-POKVXQHY.js.map} +0 -0
- /package/dist/{pre-compact-KPWC4V64.js.map → pre-compact-ZUICBJEX.js.map} +0 -0
- /package/dist/{provider-check-QN7OGXZA.js.map → provider-check-B66E5PWS.js.map} +0 -0
- /package/dist/{registry-2XQMCPA6.js.map → registry-DHWVHXWY.js.map} +0 -0
- /package/dist/{resolution-events-5EVUEWHS.js.map → resolution-events-DBCRVZGU.js.map} +0 -0
- /package/dist/{restart-S52VV3SP.js.map → restart-NBB5CXJ4.js.map} +0 -0
- /package/dist/{search-IOJ5O37S.js.map → search-YUQZFRZX.js.map} +0 -0
- /package/dist/{server-T4VPK6FU.js.map → server-NBRX56VL.js.map} +0 -0
- /package/dist/{session-ID6BX72K.js.map → session-2QP4HMZ5.js.map} +0 -0
- /package/dist/{session-end-I7ZABXRI.js.map → session-end-NNFBW7CQ.js.map} +0 -0
- /package/dist/{session-start-VPOUY42U.js.map → session-start-NPNP4IXX.js.map} +0 -0
- /package/dist/{setup-llm-G5UG5N3T.js.map → setup-llm-C3IGFLRN.js.map} +0 -0
- /package/dist/{stats-GRI4MTS2.js.map → stats-FEEXIRMS.js.map} +0 -0
- /package/dist/{stop-UTZ2CXI2.js.map → stop-FGDGWXTK.js.map} +0 -0
- /package/dist/{stop-failure-CECM5NB7.js.map → stop-failure-5YAGH2TQ.js.map} +0 -0
- /package/dist/{subagent-start-SYZGJYUN.js.map → subagent-start-UCKVJDR4.js.map} +0 -0
- /package/dist/{subagent-stop-7WWW7TGQ.js.map → subagent-stop-H25B3QEC.js.map} +0 -0
- /package/dist/{task-completed-N7SIY6T6.js.map → task-completed-2JGZN2CF.js.map} +0 -0
- /package/dist/{user-prompt-submit-UUNRRS5P.js.map → user-prompt-submit-7FFQ3ORA.js.map} +0 -0
- /package/dist/{verify-JHIMXTY5.js.map → verify-2M3DYHEY.js.map} +0 -0
- /package/dist/{resolve-3FEUV462.js.map → version-JUQU5W22.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/symbionts/installer.ts","../src/symbionts/toml-helpers.ts","../src/symbionts/settings-merge.ts","../src/symbionts/json-helpers.ts","../src/symbionts/install-helpers.ts"],"sourcesContent":["import type { SymbiontManifest } from './manifest-schema.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { findTomlSectionEnd, buildTomlMcpSection } from './toml-helpers.js';\nimport { deepMergeSettings, deepRemoveSettings } from './settings-merge.js';\nimport { readJsonFile, writeJsonFile, writeOrDeleteJsonFile } from './json-helpers.js';\nimport { ensureAgentsMd, ensureSymlink, isMycoHookGroup } from './install-helpers.js';\n\n/** Current comment header for Myco-managed .gitignore block. */\nconst GITIGNORE_COMMENT = '# Myco managed (machine-specific)';\n\n/** Legacy comment header — recognized for cleanup during reconciliation. */\nconst GITIGNORE_SKILLS_COMMENT_LEGACY = '# Myco skill symlinks (machine-specific)';\n\n/** Wrangler cache directory created by team sync operations. */\nconst WRANGLER_CACHE_DIR = '.wrangler/';\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: canonical per-skill entries + infrastructure artifacts.\n // Agent-specific targets (e.g. .claude/skills/) use local .gitignore files\n // instead of polluting the project-level .gitignore.\n const desired = [\n ...skillNames.map((name) => `${CANONICAL_SKILLS_DIR}/${name}`),\n WRANGLER_CACHE_DIR,\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_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_COMMENT,\n GITIGNORE_SKILLS_COMMENT_LEGACY,\n `${CANONICAL_SKILLS_DIR}/`, // legacy blanket entry\n WRANGLER_CACHE_DIR,\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 ensureLocalSkillsGitignore(agentSkillsDir);\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/**\n * Create agent-specific symlinks for a skill in `.agents/skills/<name>`.\n *\n * Reads all symbiont manifests to find skillsTarget paths that differ\n * from the canonical `.agents/skills/` directory, then creates relative\n * symlinks from each target to the canonical location.\n *\n * Called by vault_write_skill after writing a generated skill to disk.\n * Also handles removal: when `remove` is true, deletes the symlinks.\n */\nexport function syncSkillSymlinks(\n projectRoot: string,\n skillName: string,\n opts?: { remove?: boolean },\n): void {\n // Resolve manifests dir — try sibling (source layout) then dist layout\n // (tsup bundles into dist/chunk-*.js, but manifests are at dist/src/symbionts/manifests/)\n const selfDir = path.dirname(new URL(import.meta.url).pathname);\n const candidates = [\n path.join(selfDir, 'manifests'),\n path.join(selfDir, 'src', 'symbionts', 'manifests'),\n ];\n const manifestDir = candidates.find((d) => fs.existsSync(d));\n if (!manifestDir) return;\n\n const targets = new Set<string>();\n for (const file of fs.readdirSync(manifestDir).filter((f) => f.endsWith('.yaml'))) {\n try {\n const content = fs.readFileSync(path.join(manifestDir, file), 'utf-8');\n const match = content.match(/skillsTarget:\\s*(.+)/);\n if (match) targets.add(match[1].trim());\n } catch { /* skip unreadable manifests */ }\n }\n\n for (const target of targets) {\n if (target === CANONICAL_SKILLS_DIR) continue; // canonical is the source, not a link target\n\n const agentSkillsDir = path.join(projectRoot, target);\n const linkPath = path.join(agentSkillsDir, skillName);\n\n if (opts?.remove) {\n try { fs.unlinkSync(linkPath); } catch { /* doesn't exist */ }\n try { fs.rmdirSync(agentSkillsDir); } catch { /* not empty or missing */ }\n } else {\n fs.mkdirSync(agentSkillsDir, { recursive: true });\n const canonicalDir = path.join(projectRoot, CANONICAL_SKILLS_DIR);\n const relTarget = path.join(path.relative(agentSkillsDir, canonicalDir), skillName);\n ensureSymlink(linkPath, relTarget);\n // Ensure a local .gitignore ignores all symlinks in this directory.\n // Localized to the agent's skills dir — doesn't pollute the project .gitignore.\n ensureLocalSkillsGitignore(agentSkillsDir);\n }\n }\n}\n\n/** Content for the local .gitignore that ignores Myco-created symlinks. */\nconst LOCAL_SKILLS_GITIGNORE = `# Myco-managed symlinks — generated skills are symlinked here automatically.\n# The canonical location for all skills is .agents/skills/.\n#\n# To add your own skill to this directory, un-ignore it:\n# !my-skill\n*\n!.gitignore\n`;\n\n/**\n * Write a .gitignore inside an agent's skills directory that ignores all\n * symlinks Myco creates there. Idempotent — skips if already present.\n */\nfunction ensureLocalSkillsGitignore(agentSkillsDir: string): void {\n const gitignorePath = path.join(agentSkillsDir, '.gitignore');\n try {\n if (fs.readFileSync(gitignorePath, 'utf-8') === LOCAL_SKILLS_GITIGNORE) return;\n } catch { /* doesn't exist — proceed */ }\n fs.writeFileSync(gitignorePath, LOCAL_SKILLS_GITIGNORE, 'utf-8');\n}\n","/** TOML section header pattern. */\nconst TOML_SECTION_RE = /^\\[([^\\]]+)\\]/;\n\n/** Find where a [mcp_servers.<name>] section ends in a TOML string. */\nexport function 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 */\nexport function 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","/** Deep merge two settings objects. Arrays are appended + deduplicated; objects recurse. */\nexport function 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\nexport function 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 */\nexport function 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","import fs from 'node:fs';\nimport path from 'node:path';\n\nexport function readJsonFile(filePath: string): Record<string, unknown> {\n try {\n return JSON.parse(fs.readFileSync(filePath, 'utf-8'));\n } catch {\n return {};\n }\n}\n\nexport function 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. */\nexport function 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","import 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). */\nexport function 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 */\nexport function 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/**\n * Create a starter AGENTS.md if the project doesn't have one.\n * Idempotent — skips if AGENTS.md already exists.\n */\nexport function 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\nexport function 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"],"mappings":"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","names":["fs","path","fs","path","path","fs"]}
|
|
@@ -2,7 +2,7 @@ import { createRequire as __cr } from 'node:module'; const require = __cr(import
|
|
|
2
2
|
import {
|
|
3
3
|
getTeamMachineId,
|
|
4
4
|
syncRow
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-LF5Z62X6.js";
|
|
6
6
|
import {
|
|
7
7
|
getDatabase
|
|
8
8
|
} from "./chunk-MYX5NCRH.js";
|
|
@@ -88,4 +88,4 @@ export {
|
|
|
88
88
|
insertResolutionEvent,
|
|
89
89
|
listResolutionEvents
|
|
90
90
|
};
|
|
91
|
-
//# sourceMappingURL=chunk-
|
|
91
|
+
//# sourceMappingURL=chunk-Z7TZJ2SP.js.map
|
|
@@ -2,19 +2,19 @@
|
|
|
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-6GG2IVNV.js";
|
|
6
6
|
import "./chunk-SAKJMNSR.js";
|
|
7
|
-
import "./chunk-
|
|
7
|
+
import "./chunk-X5IXK5KO.js";
|
|
8
8
|
import "./chunk-HHZ3RTEI.js";
|
|
9
9
|
import "./chunk-MYX5NCRH.js";
|
|
10
|
-
import "./chunk-UZ5Y6XMP.js";
|
|
11
|
-
import "./chunk-TFBAV3PV.js";
|
|
12
|
-
import "./chunk-LPUQPDC2.js";
|
|
13
|
-
import "./chunk-TRA3R4EC.js";
|
|
14
|
-
import "./chunk-S6I62FAH.js";
|
|
15
10
|
import {
|
|
16
11
|
resolveVaultDir
|
|
17
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-5ZT2Q6P5.js";
|
|
13
|
+
import "./chunk-4O3QNM5I.js";
|
|
14
|
+
import "./chunk-BFM6AM6R.js";
|
|
15
|
+
import "./chunk-LPUQPDC2.js";
|
|
16
|
+
import "./chunk-TRA3R4EC.js";
|
|
17
|
+
import "./chunk-CUADDHHU.js";
|
|
18
18
|
import "./chunk-PZUWP5VK.js";
|
|
19
19
|
|
|
20
20
|
// src/cli.ts
|
|
@@ -26,7 +26,8 @@ var USAGE = `Usage: myco <command> [args]
|
|
|
26
26
|
Commands:
|
|
27
27
|
init [options] Initialize a new vault
|
|
28
28
|
update Update vault files and agent registration
|
|
29
|
-
remove [--remove-vault]
|
|
29
|
+
remove [--remove-vault] Remove Myco from this project (vault preserved by default)
|
|
30
|
+
remove --symbiont <name> Unregister a single agent and remove from config
|
|
30
31
|
config <get|set> [args] Get or set vault config values
|
|
31
32
|
detect-providers Detect available LLM/embedding providers (JSON)
|
|
32
33
|
verify Test LLM and embedding connectivity
|
|
@@ -54,29 +55,29 @@ async function main() {
|
|
|
54
55
|
process.stdout.write(USAGE);
|
|
55
56
|
return;
|
|
56
57
|
}
|
|
57
|
-
if (cmd === "init") return (await import("./init-
|
|
58
|
-
if (cmd === "detect-providers") return (await import("./detect-providers-
|
|
58
|
+
if (cmd === "init") return (await import("./init-PHQAQANR.js")).run(args);
|
|
59
|
+
if (cmd === "detect-providers") return (await import("./detect-providers-EU35RUL3.js")).run(args);
|
|
59
60
|
if (cmd === "version" || cmd === "--version" || cmd === "-v") {
|
|
60
|
-
const { getPluginVersion } = await import("./version-
|
|
61
|
+
const { getPluginVersion } = await import("./version-JUQU5W22.js");
|
|
61
62
|
console.log(getPluginVersion());
|
|
62
63
|
return;
|
|
63
64
|
}
|
|
64
|
-
if (cmd === "mcp") return (await import("./server-
|
|
65
|
+
if (cmd === "mcp") return (await import("./server-NBRX56VL.js")).main();
|
|
65
66
|
if (cmd === "hook") {
|
|
66
67
|
const hookName = args[0];
|
|
67
68
|
const HOOK_DISPATCH = {
|
|
68
|
-
"session-start": () => import("./session-start-
|
|
69
|
-
"session-end": () => import("./session-end-
|
|
70
|
-
"stop": () => import("./stop-
|
|
71
|
-
"user-prompt-submit": () => import("./user-prompt-submit-
|
|
72
|
-
"post-tool-use": () => import("./post-tool-use-
|
|
73
|
-
"post-tool-use-failure": () => import("./post-tool-use-failure-
|
|
74
|
-
"subagent-start": () => import("./subagent-start-
|
|
75
|
-
"subagent-stop": () => import("./subagent-stop-
|
|
76
|
-
"stop-failure": () => import("./stop-failure-
|
|
77
|
-
"task-completed": () => import("./task-completed-
|
|
78
|
-
"pre-compact": () => import("./pre-compact-
|
|
79
|
-
"post-compact": () => import("./post-compact-
|
|
69
|
+
"session-start": () => import("./session-start-NPNP4IXX.js"),
|
|
70
|
+
"session-end": () => import("./session-end-NNFBW7CQ.js"),
|
|
71
|
+
"stop": () => import("./stop-FGDGWXTK.js"),
|
|
72
|
+
"user-prompt-submit": () => import("./user-prompt-submit-7FFQ3ORA.js"),
|
|
73
|
+
"post-tool-use": () => import("./post-tool-use-SNNXSZ5Y.js"),
|
|
74
|
+
"post-tool-use-failure": () => import("./post-tool-use-failure-POKVXQHY.js"),
|
|
75
|
+
"subagent-start": () => import("./subagent-start-UCKVJDR4.js"),
|
|
76
|
+
"subagent-stop": () => import("./subagent-stop-H25B3QEC.js"),
|
|
77
|
+
"stop-failure": () => import("./stop-failure-5YAGH2TQ.js"),
|
|
78
|
+
"task-completed": () => import("./task-completed-2JGZN2CF.js"),
|
|
79
|
+
"pre-compact": () => import("./pre-compact-ZUICBJEX.js"),
|
|
80
|
+
"post-compact": () => import("./post-compact-5NYLOC46.js")
|
|
80
81
|
};
|
|
81
82
|
const loader = HOOK_DISPATCH[hookName];
|
|
82
83
|
if (!loader) {
|
|
@@ -85,13 +86,13 @@ async function main() {
|
|
|
85
86
|
}
|
|
86
87
|
return (await loader()).main();
|
|
87
88
|
}
|
|
88
|
-
if (cmd === "daemon") return (await import("./main-
|
|
89
|
+
if (cmd === "daemon") return (await import("./main-ADLCOYKM.js")).main();
|
|
89
90
|
if (cmd === "doctor") {
|
|
90
91
|
const vaultDir2 = resolveVaultDir();
|
|
91
|
-
return (await import("./doctor-
|
|
92
|
+
return (await import("./doctor-PAAQU5AS.js")).run(args, vaultDir2);
|
|
92
93
|
}
|
|
93
|
-
if (cmd === "update") return (await import("./update-
|
|
94
|
-
if (cmd === "remove") return (await import("./remove-
|
|
94
|
+
if (cmd === "update") return (await import("./update-EG3N2EXI.js")).run(args);
|
|
95
|
+
if (cmd === "remove") return (await import("./remove-SVU2V4Q7.js")).run(args);
|
|
95
96
|
const vaultDir = resolveVaultDir();
|
|
96
97
|
if (!fs.existsSync(path.join(vaultDir, "myco.yaml"))) {
|
|
97
98
|
console.error(`No myco.yaml found in ${vaultDir}. Run 'myco init' first.`);
|
|
@@ -99,39 +100,39 @@ async function main() {
|
|
|
99
100
|
}
|
|
100
101
|
switch (cmd) {
|
|
101
102
|
case "config":
|
|
102
|
-
return (await import("./config-
|
|
103
|
+
return (await import("./config-MOWCOJJ4.js")).run(args, vaultDir);
|
|
103
104
|
case "verify":
|
|
104
|
-
return (await import("./verify-
|
|
105
|
+
return (await import("./verify-2M3DYHEY.js")).run(args, vaultDir);
|
|
105
106
|
case "stats":
|
|
106
|
-
return (await import("./stats-
|
|
107
|
+
return (await import("./stats-FEEXIRMS.js")).run(args, vaultDir);
|
|
107
108
|
case "search":
|
|
108
|
-
return (await import("./search-
|
|
109
|
+
return (await import("./search-YUQZFRZX.js")).run(args, vaultDir);
|
|
109
110
|
case "vectors":
|
|
110
|
-
return (await import("./search-
|
|
111
|
+
return (await import("./search-YUQZFRZX.js")).runVectors(args, vaultDir);
|
|
111
112
|
case "session":
|
|
112
|
-
return (await import("./session-
|
|
113
|
+
return (await import("./session-2QP4HMZ5.js")).run(args, vaultDir);
|
|
113
114
|
case "setup-llm":
|
|
114
|
-
return (await import("./setup-llm-
|
|
115
|
+
return (await import("./setup-llm-C3IGFLRN.js")).run(args, vaultDir);
|
|
115
116
|
case "setup-digest":
|
|
116
117
|
return (await import("./setup-digest-4KDSXAIV.js")).run(args, vaultDir);
|
|
117
118
|
case "agent":
|
|
118
|
-
return (await import("./agent-run-
|
|
119
|
+
return (await import("./agent-run-T433ENJS.js")).run(args, vaultDir);
|
|
119
120
|
case "task":
|
|
120
|
-
return (await import("./agent-tasks-
|
|
121
|
+
return (await import("./agent-tasks-TAIU3V5I.js")).run(args, vaultDir);
|
|
121
122
|
case "team": {
|
|
122
123
|
const sub = args[0];
|
|
123
|
-
if (sub === "init") return (await import("./team-
|
|
124
|
-
if (sub === "upgrade") return (await import("./team-
|
|
124
|
+
if (sub === "init") return (await import("./team-TG5WZXWO.js")).teamInit(vaultDir);
|
|
125
|
+
if (sub === "upgrade") return (await import("./team-TG5WZXWO.js")).teamUpgrade(vaultDir);
|
|
125
126
|
console.error("Usage: myco team <init|upgrade>");
|
|
126
127
|
process.exit(1);
|
|
127
128
|
break;
|
|
128
129
|
}
|
|
129
130
|
case "open":
|
|
130
|
-
return (await import("./open-
|
|
131
|
+
return (await import("./open-3VPUP3HD.js")).run(args, vaultDir);
|
|
131
132
|
case "restart":
|
|
132
|
-
return (await import("./restart-
|
|
133
|
+
return (await import("./restart-NBB5CXJ4.js")).run(args, vaultDir);
|
|
133
134
|
case "logs":
|
|
134
|
-
return (await import("./logs-
|
|
135
|
+
return (await import("./logs-WFBX2I7C.js")).run(args, vaultDir);
|
|
135
136
|
default:
|
|
136
137
|
console.error(`Unknown command: ${cmd}`);
|
|
137
138
|
process.stdout.write(USAGE);
|
|
@@ -142,4 +143,4 @@ main().catch((err) => {
|
|
|
142
143
|
console.error(`myco: ${err.message}`);
|
|
143
144
|
process.exit(1);
|
|
144
145
|
});
|
|
145
|
-
//# sourceMappingURL=cli-
|
|
146
|
+
//# sourceMappingURL=cli-W37MRZHD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { loadEnv } from './cli/shared.js';\nimport { resolveVaultDir } from './vault/resolve.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nloadEnv();\n\nconst USAGE = `Usage: myco <command> [args]\n\nCommands:\n init [options] Initialize a new vault\n update Update vault files and agent registration\n remove [--remove-vault] Remove Myco from this project (vault preserved by default)\n remove --symbiont <name> Unregister a single agent and remove from config\n config <get|set> [args] Get or set vault config values\n detect-providers Detect available LLM/embedding providers (JSON)\n verify Test LLM and embedding connectivity\n stats Vault health, index counts, vector count\n search <query> Combined FTS + vector search with scores\n vectors <query> Raw vector search with similarity scores\n session [id|latest] Show a session\n logs [options] View daemon logs\n setup-llm [options] Configure LLM and embedding providers\n setup-digest [options] Configure digest and capture settings\n agent [options] Run the intelligence agent\n task <subcommand> Manage agent task definitions\n team <init|upgrade> Provision or upgrade team sync infrastructure\n doctor [--fix] Check vault health and repair issues\n open Open the dashboard in your browser\n restart Restart the daemon\n version Show plugin version\n mcp Start the MCP stdio server\n hook <name> Run a hook (session-start, session-end, stop, user-prompt-submit, post-tool-use, post-tool-use-failure, subagent-start, subagent-stop, stop-failure, task-completed, pre-compact, post-compact)\n daemon --vault <dir> Start the daemon process\n`;\n\nasync function main(): Promise<void> {\n const [cmd, ...args] = process.argv.slice(2);\n if (!cmd || cmd === '--help' || cmd === '-h') {\n process.stdout.write(USAGE);\n return;\n }\n\n if (cmd === 'init') return (await import('./cli/init.js')).run(args);\n if (cmd === 'detect-providers') return (await import('./cli/detect-providers.js')).run(args);\n if (cmd === 'version' || cmd === '--version' || cmd === '-v') {\n const { getPluginVersion } = await import('./version.js');\n console.log(getPluginVersion());\n return;\n }\n if (cmd === 'mcp') return (await import('./mcp/server.js')).main();\n if (cmd === 'hook') {\n const hookName = args[0];\n const HOOK_DISPATCH: Record<string, () => Promise<{ main: () => Promise<void> }>> = {\n 'session-start': () => import('./hooks/session-start.js'),\n 'session-end': () => import('./hooks/session-end.js'),\n 'stop': () => import('./hooks/stop.js'),\n 'user-prompt-submit': () => import('./hooks/user-prompt-submit.js'),\n 'post-tool-use': () => import('./hooks/post-tool-use.js'),\n 'post-tool-use-failure': () => import('./hooks/post-tool-use-failure.js'),\n 'subagent-start': () => import('./hooks/subagent-start.js'),\n 'subagent-stop': () => import('./hooks/subagent-stop.js'),\n 'stop-failure': () => import('./hooks/stop-failure.js'),\n 'task-completed': () => import('./hooks/task-completed.js'),\n 'pre-compact': () => import('./hooks/pre-compact.js'),\n 'post-compact': () => import('./hooks/post-compact.js'),\n };\n const loader = HOOK_DISPATCH[hookName];\n if (!loader) {\n console.error(`Unknown hook: ${hookName}. Available: ${Object.keys(HOOK_DISPATCH).join(', ')}`);\n process.exit(1);\n }\n return (await loader()).main();\n }\n if (cmd === 'daemon') return (await import('./daemon/main.js')).main();\n\n if (cmd === 'doctor') {\n const vaultDir = resolveVaultDir();\n return (await import('./cli/doctor.js')).run(args, vaultDir);\n }\n\n if (cmd === 'update') return (await import('./cli/update.js')).run(args);\n if (cmd === 'remove') return (await import('./cli/remove.js')).run(args);\n\n const vaultDir = resolveVaultDir();\n if (!fs.existsSync(path.join(vaultDir, 'myco.yaml'))) {\n console.error(`No myco.yaml found in ${vaultDir}. Run 'myco init' first.`);\n process.exit(1);\n }\n\n switch (cmd) {\n case 'config': return (await import('./cli/config.js')).run(args, vaultDir);\n case 'verify': return (await import('./cli/verify.js')).run(args, vaultDir);\n case 'stats': return (await import('./cli/stats.js')).run(args, vaultDir);\n case 'search': return (await import('./cli/search.js')).run(args, vaultDir);\n case 'vectors': return (await import('./cli/search.js')).runVectors(args, vaultDir);\n case 'session': return (await import('./cli/session.js')).run(args, vaultDir);\n case 'setup-llm': return (await import('./cli/setup-llm.js')).run(args, vaultDir);\n case 'setup-digest': return (await import('./cli/setup-digest.js')).run(args, vaultDir);\n case 'agent': return (await import('./cli/agent-run.js')).run(args, vaultDir);\n case 'task': return (await import('./cli/agent-tasks.js')).run(args, vaultDir);\n case 'team': {\n const sub = args[0];\n if (sub === 'init') return (await import('./cli/team.js')).teamInit(vaultDir);\n if (sub === 'upgrade') return (await import('./cli/team.js')).teamUpgrade(vaultDir);\n console.error('Usage: myco team <init|upgrade>');\n process.exit(1);\n break;\n }\n case 'open': return (await import('./cli/open.js')).run(args, vaultDir);\n case 'restart': return (await import('./cli/restart.js')).run(args, vaultDir);\n case 'logs': return (await import('./cli/logs.js')).run(args, vaultDir);\n default:\n console.error(`Unknown command: ${cmd}`);\n process.stdout.write(USAGE);\n process.exit(1);\n }\n}\n\nmain().catch((err) => {\n console.error(`myco: ${(err as Error).message}`);\n process.exit(1);\n});\n"],"mappings":"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","names":["vaultDir"]}
|
|
@@ -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-
|
|
6
|
-
import "./chunk-
|
|
5
|
+
} from "./chunk-4O3QNM5I.js";
|
|
6
|
+
import "./chunk-BFM6AM6R.js";
|
|
7
7
|
import "./chunk-LPUQPDC2.js";
|
|
8
8
|
import "./chunk-TRA3R4EC.js";
|
|
9
|
-
import "./chunk-
|
|
9
|
+
import "./chunk-CUADDHHU.js";
|
|
10
10
|
import "./chunk-PZUWP5VK.js";
|
|
11
11
|
export {
|
|
12
12
|
DaemonClient,
|
|
13
13
|
resolveCliEntryPath
|
|
14
14
|
};
|
|
15
|
-
//# sourceMappingURL=client-
|
|
15
|
+
//# sourceMappingURL=client-YNTTC75R.js.map
|
|
@@ -5,12 +5,12 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
loadConfig,
|
|
7
7
|
updateConfig
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-4BQ5QE76.js";
|
|
9
9
|
import "./chunk-TRA3R4EC.js";
|
|
10
|
-
import "./chunk-
|
|
10
|
+
import "./chunk-CUADDHHU.js";
|
|
11
11
|
import "./chunk-D7TYRPRM.js";
|
|
12
12
|
import "./chunk-E4VLWIJC.js";
|
|
13
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-GDY63YAW.js";
|
|
14
14
|
import "./chunk-PZUWP5VK.js";
|
|
15
15
|
|
|
16
16
|
// src/cli/config.ts
|
|
@@ -87,4 +87,4 @@ function parseValue(raw) {
|
|
|
87
87
|
export {
|
|
88
88
|
run
|
|
89
89
|
};
|
|
90
|
-
//# sourceMappingURL=config-
|
|
90
|
+
//# sourceMappingURL=config-MOWCOJJ4.js.map
|
|
@@ -3,15 +3,15 @@ import {
|
|
|
3
3
|
detectSymbionts,
|
|
4
4
|
loadManifests,
|
|
5
5
|
resolvePackageRoot
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-SV6UCB2Z.js";
|
|
7
7
|
import "./chunk-LPUQPDC2.js";
|
|
8
8
|
import "./chunk-D7TYRPRM.js";
|
|
9
9
|
import "./chunk-E4VLWIJC.js";
|
|
10
|
-
import "./chunk-
|
|
10
|
+
import "./chunk-GDY63YAW.js";
|
|
11
11
|
import "./chunk-PZUWP5VK.js";
|
|
12
12
|
export {
|
|
13
13
|
detectSymbionts,
|
|
14
14
|
loadManifests,
|
|
15
15
|
resolvePackageRoot
|
|
16
16
|
};
|
|
17
|
-
//# sourceMappingURL=detect-
|
|
17
|
+
//# sourceMappingURL=detect-GFYKKHLJ.js.map
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
} from "./chunk-GDCSPMH4.js";
|
|
5
5
|
import "./chunk-HHZ3RTEI.js";
|
|
6
6
|
import "./chunk-TRA3R4EC.js";
|
|
7
|
-
import "./chunk-
|
|
7
|
+
import "./chunk-CUADDHHU.js";
|
|
8
8
|
import "./chunk-PZUWP5VK.js";
|
|
9
9
|
|
|
10
10
|
// src/cli/detect-providers.ts
|
|
@@ -23,4 +23,4 @@ async function run(_args) {
|
|
|
23
23
|
export {
|
|
24
24
|
run
|
|
25
25
|
};
|
|
26
|
-
//# sourceMappingURL=detect-providers-
|
|
26
|
+
//# sourceMappingURL=detect-providers-EU35RUL3.js.map
|
|
@@ -1,18 +1,18 @@
|
|
|
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-6GG2IVNV.js";
|
|
5
5
|
import "./chunk-SAKJMNSR.js";
|
|
6
6
|
import {
|
|
7
7
|
MYCO_MCP_SERVER_NAME
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-X5IXK5KO.js";
|
|
9
9
|
import "./chunk-HHZ3RTEI.js";
|
|
10
10
|
import "./chunk-MYX5NCRH.js";
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-4O3QNM5I.js";
|
|
12
|
+
import "./chunk-BFM6AM6R.js";
|
|
13
13
|
import "./chunk-LPUQPDC2.js";
|
|
14
14
|
import "./chunk-TRA3R4EC.js";
|
|
15
|
-
import "./chunk-
|
|
15
|
+
import "./chunk-CUADDHHU.js";
|
|
16
16
|
import "./chunk-PZUWP5VK.js";
|
|
17
17
|
|
|
18
18
|
// src/cli/doctor.ts
|
|
@@ -29,7 +29,7 @@ async function checkVault(vaultDir) {
|
|
|
29
29
|
return { check: { name: "Vault", status: "fail", detail: `${CONFIG_FILENAME} not found in ${vaultDir}`, fixable: false }, config: null };
|
|
30
30
|
}
|
|
31
31
|
try {
|
|
32
|
-
const { loadConfig } = await import("./loader-
|
|
32
|
+
const { loadConfig } = await import("./loader-WGDVRGLM.js");
|
|
33
33
|
const config = loadConfig(vaultDir);
|
|
34
34
|
return { check: { name: "Vault", status: "ok", detail: `.myco/ (v${config.version})`, fixable: false }, config };
|
|
35
35
|
} catch (err) {
|
|
@@ -68,7 +68,7 @@ async function checkIntelligence(config) {
|
|
|
68
68
|
return { name: "Intelligence", status: "ok", detail: `${label} (SDK handles auth)`, fixable: false };
|
|
69
69
|
}
|
|
70
70
|
if (provider.type === "ollama" || provider.type === "lmstudio") {
|
|
71
|
-
const { checkLocalProvider } = await import("./provider-check-
|
|
71
|
+
const { checkLocalProvider } = await import("./provider-check-B66E5PWS.js");
|
|
72
72
|
const status = await checkLocalProvider(provider.type, provider.base_url);
|
|
73
73
|
if (!status.available) {
|
|
74
74
|
return { name: "Intelligence", status: "warn", detail: `${label} (not reachable)`, fixable: false };
|
|
@@ -82,7 +82,7 @@ async function checkIntelligence(config) {
|
|
|
82
82
|
}
|
|
83
83
|
async function checkEmbeddings(config) {
|
|
84
84
|
try {
|
|
85
|
-
const { createEmbeddingProvider } = await import("./llm-
|
|
85
|
+
const { createEmbeddingProvider } = await import("./llm-D4VWYUK7.js");
|
|
86
86
|
const provider = createEmbeddingProvider(config.embedding);
|
|
87
87
|
const available = await provider.isAvailable();
|
|
88
88
|
const label = `${config.embedding.provider} / ${config.embedding.model}`;
|
|
@@ -94,34 +94,53 @@ async function checkEmbeddings(config) {
|
|
|
94
94
|
return { name: "Embeddings", status: "fail", detail: `Embedding check failed: ${err.message}`, fixable: false };
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
|
-
async function checkAgents(vaultDir) {
|
|
97
|
+
async function checkAgents(vaultDir, config) {
|
|
98
98
|
try {
|
|
99
|
-
const { detectSymbionts } = await import("./detect-
|
|
100
|
-
const {
|
|
101
|
-
const projectRoot = path.dirname(
|
|
99
|
+
const { detectSymbionts } = await import("./detect-GFYKKHLJ.js");
|
|
100
|
+
const { getEnabledSymbiontNames } = await import("./loader-WGDVRGLM.js");
|
|
101
|
+
const projectRoot = path.dirname(vaultDir);
|
|
102
102
|
const detected = detectSymbionts(projectRoot);
|
|
103
|
-
|
|
103
|
+
const enabledNames = config ? getEnabledSymbiontNames(config) : null;
|
|
104
|
+
if (detected.length === 0 && !enabledNames) {
|
|
104
105
|
return [{ name: "Agents", status: "warn", detail: "No symbionts detected", fixable: false }];
|
|
105
106
|
}
|
|
106
107
|
const checks = [];
|
|
107
108
|
for (const d of detected) {
|
|
108
109
|
const registered = isSymbiontRegistered(d, projectRoot);
|
|
109
|
-
|
|
110
|
+
const enabled = enabledNames ? enabledNames.has(d.manifest.name) : registered;
|
|
111
|
+
if (enabled && registered) {
|
|
110
112
|
checks.push({
|
|
111
113
|
name: checks.length === 0 ? "Agents" : "",
|
|
112
114
|
status: "ok",
|
|
113
|
-
detail: `${d.manifest.displayName} (registered)`,
|
|
115
|
+
detail: `${d.manifest.displayName} (enabled, registered)`,
|
|
114
116
|
fixable: false
|
|
115
117
|
});
|
|
116
|
-
} else {
|
|
118
|
+
} else if (enabled && !registered) {
|
|
117
119
|
checks.push({
|
|
118
120
|
name: checks.length === 0 ? "Agents" : "",
|
|
119
121
|
status: "warn",
|
|
120
|
-
detail: `${d.manifest.displayName} (
|
|
122
|
+
detail: `${d.manifest.displayName} (enabled but not registered \u2014 run \`myco update\`)`,
|
|
123
|
+
fixable: false
|
|
124
|
+
});
|
|
125
|
+
} else if (!enabled && registered) {
|
|
126
|
+
checks.push({
|
|
127
|
+
name: checks.length === 0 ? "Agents" : "",
|
|
128
|
+
status: "warn",
|
|
129
|
+
detail: `${d.manifest.displayName} (registered but not enabled \u2014 run \`myco remove --symbiont ${d.manifest.name}\`)`,
|
|
130
|
+
fixable: false
|
|
131
|
+
});
|
|
132
|
+
} else {
|
|
133
|
+
checks.push({
|
|
134
|
+
name: checks.length === 0 ? "Agents" : "",
|
|
135
|
+
status: "ok",
|
|
136
|
+
detail: `${d.manifest.displayName} (detected, not enabled)`,
|
|
121
137
|
fixable: false
|
|
122
138
|
});
|
|
123
139
|
}
|
|
124
140
|
}
|
|
141
|
+
if (checks.length === 0) {
|
|
142
|
+
return [{ name: "Agents", status: "warn", detail: "No symbionts detected or enabled", fixable: false }];
|
|
143
|
+
}
|
|
125
144
|
return checks;
|
|
126
145
|
} catch (err) {
|
|
127
146
|
return [{ name: "Agents", status: "fail", detail: `Agent check failed: ${err.message}`, fixable: false }];
|
|
@@ -177,7 +196,7 @@ async function runChecks(vaultDir) {
|
|
|
177
196
|
checks.push(await checkDatabase(vaultDir));
|
|
178
197
|
checks.push(await checkIntelligence(config));
|
|
179
198
|
checks.push(await checkEmbeddings(config));
|
|
180
|
-
checks.push(...await checkAgents(vaultDir));
|
|
199
|
+
checks.push(...await checkAgents(vaultDir, config));
|
|
181
200
|
checks.push(await checkDaemon(vaultDir));
|
|
182
201
|
return checks;
|
|
183
202
|
}
|
|
@@ -251,4 +270,4 @@ export {
|
|
|
251
270
|
run,
|
|
252
271
|
runChecks
|
|
253
272
|
};
|
|
254
|
-
//# sourceMappingURL=doctor-
|
|
273
|
+
//# sourceMappingURL=doctor-PAAQU5AS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/doctor.ts"],"sourcesContent":["/**\n * CLI: myco doctor — check vault health and auto-repair fixable issues.\n *\n * Runs a series of health checks against the vault directory and reports\n * status. With --fix, attempts to repair issues it can handle automatically.\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { isProcessAlive } from './shared.js';\nimport { MYCO_MCP_SERVER_NAME } from '../symbionts/installer.js';\n\n// --- Named constants (no magic literals) ---\n\n\n/** Filename of the vault config file. */\nconst CONFIG_FILENAME = 'myco.yaml';\n\n/** Filename of the daemon state file. */\nconst DAEMON_STATE_FILENAME = 'daemon.json';\n\n/** Filename of the SQLite database. */\nconst DB_FILENAME = 'myco.db';\n\n/** Column width for the check name in output. */\nconst NAME_COL_WIDTH = 17;\n\n/** Prefix for indented continuation lines (e.g. multi-line agent output). */\nconst CONTINUATION_INDENT = ' '.repeat(NAME_COL_WIDTH);\n\n// --- Types ---\n\nexport interface DoctorCheck {\n name: string;\n status: 'ok' | 'fail' | 'warn';\n detail: string;\n fixable: boolean;\n}\n\n// --- Checks ---\n\n/** Check that myco.yaml exists and parses. Returns the parsed config on success. */\nasync function checkVault(vaultDir: string): Promise<{ check: DoctorCheck; config: import('../config/schema.js').MycoConfig | null }> {\n const configPath = path.join(vaultDir, CONFIG_FILENAME);\n if (!fs.existsSync(configPath)) {\n return { check: { name: 'Vault', status: 'fail', detail: `${CONFIG_FILENAME} not found in ${vaultDir}`, fixable: false }, config: null };\n }\n try {\n const { loadConfig } = await import('../config/loader.js');\n const config = loadConfig(vaultDir);\n return { check: { name: 'Vault', status: 'ok', detail: `.myco/ (v${config.version})`, fixable: false }, config };\n } catch (err) {\n return { check: { name: 'Vault', status: 'fail', detail: `${CONFIG_FILENAME} parse error: ${(err as Error).message}`, fixable: false }, config: null };\n }\n}\n\n/** Check that the SQLite database exists and can be queried. */\nasync function checkDatabase(vaultDir: string): Promise<DoctorCheck> {\n const dbPath = path.join(vaultDir, DB_FILENAME);\n if (!fs.existsSync(dbPath)) {\n return { name: 'Database', status: 'fail', detail: `${DB_FILENAME} not found — run \\`myco init\\``, fixable: false };\n }\n try {\n const { initDatabase, closeDatabase, vaultDbPath } = await import('../db/client.js');\n const db = initDatabase(vaultDbPath(vaultDir));\n const row = db.prepare('SELECT count(*) AS cnt FROM sessions').get() as { cnt: number } | undefined;\n const count = row?.cnt ?? 0;\n closeDatabase();\n return { name: 'Database', status: 'ok', detail: `${DB_FILENAME} (${count.toLocaleString()} sessions)`, fixable: false };\n } catch (err) {\n // Ensure DB is closed even on error\n try { const { closeDatabase } = await import('../db/client.js'); closeDatabase(); } catch { /* ignore */ }\n return { name: 'Database', status: 'fail', detail: `Database error: ${(err as Error).message}`, fixable: false };\n }\n}\n\n/** Check that the intelligence (agent) provider is configured. */\nasync function checkIntelligence(config: import('../config/schema.js').MycoConfig): Promise<DoctorCheck> {\n try {\n const provider = config.agent.provider;\n\n if (!provider) {\n return { name: 'Intelligence', status: 'warn', detail: 'No agent provider configured — run `myco init` to set up', fixable: false };\n }\n\n const label = `${provider.type}${provider.model ? ` / ${provider.model}` : ''}`;\n\n if (provider.type === 'cloud') {\n return { name: 'Intelligence', status: 'ok', detail: `${label} (SDK handles auth)`, fixable: false };\n }\n\n // Local provider — check reachability\n if (provider.type === 'ollama' || provider.type === 'lmstudio') {\n const { checkLocalProvider } = await import('../intelligence/provider-check.js');\n const status = await checkLocalProvider(provider.type, provider.base_url);\n if (!status.available) {\n return { name: 'Intelligence', status: 'warn', detail: `${label} (not reachable)`, fixable: false };\n }\n return { name: 'Intelligence', status: 'ok', detail: label, fixable: false };\n }\n\n return { name: 'Intelligence', status: 'ok', detail: label, fixable: false };\n } catch (err) {\n return { name: 'Intelligence', status: 'fail', detail: `Intelligence check failed: ${(err as Error).message}`, fixable: false };\n }\n}\n\n/** Check that the embedding provider is configured and reachable. */\nasync function checkEmbeddings(config: import('../config/schema.js').MycoConfig): Promise<DoctorCheck> {\n try {\n const { createEmbeddingProvider } = await import('../intelligence/llm.js');\n const provider = createEmbeddingProvider(config.embedding);\n const available = await provider.isAvailable();\n const label = `${config.embedding.provider} / ${config.embedding.model}`;\n if (available) {\n return { name: 'Embeddings', status: 'ok', detail: label, fixable: false };\n }\n return { name: 'Embeddings', status: 'warn', detail: `${label} (not reachable)`, fixable: false };\n } catch (err) {\n return { name: 'Embeddings', status: 'fail', detail: `Embedding check failed: ${(err as Error).message}`, fixable: false };\n }\n}\n\n/** Check symbiont detection and registration status. */\nasync function checkAgents(vaultDir: string, config: import('../config/schema.js').MycoConfig | null): Promise<DoctorCheck[]> {\n try {\n const { detectSymbionts } = await import('../symbionts/detect.js');\n const { getEnabledSymbiontNames } = await import('../config/loader.js');\n const projectRoot = path.dirname(vaultDir);\n const detected = detectSymbionts(projectRoot);\n\n const enabledNames = config ? getEnabledSymbiontNames(config) : null;\n\n if (detected.length === 0 && !enabledNames) {\n return [{ name: 'Agents', status: 'warn', detail: 'No symbionts detected', fixable: false }];\n }\n\n const checks: DoctorCheck[] = [];\n for (const d of detected) {\n const registered = isSymbiontRegistered(d, projectRoot);\n const enabled = enabledNames ? enabledNames.has(d.manifest.name) : registered;\n\n if (enabled && registered) {\n checks.push({\n name: checks.length === 0 ? 'Agents' : '',\n status: 'ok',\n detail: `${d.manifest.displayName} (enabled, registered)`,\n fixable: false,\n });\n } else if (enabled && !registered) {\n checks.push({\n name: checks.length === 0 ? 'Agents' : '',\n status: 'warn',\n detail: `${d.manifest.displayName} (enabled but not registered — run \\`myco update\\`)`,\n fixable: false,\n });\n } else if (!enabled && registered) {\n checks.push({\n name: checks.length === 0 ? 'Agents' : '',\n status: 'warn',\n detail: `${d.manifest.displayName} (registered but not enabled — run \\`myco remove --symbiont ${d.manifest.name}\\`)`,\n fixable: false,\n });\n } else {\n // Detected but neither enabled nor registered\n checks.push({\n name: checks.length === 0 ? 'Agents' : '',\n status: 'ok',\n detail: `${d.manifest.displayName} (detected, not enabled)`,\n fixable: false,\n });\n }\n }\n\n if (checks.length === 0) {\n return [{ name: 'Agents', status: 'warn', detail: 'No symbionts detected or enabled', fixable: false }];\n }\n\n return checks;\n } catch (err) {\n return [{ name: 'Agents', status: 'fail', detail: `Agent check failed: ${(err as Error).message}`, fixable: false }];\n }\n}\n\n/** Check if a symbiont has the Myco MCP server registered. */\nfunction isSymbiontRegistered(\n d: import('../symbionts/detect.js').DetectedSymbiont,\n projectRoot: string,\n): boolean {\n try {\n const mcpTarget = d.manifest.registration?.mcpTarget;\n if (!mcpTarget) return false;\n\n const mcpFile = path.join(projectRoot, mcpTarget);\n const raw = fs.readFileSync(mcpFile, 'utf-8');\n\n // TOML: check for section header\n if (mcpTarget.endsWith('.toml')) {\n return raw.includes(`[mcp_servers.${MYCO_MCP_SERVER_NAME}]`);\n }\n\n // JSON: check for server entry\n const config = JSON.parse(raw) as Record<string, unknown>;\n const servers = config.mcpServers as Record<string, unknown> | undefined;\n return !!servers?.[MYCO_MCP_SERVER_NAME];\n } catch { /* config missing or malformed */ }\n return false;\n}\n\n/** Check the daemon state file and process liveness. */\nasync function checkDaemon(vaultDir: string): Promise<DoctorCheck> {\n const daemonFile = path.join(vaultDir, DAEMON_STATE_FILENAME);\n if (!fs.existsSync(daemonFile)) {\n return { name: 'Daemon', status: 'warn', detail: 'Not running (no daemon.json)', fixable: false };\n }\n try {\n const state = JSON.parse(fs.readFileSync(daemonFile, 'utf-8')) as { pid?: number; port?: number };\n if (!state.pid) {\n return { name: 'Daemon', status: 'warn', detail: 'daemon.json exists but no PID', fixable: true };\n }\n if (isProcessAlive(state.pid)) {\n return { name: 'Daemon', status: 'ok', detail: `PID ${state.pid}, port ${state.port ?? 'unknown'}`, fixable: false };\n }\n return { name: 'Daemon', status: 'warn', detail: `Stale daemon.json (PID ${state.pid} not running)`, fixable: true };\n } catch (err) {\n return { name: 'Daemon', status: 'fail', detail: `daemon.json parse error: ${(err as Error).message}`, fixable: true };\n }\n}\n\n\n// --- Public API ---\n\n/** Run all health checks against a vault directory. */\nexport async function runChecks(vaultDir: string): Promise<DoctorCheck[]> {\n const { check: vaultCheck, config } = await checkVault(vaultDir);\n const checks: DoctorCheck[] = [vaultCheck];\n\n if (!config) {\n checks.push(\n { name: 'Database', status: 'fail', detail: 'Skipped (vault check failed)', fixable: false },\n { name: 'Intelligence', status: 'fail', detail: 'Skipped (vault check failed)', fixable: false },\n { name: 'Embeddings', status: 'fail', detail: 'Skipped (vault check failed)', fixable: false },\n { name: 'Agents', status: 'fail', detail: 'Skipped (vault check failed)', fixable: false },\n await checkDaemon(vaultDir),\n );\n return checks;\n }\n\n checks.push(await checkDatabase(vaultDir));\n checks.push(await checkIntelligence(config));\n checks.push(await checkEmbeddings(config));\n checks.push(...await checkAgents(vaultDir, config));\n checks.push(await checkDaemon(vaultDir));\n\n return checks;\n}\n\n/** Auto-repair fixable issues. Returns descriptions of actions taken. */\nexport async function fix(vaultDir: string, checks: DoctorCheck[]): Promise<string[]> {\n const actions: string[] = [];\n\n for (const check of checks) {\n if (!check.fixable || check.status === 'ok') continue;\n\n // Fix stale daemon.json\n if (check.name === 'Daemon' && check.detail.includes('Stale')) {\n const daemonFile = path.join(vaultDir, DAEMON_STATE_FILENAME);\n fs.unlinkSync(daemonFile);\n actions.push('Removed stale daemon.json');\n }\n\n // Fix malformed daemon.json\n if (check.name === 'Daemon' && check.detail.includes('parse error')) {\n const daemonFile = path.join(vaultDir, DAEMON_STATE_FILENAME);\n fs.unlinkSync(daemonFile);\n actions.push('Removed malformed daemon.json');\n }\n\n // Advise on database issues\n if (check.name === 'Database' && check.status === 'fail') {\n actions.push('Run `myco init` to initialize the database');\n }\n }\n\n return actions;\n}\n\n// --- Output formatting ---\n\n/** Status label width (visible characters). */\nconst STATUS_COL_WIDTH = 6;\n\nconst STATUS_LABELS: Record<DoctorCheck['status'], { text: string; color: string }> = {\n ok: { text: 'ok', color: '\\x1b[32m' },\n fail: { text: 'FAIL', color: '\\x1b[31m' },\n warn: { text: '!!', color: '\\x1b[33m' },\n};\n\nfunction formatCheck(check: DoctorCheck): string {\n const name = check.name ? check.name.padEnd(NAME_COL_WIDTH) : CONTINUATION_INDENT;\n const { text, color } = STATUS_LABELS[check.status];\n const paddedText = text.padEnd(STATUS_COL_WIDTH);\n return ` ${name}${color}${paddedText}\\x1b[0m${check.detail}`;\n}\n\n// --- CLI entry point ---\n\nexport async function run(args: string[], vaultDir: string): Promise<void> {\n const shouldFix = args.includes('--fix');\n\n console.log('\\nmyco doctor\\n');\n\n const checks = await runChecks(vaultDir);\n\n for (const check of checks) {\n console.log(formatCheck(check));\n }\n\n const issues = checks.filter(c => c.status !== 'ok');\n const fixable = issues.filter(c => c.fixable);\n\n console.log('');\n\n if (issues.length === 0) {\n console.log(' All checks passed.\\n');\n return;\n }\n\n console.log(` ${issues.length} issue(s) found.`);\n\n if (shouldFix) {\n const actions = await fix(vaultDir, checks);\n if (actions.length > 0) {\n console.log('');\n for (const action of actions) {\n console.log(` Fixed: ${action}`);\n }\n console.log('');\n } else {\n console.log(' No auto-fixable issues.\\n');\n }\n } else if (fixable.length > 0) {\n console.log(` Run \\`myco doctor --fix\\` to repair ${fixable.length} fixable issue(s).\\n`);\n } else {\n console.log('');\n }\n}\n"],"mappings":"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","names":[]}
|