@mycelish/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/__tests__/init-auto.test.d.ts +2 -0
- package/dist/__tests__/init-auto.test.d.ts.map +1 -0
- package/dist/__tests__/init-auto.test.js +60 -0
- package/dist/__tests__/init-auto.test.js.map +1 -0
- package/dist/commands/add.d.ts +20 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +99 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/add.test.d.ts +25 -0
- package/dist/commands/add.test.d.ts.map +1 -0
- package/dist/commands/add.test.js +574 -0
- package/dist/commands/add.test.js.map +1 -0
- package/dist/commands/disable.d.ts +33 -0
- package/dist/commands/disable.d.ts.map +1 -0
- package/dist/commands/disable.js +201 -0
- package/dist/commands/disable.js.map +1 -0
- package/dist/commands/disable.test.d.ts +6 -0
- package/dist/commands/disable.test.d.ts.map +1 -0
- package/dist/commands/disable.test.js +290 -0
- package/dist/commands/disable.test.js.map +1 -0
- package/dist/commands/doctor.d.ts +11 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +33 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/doctor.test.d.ts +17 -0
- package/dist/commands/doctor.test.d.ts.map +1 -0
- package/dist/commands/doctor.test.js +691 -0
- package/dist/commands/doctor.test.js.map +1 -0
- package/dist/commands/enable.d.ts +33 -0
- package/dist/commands/enable.d.ts.map +1 -0
- package/dist/commands/enable.js +199 -0
- package/dist/commands/enable.js.map +1 -0
- package/dist/commands/enable.test.d.ts +6 -0
- package/dist/commands/enable.test.d.ts.map +1 -0
- package/dist/commands/enable.test.js +301 -0
- package/dist/commands/enable.test.js.map +1 -0
- package/dist/commands/health-checks/config-check.d.ts +34 -0
- package/dist/commands/health-checks/config-check.d.ts.map +1 -0
- package/dist/commands/health-checks/config-check.js +267 -0
- package/dist/commands/health-checks/config-check.js.map +1 -0
- package/dist/commands/health-checks/formatter.d.ts +13 -0
- package/dist/commands/health-checks/formatter.d.ts.map +1 -0
- package/dist/commands/health-checks/formatter.js +72 -0
- package/dist/commands/health-checks/formatter.js.map +1 -0
- package/dist/commands/health-checks/index.d.ts +8 -0
- package/dist/commands/health-checks/index.d.ts.map +1 -0
- package/dist/commands/health-checks/index.js +7 -0
- package/dist/commands/health-checks/index.js.map +1 -0
- package/dist/commands/health-checks/mcp-check.d.ts +9 -0
- package/dist/commands/health-checks/mcp-check.d.ts.map +1 -0
- package/dist/commands/health-checks/mcp-check.js +37 -0
- package/dist/commands/health-checks/mcp-check.js.map +1 -0
- package/dist/commands/health-checks/memory-check.d.ts +15 -0
- package/dist/commands/health-checks/memory-check.d.ts.map +1 -0
- package/dist/commands/health-checks/memory-check.js +92 -0
- package/dist/commands/health-checks/memory-check.js.map +1 -0
- package/dist/commands/health-checks/runner.d.ts +9 -0
- package/dist/commands/health-checks/runner.d.ts.map +1 -0
- package/dist/commands/health-checks/runner.js +74 -0
- package/dist/commands/health-checks/runner.js.map +1 -0
- package/dist/commands/health-checks/tool-version-check.d.ts +9 -0
- package/dist/commands/health-checks/tool-version-check.d.ts.map +1 -0
- package/dist/commands/health-checks/tool-version-check.js +35 -0
- package/dist/commands/health-checks/tool-version-check.js.map +1 -0
- package/dist/commands/health-checks/types.d.ts +16 -0
- package/dist/commands/health-checks/types.d.ts.map +1 -0
- package/dist/commands/health-checks/types.js +2 -0
- package/dist/commands/health-checks/types.js.map +1 -0
- package/dist/commands/init.d.ts +120 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +436 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/init.test.d.ts +16 -0
- package/dist/commands/init.test.d.ts.map +1 -0
- package/dist/commands/init.test.js +286 -0
- package/dist/commands/init.test.js.map +1 -0
- package/dist/commands/marketplace.d.ts +13 -0
- package/dist/commands/marketplace.d.ts.map +1 -0
- package/dist/commands/marketplace.js +85 -0
- package/dist/commands/marketplace.js.map +1 -0
- package/dist/commands/marketplace.test.d.ts +2 -0
- package/dist/commands/marketplace.test.d.ts.map +1 -0
- package/dist/commands/marketplace.test.js +78 -0
- package/dist/commands/marketplace.test.js.map +1 -0
- package/dist/commands/migrate.d.ts +15 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +179 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/migrate.test.d.ts +2 -0
- package/dist/commands/migrate.test.d.ts.map +1 -0
- package/dist/commands/migrate.test.js +109 -0
- package/dist/commands/migrate.test.js.map +1 -0
- package/dist/commands/preset.d.ts +11 -0
- package/dist/commands/preset.d.ts.map +1 -0
- package/dist/commands/preset.js +99 -0
- package/dist/commands/preset.js.map +1 -0
- package/dist/commands/preset.test.d.ts +2 -0
- package/dist/commands/preset.test.d.ts.map +1 -0
- package/dist/commands/preset.test.js +106 -0
- package/dist/commands/preset.test.js.map +1 -0
- package/dist/commands/remote.d.ts +9 -0
- package/dist/commands/remote.d.ts.map +1 -0
- package/dist/commands/remote.js +212 -0
- package/dist/commands/remote.js.map +1 -0
- package/dist/commands/remote.test.d.ts +2 -0
- package/dist/commands/remote.test.d.ts.map +1 -0
- package/dist/commands/remote.test.js +125 -0
- package/dist/commands/remote.test.js.map +1 -0
- package/dist/commands/remove.d.ts +34 -0
- package/dist/commands/remove.d.ts.map +1 -0
- package/dist/commands/remove.js +296 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/commands/remove.test.d.ts +2 -0
- package/dist/commands/remove.test.d.ts.map +1 -0
- package/dist/commands/remove.test.js +109 -0
- package/dist/commands/remove.test.js.map +1 -0
- package/dist/commands/serve.d.ts +3 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +29 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/serve.test.d.ts +2 -0
- package/dist/commands/serve.test.d.ts.map +1 -0
- package/dist/commands/serve.test.js +74 -0
- package/dist/commands/serve.test.js.map +1 -0
- package/dist/commands/status.d.ts +49 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +272 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/status.test.d.ts +11 -0
- package/dist/commands/status.test.d.ts.map +1 -0
- package/dist/commands/status.test.js +334 -0
- package/dist/commands/status.test.js.map +1 -0
- package/dist/commands/sync.d.ts +38 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +286 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/sync.test.d.ts +6 -0
- package/dist/commands/sync.test.d.ts.map +1 -0
- package/dist/commands/sync.test.js +341 -0
- package/dist/commands/sync.test.js.map +1 -0
- package/dist/commands/teams.d.ts +18 -0
- package/dist/commands/teams.d.ts.map +1 -0
- package/dist/commands/teams.js +68 -0
- package/dist/commands/teams.js.map +1 -0
- package/dist/commands/teams.test.d.ts +2 -0
- package/dist/commands/teams.test.d.ts.map +1 -0
- package/dist/commands/teams.test.js +94 -0
- package/dist/commands/teams.test.js.map +1 -0
- package/dist/core/adapter-base.d.ts +51 -0
- package/dist/core/adapter-base.d.ts.map +1 -0
- package/dist/core/adapter-base.js +89 -0
- package/dist/core/adapter-base.js.map +1 -0
- package/dist/core/add-helpers.d.ts +55 -0
- package/dist/core/add-helpers.d.ts.map +1 -0
- package/dist/core/add-helpers.js +273 -0
- package/dist/core/add-helpers.js.map +1 -0
- package/dist/core/agent-teams.d.ts +10 -0
- package/dist/core/agent-teams.d.ts.map +1 -0
- package/dist/core/agent-teams.js +40 -0
- package/dist/core/agent-teams.js.map +1 -0
- package/dist/core/agent-teams.test.d.ts +2 -0
- package/dist/core/agent-teams.test.d.ts.map +1 -0
- package/dist/core/agent-teams.test.js +64 -0
- package/dist/core/agent-teams.test.js.map +1 -0
- package/dist/core/auto-adapter.d.ts +27 -0
- package/dist/core/auto-adapter.d.ts.map +1 -0
- package/dist/core/auto-adapter.js +324 -0
- package/dist/core/auto-adapter.js.map +1 -0
- package/dist/core/auto-adapter.test.d.ts +2 -0
- package/dist/core/auto-adapter.test.d.ts.map +1 -0
- package/dist/core/auto-adapter.test.js +125 -0
- package/dist/core/auto-adapter.test.js.map +1 -0
- package/dist/core/config-merger.d.ts +33 -0
- package/dist/core/config-merger.d.ts.map +1 -0
- package/dist/core/config-merger.js +238 -0
- package/dist/core/config-merger.js.map +1 -0
- package/dist/core/config-merger.test.d.ts +10 -0
- package/dist/core/config-merger.test.d.ts.map +1 -0
- package/dist/core/config-merger.test.js +406 -0
- package/dist/core/config-merger.test.js.map +1 -0
- package/dist/core/conflict-detector.d.ts +23 -0
- package/dist/core/conflict-detector.d.ts.map +1 -0
- package/dist/core/conflict-detector.js +58 -0
- package/dist/core/conflict-detector.js.map +1 -0
- package/dist/core/conflict-detector.test.d.ts +2 -0
- package/dist/core/conflict-detector.test.d.ts.map +1 -0
- package/dist/core/conflict-detector.test.js +40 -0
- package/dist/core/conflict-detector.test.js.map +1 -0
- package/dist/core/env-template.d.ts +22 -0
- package/dist/core/env-template.d.ts.map +1 -0
- package/dist/core/env-template.js +125 -0
- package/dist/core/env-template.js.map +1 -0
- package/dist/core/env-template.test.d.ts +2 -0
- package/dist/core/env-template.test.d.ts.map +1 -0
- package/dist/core/env-template.test.js +145 -0
- package/dist/core/env-template.test.js.map +1 -0
- package/dist/core/fs-helpers.d.ts +8 -0
- package/dist/core/fs-helpers.d.ts.map +1 -0
- package/dist/core/fs-helpers.js +26 -0
- package/dist/core/fs-helpers.js.map +1 -0
- package/dist/core/fs-helpers.test.d.ts +2 -0
- package/dist/core/fs-helpers.test.d.ts.map +1 -0
- package/dist/core/fs-helpers.test.js +51 -0
- package/dist/core/fs-helpers.test.js.map +1 -0
- package/dist/core/machine-overrides.d.ts +13 -0
- package/dist/core/machine-overrides.d.ts.map +1 -0
- package/dist/core/machine-overrides.js +155 -0
- package/dist/core/machine-overrides.js.map +1 -0
- package/dist/core/machine-overrides.test.d.ts +2 -0
- package/dist/core/machine-overrides.test.d.ts.map +1 -0
- package/dist/core/machine-overrides.test.js +160 -0
- package/dist/core/machine-overrides.test.js.map +1 -0
- package/dist/core/marketplace-registry.d.ts +14 -0
- package/dist/core/marketplace-registry.d.ts.map +1 -0
- package/dist/core/marketplace-registry.js +215 -0
- package/dist/core/marketplace-registry.js.map +1 -0
- package/dist/core/marketplace-registry.test.d.ts +2 -0
- package/dist/core/marketplace-registry.test.d.ts.map +1 -0
- package/dist/core/marketplace-registry.test.js +232 -0
- package/dist/core/marketplace-registry.test.js.map +1 -0
- package/dist/core/marketplace-sources.d.ts +39 -0
- package/dist/core/marketplace-sources.d.ts.map +1 -0
- package/dist/core/marketplace-sources.js +199 -0
- package/dist/core/marketplace-sources.js.map +1 -0
- package/dist/core/marketplace.d.ts +18 -0
- package/dist/core/marketplace.d.ts.map +1 -0
- package/dist/core/marketplace.js +211 -0
- package/dist/core/marketplace.js.map +1 -0
- package/dist/core/marketplace.test.d.ts +2 -0
- package/dist/core/marketplace.test.d.ts.map +1 -0
- package/dist/core/marketplace.test.js +177 -0
- package/dist/core/marketplace.test.js.map +1 -0
- package/dist/core/mcp-injector.d.ts +43 -0
- package/dist/core/mcp-injector.d.ts.map +1 -0
- package/dist/core/mcp-injector.js +164 -0
- package/dist/core/mcp-injector.js.map +1 -0
- package/dist/core/mcp-injector.test.d.ts +6 -0
- package/dist/core/mcp-injector.test.d.ts.map +1 -0
- package/dist/core/mcp-injector.test.js +315 -0
- package/dist/core/mcp-injector.test.js.map +1 -0
- package/dist/core/mcp-registry.d.ts +17 -0
- package/dist/core/mcp-registry.d.ts.map +1 -0
- package/dist/core/mcp-registry.js +52 -0
- package/dist/core/mcp-registry.js.map +1 -0
- package/dist/core/mcp-registry.test.d.ts +2 -0
- package/dist/core/mcp-registry.test.d.ts.map +1 -0
- package/dist/core/mcp-registry.test.js +78 -0
- package/dist/core/mcp-registry.test.js.map +1 -0
- package/dist/core/mcp-router.d.ts +21 -0
- package/dist/core/mcp-router.d.ts.map +1 -0
- package/dist/core/mcp-router.js +67 -0
- package/dist/core/mcp-router.js.map +1 -0
- package/dist/core/mcp-router.test.d.ts +2 -0
- package/dist/core/mcp-router.test.d.ts.map +1 -0
- package/dist/core/mcp-router.test.js +40 -0
- package/dist/core/mcp-router.test.js.map +1 -0
- package/dist/core/memory-scoper.d.ts +43 -0
- package/dist/core/memory-scoper.d.ts.map +1 -0
- package/dist/core/memory-scoper.js +165 -0
- package/dist/core/memory-scoper.js.map +1 -0
- package/dist/core/memory-scoper.test.d.ts +6 -0
- package/dist/core/memory-scoper.test.d.ts.map +1 -0
- package/dist/core/memory-scoper.test.js +467 -0
- package/dist/core/memory-scoper.test.js.map +1 -0
- package/dist/core/migrator/executor.d.ts +9 -0
- package/dist/core/migrator/executor.d.ts.map +1 -0
- package/dist/core/migrator/executor.js +233 -0
- package/dist/core/migrator/executor.js.map +1 -0
- package/dist/core/migrator/index.d.ts +8 -0
- package/dist/core/migrator/index.d.ts.map +1 -0
- package/dist/core/migrator/index.js +12 -0
- package/dist/core/migrator/index.js.map +1 -0
- package/dist/core/migrator/manifest.d.ts +8 -0
- package/dist/core/migrator/manifest.d.ts.map +1 -0
- package/dist/core/migrator/manifest.js +83 -0
- package/dist/core/migrator/manifest.js.map +1 -0
- package/dist/core/migrator/planner.d.ts +6 -0
- package/dist/core/migrator/planner.d.ts.map +1 -0
- package/dist/core/migrator/planner.js +112 -0
- package/dist/core/migrator/planner.js.map +1 -0
- package/dist/core/migrator/scanners.d.ts +19 -0
- package/dist/core/migrator/scanners.d.ts.map +1 -0
- package/dist/core/migrator/scanners.js +612 -0
- package/dist/core/migrator/scanners.js.map +1 -0
- package/dist/core/migrator/scanners.test.d.ts +2 -0
- package/dist/core/migrator/scanners.test.d.ts.map +1 -0
- package/dist/core/migrator/scanners.test.js +257 -0
- package/dist/core/migrator/scanners.test.js.map +1 -0
- package/dist/core/migrator.test.d.ts +2 -0
- package/dist/core/migrator.test.d.ts.map +1 -0
- package/dist/core/migrator.test.js +451 -0
- package/dist/core/migrator.test.js.map +1 -0
- package/dist/core/plugin-scanner.d.ts +30 -0
- package/dist/core/plugin-scanner.d.ts.map +1 -0
- package/dist/core/plugin-scanner.js +174 -0
- package/dist/core/plugin-scanner.js.map +1 -0
- package/dist/core/plugin-scanner.test.d.ts +2 -0
- package/dist/core/plugin-scanner.test.d.ts.map +1 -0
- package/dist/core/plugin-scanner.test.js +279 -0
- package/dist/core/plugin-scanner.test.js.map +1 -0
- package/dist/core/presets.d.ts +55 -0
- package/dist/core/presets.d.ts.map +1 -0
- package/dist/core/presets.js +84 -0
- package/dist/core/presets.js.map +1 -0
- package/dist/core/presets.test.d.ts +2 -0
- package/dist/core/presets.test.d.ts.map +1 -0
- package/dist/core/presets.test.js +40 -0
- package/dist/core/presets.test.js.map +1 -0
- package/dist/core/skill-parser.d.ts +21 -0
- package/dist/core/skill-parser.d.ts.map +1 -0
- package/dist/core/skill-parser.js +53 -0
- package/dist/core/skill-parser.js.map +1 -0
- package/dist/core/skill-parser.test.d.ts +2 -0
- package/dist/core/skill-parser.test.d.ts.map +1 -0
- package/dist/core/skill-parser.test.js +83 -0
- package/dist/core/skill-parser.test.js.map +1 -0
- package/dist/core/smart-memory.d.ts +22 -0
- package/dist/core/smart-memory.d.ts.map +1 -0
- package/dist/core/smart-memory.js +72 -0
- package/dist/core/smart-memory.js.map +1 -0
- package/dist/core/smart-memory.test.d.ts +2 -0
- package/dist/core/smart-memory.test.d.ts.map +1 -0
- package/dist/core/smart-memory.test.js +114 -0
- package/dist/core/smart-memory.test.js.map +1 -0
- package/dist/core/snapshot.d.ts +6 -0
- package/dist/core/snapshot.d.ts.map +1 -0
- package/dist/core/snapshot.js +179 -0
- package/dist/core/snapshot.js.map +1 -0
- package/dist/core/snapshot.test.d.ts +2 -0
- package/dist/core/snapshot.test.d.ts.map +1 -0
- package/dist/core/snapshot.test.js +132 -0
- package/dist/core/snapshot.test.js.map +1 -0
- package/dist/core/symlink-manager.d.ts +78 -0
- package/dist/core/symlink-manager.d.ts.map +1 -0
- package/dist/core/symlink-manager.js +227 -0
- package/dist/core/symlink-manager.js.map +1 -0
- package/dist/core/symlink-manager.test.d.ts +8 -0
- package/dist/core/symlink-manager.test.d.ts.map +1 -0
- package/dist/core/symlink-manager.test.js +354 -0
- package/dist/core/symlink-manager.test.js.map +1 -0
- package/dist/core/sync-writer.d.ts +20 -0
- package/dist/core/sync-writer.d.ts.map +1 -0
- package/dist/core/sync-writer.js +150 -0
- package/dist/core/sync-writer.js.map +1 -0
- package/dist/core/sync-writer.test.d.ts +2 -0
- package/dist/core/sync-writer.test.d.ts.map +1 -0
- package/dist/core/sync-writer.test.js +134 -0
- package/dist/core/sync-writer.test.js.map +1 -0
- package/dist/core/toml-helpers.d.ts +9 -0
- package/dist/core/toml-helpers.d.ts.map +1 -0
- package/dist/core/toml-helpers.js +33 -0
- package/dist/core/toml-helpers.js.map +1 -0
- package/dist/core/tool-adapter.d.ts +24 -0
- package/dist/core/tool-adapter.d.ts.map +1 -0
- package/dist/core/tool-adapter.js +156 -0
- package/dist/core/tool-adapter.js.map +1 -0
- package/dist/core/tool-adapter.test.d.ts +2 -0
- package/dist/core/tool-adapter.test.d.ts.map +1 -0
- package/dist/core/tool-adapter.test.js +264 -0
- package/dist/core/tool-adapter.test.js.map +1 -0
- package/dist/core/tool-detector.d.ts +31 -0
- package/dist/core/tool-detector.d.ts.map +1 -0
- package/dist/core/tool-detector.js +67 -0
- package/dist/core/tool-detector.js.map +1 -0
- package/dist/core/tool-detector.test.d.ts +2 -0
- package/dist/core/tool-detector.test.d.ts.map +1 -0
- package/dist/core/tool-detector.test.js +126 -0
- package/dist/core/tool-detector.test.js.map +1 -0
- package/dist/core/watcher.d.ts +22 -0
- package/dist/core/watcher.d.ts.map +1 -0
- package/dist/core/watcher.js +68 -0
- package/dist/core/watcher.js.map +1 -0
- package/dist/core/watcher.test.d.ts +2 -0
- package/dist/core/watcher.test.d.ts.map +1 -0
- package/dist/core/watcher.test.js +26 -0
- package/dist/core/watcher.test.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/routes/async-handler.d.ts +6 -0
- package/dist/routes/async-handler.d.ts.map +1 -0
- package/dist/routes/async-handler.js +9 -0
- package/dist/routes/async-handler.js.map +1 -0
- package/dist/routes/marketplace.d.ts +3 -0
- package/dist/routes/marketplace.d.ts.map +1 -0
- package/dist/routes/marketplace.js +51 -0
- package/dist/routes/marketplace.js.map +1 -0
- package/dist/routes/migrate.d.ts +3 -0
- package/dist/routes/migrate.d.ts.map +1 -0
- package/dist/routes/migrate.js +22 -0
- package/dist/routes/migrate.js.map +1 -0
- package/dist/routes/plugin-map.d.ts +11 -0
- package/dist/routes/plugin-map.d.ts.map +1 -0
- package/dist/routes/plugin-map.js +37 -0
- package/dist/routes/plugin-map.js.map +1 -0
- package/dist/routes/plugins.d.ts +3 -0
- package/dist/routes/plugins.d.ts.map +1 -0
- package/dist/routes/plugins.js +51 -0
- package/dist/routes/plugins.js.map +1 -0
- package/dist/routes/remove.d.ts +3 -0
- package/dist/routes/remove.d.ts.map +1 -0
- package/dist/routes/remove.js +27 -0
- package/dist/routes/remove.js.map +1 -0
- package/dist/routes/state.d.ts +3 -0
- package/dist/routes/state.d.ts.map +1 -0
- package/dist/routes/state.js +177 -0
- package/dist/routes/state.js.map +1 -0
- package/dist/routes/sync.d.ts +3 -0
- package/dist/routes/sync.d.ts.map +1 -0
- package/dist/routes/sync.js +12 -0
- package/dist/routes/sync.js.map +1 -0
- package/dist/server.d.ts +4 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +59 -0
- package/dist/server.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for symlink-manager - written FIRST following TDD
|
|
3
|
+
*
|
|
4
|
+
* The symlink-manager module handles creating/removing symlinks
|
|
5
|
+
* from the global skills directory to tool-specific directories.
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=symlink-manager.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symlink-manager.test.d.ts","sourceRoot":"","sources":["../../src/core/symlink-manager.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for symlink-manager - written FIRST following TDD
|
|
3
|
+
*
|
|
4
|
+
* The symlink-manager module handles creating/removing symlinks
|
|
5
|
+
* from the global skills directory to tool-specific directories.
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
8
|
+
import * as fs from "node:fs/promises";
|
|
9
|
+
// Tests define the API we want - implementation comes after
|
|
10
|
+
const testDir = `/tmp/mycelium-symlink-test-${Date.now()}`;
|
|
11
|
+
const globalSkillsDir = `${testDir}/global/skills`;
|
|
12
|
+
const toolSkillsDir = `${testDir}/tool/skills`;
|
|
13
|
+
describe("symlink-manager", () => {
|
|
14
|
+
beforeEach(async () => {
|
|
15
|
+
// Create test directories
|
|
16
|
+
await fs.mkdir(globalSkillsDir, { recursive: true });
|
|
17
|
+
await fs.mkdir(toolSkillsDir, { recursive: true });
|
|
18
|
+
});
|
|
19
|
+
afterEach(async () => {
|
|
20
|
+
// Clean up test directories
|
|
21
|
+
try {
|
|
22
|
+
await fs.rm(testDir, { recursive: true, force: true });
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// Ignore cleanup errors
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
describe("createSkillSymlink", () => {
|
|
29
|
+
it("creates symlink from skill to tool directory", async () => {
|
|
30
|
+
const { createSkillSymlink } = await import("./symlink-manager.js");
|
|
31
|
+
// Create a skill directory in global location
|
|
32
|
+
const skillPath = `${globalSkillsDir}/my-skill`;
|
|
33
|
+
await fs.mkdir(skillPath, { recursive: true });
|
|
34
|
+
await fs.writeFile(`${skillPath}/skill.md`, "# My Skill");
|
|
35
|
+
// Create symlink in tool directory
|
|
36
|
+
const symlinkPath = `${toolSkillsDir}/my-skill`;
|
|
37
|
+
const result = await createSkillSymlink(skillPath, symlinkPath);
|
|
38
|
+
expect(result.success).toBe(true);
|
|
39
|
+
expect(result.action).toBe("created");
|
|
40
|
+
// Verify symlink exists and points to correct target
|
|
41
|
+
const stats = await fs.lstat(symlinkPath);
|
|
42
|
+
expect(stats.isSymbolicLink()).toBe(true);
|
|
43
|
+
const linkTarget = await fs.readlink(symlinkPath);
|
|
44
|
+
expect(linkTarget).toBe(skillPath);
|
|
45
|
+
});
|
|
46
|
+
it("updates existing symlink if target changed", async () => {
|
|
47
|
+
const { createSkillSymlink } = await import("./symlink-manager.js");
|
|
48
|
+
// Create two skill directories
|
|
49
|
+
const oldSkillPath = `${globalSkillsDir}/old-skill`;
|
|
50
|
+
const newSkillPath = `${globalSkillsDir}/new-skill`;
|
|
51
|
+
await fs.mkdir(oldSkillPath, { recursive: true });
|
|
52
|
+
await fs.mkdir(newSkillPath, { recursive: true });
|
|
53
|
+
// Create initial symlink to old skill
|
|
54
|
+
const symlinkPath = `${toolSkillsDir}/my-skill`;
|
|
55
|
+
await fs.symlink(oldSkillPath, symlinkPath);
|
|
56
|
+
// Update symlink to new skill
|
|
57
|
+
const result = await createSkillSymlink(newSkillPath, symlinkPath);
|
|
58
|
+
expect(result.success).toBe(true);
|
|
59
|
+
expect(result.action).toBe("updated");
|
|
60
|
+
// Verify symlink now points to new target
|
|
61
|
+
const linkTarget = await fs.readlink(symlinkPath);
|
|
62
|
+
expect(linkTarget).toBe(newSkillPath);
|
|
63
|
+
});
|
|
64
|
+
it("does nothing if symlink already points to correct target", async () => {
|
|
65
|
+
const { createSkillSymlink } = await import("./symlink-manager.js");
|
|
66
|
+
// Create skill directory
|
|
67
|
+
const skillPath = `${globalSkillsDir}/my-skill`;
|
|
68
|
+
await fs.mkdir(skillPath, { recursive: true });
|
|
69
|
+
// Create existing correct symlink
|
|
70
|
+
const symlinkPath = `${toolSkillsDir}/my-skill`;
|
|
71
|
+
await fs.symlink(skillPath, symlinkPath);
|
|
72
|
+
// Try to create same symlink
|
|
73
|
+
const result = await createSkillSymlink(skillPath, symlinkPath);
|
|
74
|
+
expect(result.success).toBe(true);
|
|
75
|
+
expect(result.action).toBe("unchanged");
|
|
76
|
+
});
|
|
77
|
+
it("handles non-symlink file by backing up and replacing", async () => {
|
|
78
|
+
const { createSkillSymlink } = await import("./symlink-manager.js");
|
|
79
|
+
// Create skill directory
|
|
80
|
+
const skillPath = `${globalSkillsDir}/my-skill`;
|
|
81
|
+
await fs.mkdir(skillPath, { recursive: true });
|
|
82
|
+
// Create a regular file where symlink should be
|
|
83
|
+
const symlinkPath = `${toolSkillsDir}/my-skill`;
|
|
84
|
+
await fs.writeFile(symlinkPath, "existing content");
|
|
85
|
+
// Create symlink (should backup existing file)
|
|
86
|
+
const result = await createSkillSymlink(skillPath, symlinkPath);
|
|
87
|
+
expect(result.success).toBe(true);
|
|
88
|
+
expect(result.action).toBe("replaced");
|
|
89
|
+
expect(result.backupPath).toBeDefined();
|
|
90
|
+
// Verify symlink was created
|
|
91
|
+
const stats = await fs.lstat(symlinkPath);
|
|
92
|
+
expect(stats.isSymbolicLink()).toBe(true);
|
|
93
|
+
// Verify backup exists
|
|
94
|
+
const backupExists = await fs.access(result.backupPath).then(() => true).catch(() => false);
|
|
95
|
+
expect(backupExists).toBe(true);
|
|
96
|
+
});
|
|
97
|
+
it("handles non-symlink directory by backing up and replacing", async () => {
|
|
98
|
+
const { createSkillSymlink } = await import("./symlink-manager.js");
|
|
99
|
+
// Create skill directory
|
|
100
|
+
const skillPath = `${globalSkillsDir}/my-skill`;
|
|
101
|
+
await fs.mkdir(skillPath, { recursive: true });
|
|
102
|
+
// Create a regular directory where symlink should be
|
|
103
|
+
const symlinkPath = `${toolSkillsDir}/my-skill`;
|
|
104
|
+
await fs.mkdir(symlinkPath, { recursive: true });
|
|
105
|
+
await fs.writeFile(`${symlinkPath}/existing.txt`, "content");
|
|
106
|
+
// Create symlink (should backup existing directory)
|
|
107
|
+
const result = await createSkillSymlink(skillPath, symlinkPath);
|
|
108
|
+
expect(result.success).toBe(true);
|
|
109
|
+
expect(result.action).toBe("replaced");
|
|
110
|
+
expect(result.backupPath).toBeDefined();
|
|
111
|
+
// Verify symlink was created
|
|
112
|
+
const stats = await fs.lstat(symlinkPath);
|
|
113
|
+
expect(stats.isSymbolicLink()).toBe(true);
|
|
114
|
+
// Verify backup exists and contains original file
|
|
115
|
+
const backupFile = `${result.backupPath}/existing.txt`;
|
|
116
|
+
const backupContent = await fs.readFile(backupFile, "utf-8");
|
|
117
|
+
expect(backupContent).toBe("content");
|
|
118
|
+
});
|
|
119
|
+
it("creates parent directory if it does not exist", async () => {
|
|
120
|
+
const { createSkillSymlink } = await import("./symlink-manager.js");
|
|
121
|
+
// Create skill directory
|
|
122
|
+
const skillPath = `${globalSkillsDir}/my-skill`;
|
|
123
|
+
await fs.mkdir(skillPath, { recursive: true });
|
|
124
|
+
// Target in non-existent parent directory
|
|
125
|
+
const symlinkPath = `${toolSkillsDir}/nested/path/my-skill`;
|
|
126
|
+
const result = await createSkillSymlink(skillPath, symlinkPath);
|
|
127
|
+
expect(result.success).toBe(true);
|
|
128
|
+
expect(result.action).toBe("created");
|
|
129
|
+
// Verify symlink exists
|
|
130
|
+
const stats = await fs.lstat(symlinkPath);
|
|
131
|
+
expect(stats.isSymbolicLink()).toBe(true);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
describe("removeSkillSymlink", () => {
|
|
135
|
+
it("removes symlink for disabled skill", async () => {
|
|
136
|
+
const { removeSkillSymlink } = await import("./symlink-manager.js");
|
|
137
|
+
// Create skill directory and symlink
|
|
138
|
+
const skillPath = `${globalSkillsDir}/my-skill`;
|
|
139
|
+
await fs.mkdir(skillPath, { recursive: true });
|
|
140
|
+
const symlinkPath = `${toolSkillsDir}/my-skill`;
|
|
141
|
+
await fs.symlink(skillPath, symlinkPath);
|
|
142
|
+
// Remove symlink
|
|
143
|
+
const result = await removeSkillSymlink(symlinkPath);
|
|
144
|
+
expect(result.success).toBe(true);
|
|
145
|
+
expect(result.existed).toBe(true);
|
|
146
|
+
// Verify symlink no longer exists
|
|
147
|
+
const exists = await fs.access(symlinkPath).then(() => true).catch(() => false);
|
|
148
|
+
expect(exists).toBe(false);
|
|
149
|
+
});
|
|
150
|
+
it("returns success even if symlink does not exist", async () => {
|
|
151
|
+
const { removeSkillSymlink } = await import("./symlink-manager.js");
|
|
152
|
+
const symlinkPath = `${toolSkillsDir}/nonexistent`;
|
|
153
|
+
const result = await removeSkillSymlink(symlinkPath);
|
|
154
|
+
expect(result.success).toBe(true);
|
|
155
|
+
expect(result.existed).toBe(false);
|
|
156
|
+
});
|
|
157
|
+
it("does not remove regular files (only symlinks)", async () => {
|
|
158
|
+
const { removeSkillSymlink } = await import("./symlink-manager.js");
|
|
159
|
+
// Create a regular file
|
|
160
|
+
const filePath = `${toolSkillsDir}/regular-file`;
|
|
161
|
+
await fs.writeFile(filePath, "content");
|
|
162
|
+
const result = await removeSkillSymlink(filePath);
|
|
163
|
+
expect(result.success).toBe(false);
|
|
164
|
+
expect(result.error).toContain("not a symlink");
|
|
165
|
+
// Verify file still exists
|
|
166
|
+
const exists = await fs.access(filePath).then(() => true).catch(() => false);
|
|
167
|
+
expect(exists).toBe(true);
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
describe("isSymlinkValid", () => {
|
|
171
|
+
it("returns true if symlink points to correct target", async () => {
|
|
172
|
+
const { isSymlinkValid } = await import("./symlink-manager.js");
|
|
173
|
+
// Create skill directory and symlink
|
|
174
|
+
const skillPath = `${globalSkillsDir}/my-skill`;
|
|
175
|
+
await fs.mkdir(skillPath, { recursive: true });
|
|
176
|
+
const symlinkPath = `${toolSkillsDir}/my-skill`;
|
|
177
|
+
await fs.symlink(skillPath, symlinkPath);
|
|
178
|
+
const result = await isSymlinkValid(symlinkPath, skillPath);
|
|
179
|
+
expect(result.valid).toBe(true);
|
|
180
|
+
expect(result.currentTarget).toBe(skillPath);
|
|
181
|
+
});
|
|
182
|
+
it("returns false if symlink points to different target", async () => {
|
|
183
|
+
const { isSymlinkValid } = await import("./symlink-manager.js");
|
|
184
|
+
// Create two skill directories
|
|
185
|
+
const actualSkillPath = `${globalSkillsDir}/actual-skill`;
|
|
186
|
+
const expectedSkillPath = `${globalSkillsDir}/expected-skill`;
|
|
187
|
+
await fs.mkdir(actualSkillPath, { recursive: true });
|
|
188
|
+
await fs.mkdir(expectedSkillPath, { recursive: true });
|
|
189
|
+
// Create symlink to actual skill
|
|
190
|
+
const symlinkPath = `${toolSkillsDir}/my-skill`;
|
|
191
|
+
await fs.symlink(actualSkillPath, symlinkPath);
|
|
192
|
+
// Check against expected skill
|
|
193
|
+
const result = await isSymlinkValid(symlinkPath, expectedSkillPath);
|
|
194
|
+
expect(result.valid).toBe(false);
|
|
195
|
+
expect(result.currentTarget).toBe(actualSkillPath);
|
|
196
|
+
expect(result.expectedTarget).toBe(expectedSkillPath);
|
|
197
|
+
});
|
|
198
|
+
it("returns false if path is not a symlink", async () => {
|
|
199
|
+
const { isSymlinkValid } = await import("./symlink-manager.js");
|
|
200
|
+
// Create regular file
|
|
201
|
+
const filePath = `${toolSkillsDir}/regular-file`;
|
|
202
|
+
await fs.writeFile(filePath, "content");
|
|
203
|
+
const result = await isSymlinkValid(filePath, globalSkillsDir);
|
|
204
|
+
expect(result.valid).toBe(false);
|
|
205
|
+
expect(result.isSymlink).toBe(false);
|
|
206
|
+
});
|
|
207
|
+
it("returns false if path does not exist", async () => {
|
|
208
|
+
const { isSymlinkValid } = await import("./symlink-manager.js");
|
|
209
|
+
const symlinkPath = `${toolSkillsDir}/nonexistent`;
|
|
210
|
+
const result = await isSymlinkValid(symlinkPath, globalSkillsDir);
|
|
211
|
+
expect(result.valid).toBe(false);
|
|
212
|
+
expect(result.exists).toBe(false);
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
describe("getSymlinkStatus", () => {
|
|
216
|
+
it("returns status of skill symlinks for a tool", async () => {
|
|
217
|
+
const { getSymlinkStatus } = await import("./symlink-manager.js");
|
|
218
|
+
// Create two skills
|
|
219
|
+
const skill1Path = `${globalSkillsDir}/skill1`;
|
|
220
|
+
const skill2Path = `${globalSkillsDir}/skill2`;
|
|
221
|
+
await fs.mkdir(skill1Path, { recursive: true });
|
|
222
|
+
await fs.mkdir(skill2Path, { recursive: true });
|
|
223
|
+
// Create symlink only for skill1
|
|
224
|
+
await fs.symlink(skill1Path, `${toolSkillsDir}/skill1`);
|
|
225
|
+
const skills = [
|
|
226
|
+
{ name: "skill1", path: skill1Path, manifest: { name: "skill1" } },
|
|
227
|
+
{ name: "skill2", path: skill2Path, manifest: { name: "skill2" } },
|
|
228
|
+
];
|
|
229
|
+
const status = await getSymlinkStatus(skills, toolSkillsDir);
|
|
230
|
+
expect(status).toHaveLength(2);
|
|
231
|
+
const skill1Status = status.find(s => s.skillName === "skill1");
|
|
232
|
+
expect(skill1Status?.exists).toBe(true);
|
|
233
|
+
expect(skill1Status?.valid).toBe(true);
|
|
234
|
+
const skill2Status = status.find(s => s.skillName === "skill2");
|
|
235
|
+
expect(skill2Status?.exists).toBe(false);
|
|
236
|
+
expect(skill2Status?.valid).toBe(false);
|
|
237
|
+
});
|
|
238
|
+
it("detects invalid symlinks pointing to wrong target", async () => {
|
|
239
|
+
const { getSymlinkStatus } = await import("./symlink-manager.js");
|
|
240
|
+
// Create two skills
|
|
241
|
+
const skill1Path = `${globalSkillsDir}/skill1`;
|
|
242
|
+
const skill2Path = `${globalSkillsDir}/skill2`;
|
|
243
|
+
await fs.mkdir(skill1Path, { recursive: true });
|
|
244
|
+
await fs.mkdir(skill2Path, { recursive: true });
|
|
245
|
+
// Create symlink pointing to wrong skill
|
|
246
|
+
await fs.symlink(skill2Path, `${toolSkillsDir}/skill1`);
|
|
247
|
+
const skills = [
|
|
248
|
+
{ name: "skill1", path: skill1Path, manifest: { name: "skill1" } },
|
|
249
|
+
];
|
|
250
|
+
const status = await getSymlinkStatus(skills, toolSkillsDir);
|
|
251
|
+
expect(status).toHaveLength(1);
|
|
252
|
+
expect(status[0].exists).toBe(true);
|
|
253
|
+
expect(status[0].valid).toBe(false);
|
|
254
|
+
expect(status[0].currentTarget).toBe(skill2Path);
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
describe("syncSkillsToTool", () => {
|
|
258
|
+
it("syncs all skills to a specific tool directory", async () => {
|
|
259
|
+
const { syncSkillsToTool } = await import("./symlink-manager.js");
|
|
260
|
+
// Create skills
|
|
261
|
+
const skill1Path = `${globalSkillsDir}/skill1`;
|
|
262
|
+
const skill2Path = `${globalSkillsDir}/skill2`;
|
|
263
|
+
await fs.mkdir(skill1Path, { recursive: true });
|
|
264
|
+
await fs.mkdir(skill2Path, { recursive: true });
|
|
265
|
+
const skills = [
|
|
266
|
+
{ name: "skill1", path: skill1Path, manifest: { name: "skill1", enabled: true } },
|
|
267
|
+
{ name: "skill2", path: skill2Path, manifest: { name: "skill2", enabled: true } },
|
|
268
|
+
];
|
|
269
|
+
const result = await syncSkillsToTool(skills, toolSkillsDir);
|
|
270
|
+
expect(result.success).toBe(true);
|
|
271
|
+
expect(result.created).toHaveLength(2);
|
|
272
|
+
expect(result.updated).toHaveLength(0);
|
|
273
|
+
expect(result.removed).toHaveLength(0);
|
|
274
|
+
expect(result.errors).toHaveLength(0);
|
|
275
|
+
// Verify symlinks were created
|
|
276
|
+
const skill1Symlink = `${toolSkillsDir}/skill1`;
|
|
277
|
+
const skill2Symlink = `${toolSkillsDir}/skill2`;
|
|
278
|
+
const stats1 = await fs.lstat(skill1Symlink);
|
|
279
|
+
const stats2 = await fs.lstat(skill2Symlink);
|
|
280
|
+
expect(stats1.isSymbolicLink()).toBe(true);
|
|
281
|
+
expect(stats2.isSymbolicLink()).toBe(true);
|
|
282
|
+
});
|
|
283
|
+
it("removes symlinks for disabled skills", async () => {
|
|
284
|
+
const { syncSkillsToTool } = await import("./symlink-manager.js");
|
|
285
|
+
// Create skill
|
|
286
|
+
const skillPath = `${globalSkillsDir}/my-skill`;
|
|
287
|
+
await fs.mkdir(skillPath, { recursive: true });
|
|
288
|
+
// Create existing symlink
|
|
289
|
+
const symlinkPath = `${toolSkillsDir}/my-skill`;
|
|
290
|
+
await fs.symlink(skillPath, symlinkPath);
|
|
291
|
+
// Sync with disabled skill
|
|
292
|
+
const skills = [
|
|
293
|
+
{ name: "my-skill", path: skillPath, manifest: { name: "my-skill", enabled: false } },
|
|
294
|
+
];
|
|
295
|
+
const result = await syncSkillsToTool(skills, toolSkillsDir);
|
|
296
|
+
expect(result.success).toBe(true);
|
|
297
|
+
expect(result.created).toHaveLength(0);
|
|
298
|
+
expect(result.removed).toContain("my-skill");
|
|
299
|
+
// Verify symlink was removed
|
|
300
|
+
const exists = await fs.access(symlinkPath).then(() => true).catch(() => false);
|
|
301
|
+
expect(exists).toBe(false);
|
|
302
|
+
});
|
|
303
|
+
it("updates symlinks when target changes", async () => {
|
|
304
|
+
const { syncSkillsToTool } = await import("./symlink-manager.js");
|
|
305
|
+
// Create skills
|
|
306
|
+
const oldSkillPath = `${globalSkillsDir}/old-location`;
|
|
307
|
+
const newSkillPath = `${globalSkillsDir}/new-location`;
|
|
308
|
+
await fs.mkdir(oldSkillPath, { recursive: true });
|
|
309
|
+
await fs.mkdir(newSkillPath, { recursive: true });
|
|
310
|
+
// Create symlink to old location
|
|
311
|
+
const symlinkPath = `${toolSkillsDir}/my-skill`;
|
|
312
|
+
await fs.symlink(oldSkillPath, symlinkPath);
|
|
313
|
+
// Sync with new location
|
|
314
|
+
const skills = [
|
|
315
|
+
{ name: "my-skill", path: newSkillPath, manifest: { name: "my-skill", enabled: true } },
|
|
316
|
+
];
|
|
317
|
+
const result = await syncSkillsToTool(skills, toolSkillsDir);
|
|
318
|
+
expect(result.success).toBe(true);
|
|
319
|
+
expect(result.updated).toContain("my-skill");
|
|
320
|
+
// Verify symlink points to new location
|
|
321
|
+
const target = await fs.readlink(symlinkPath);
|
|
322
|
+
expect(target).toBe(newSkillPath);
|
|
323
|
+
});
|
|
324
|
+
it("removes orphaned symlinks not in skill list", async () => {
|
|
325
|
+
const { syncSkillsToTool } = await import("./symlink-manager.js");
|
|
326
|
+
// Create skill
|
|
327
|
+
const skillPath = `${globalSkillsDir}/my-skill`;
|
|
328
|
+
await fs.mkdir(skillPath, { recursive: true });
|
|
329
|
+
// Create orphaned symlink (not in skill list)
|
|
330
|
+
const orphanedPath = `${toolSkillsDir}/orphaned-skill`;
|
|
331
|
+
await fs.symlink(skillPath, orphanedPath);
|
|
332
|
+
// Sync with empty skill list
|
|
333
|
+
const result = await syncSkillsToTool([], toolSkillsDir, { removeOrphans: true });
|
|
334
|
+
expect(result.success).toBe(true);
|
|
335
|
+
expect(result.removed).toContain("orphaned-skill");
|
|
336
|
+
// Verify orphaned symlink was removed
|
|
337
|
+
const exists = await fs.access(orphanedPath).then(() => true).catch(() => false);
|
|
338
|
+
expect(exists).toBe(false);
|
|
339
|
+
});
|
|
340
|
+
it("preserves non-symlink files in tool directory", async () => {
|
|
341
|
+
const { syncSkillsToTool } = await import("./symlink-manager.js");
|
|
342
|
+
// Create a non-symlink file in tool directory
|
|
343
|
+
const regularFile = `${toolSkillsDir}/README.md`;
|
|
344
|
+
await fs.writeFile(regularFile, "# Skills");
|
|
345
|
+
// Sync with empty skill list
|
|
346
|
+
const result = await syncSkillsToTool([], toolSkillsDir, { removeOrphans: true });
|
|
347
|
+
expect(result.success).toBe(true);
|
|
348
|
+
// Verify regular file was preserved
|
|
349
|
+
const content = await fs.readFile(regularFile, "utf-8");
|
|
350
|
+
expect(content).toBe("# Skills");
|
|
351
|
+
});
|
|
352
|
+
});
|
|
353
|
+
});
|
|
354
|
+
//# sourceMappingURL=symlink-manager.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symlink-manager.test.js","sourceRoot":"","sources":["../../src/core/symlink-manager.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { McpServerConfig, ScannedHook } from "@mycelish/core";
|
|
2
|
+
export interface SyncWriteResult {
|
|
3
|
+
configPath: string;
|
|
4
|
+
backupPath: string;
|
|
5
|
+
sectionsUpdated: string[];
|
|
6
|
+
success: boolean;
|
|
7
|
+
error?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function backupConfig(configPath: string): Promise<string>;
|
|
10
|
+
export declare function restoreBackups(): Promise<{
|
|
11
|
+
restored: string[];
|
|
12
|
+
errors: string[];
|
|
13
|
+
}>;
|
|
14
|
+
export declare function syncToTool(toolId: string, mcps: Record<string, McpServerConfig>, hooks?: ScannedHook[]): Promise<SyncWriteResult>;
|
|
15
|
+
export declare function dryRunSync(toolId: string, mcps: Record<string, McpServerConfig>): Promise<{
|
|
16
|
+
configPath: string;
|
|
17
|
+
currentContent: string | null;
|
|
18
|
+
newContent: string;
|
|
19
|
+
}>;
|
|
20
|
+
//# sourceMappingURL=sync-writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-writer.d.ts","sourceRoot":"","sources":["../../src/core/sync-writer.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AASnE,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAItE;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAgCxF;AAOD,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EACrC,KAAK,CAAC,EAAE,WAAW,EAAE,GACpB,OAAO,CAAC,eAAe,CAAC,CA2B1B;AA2BD,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GACpC,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAgDpF"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sync Writer — pushes mycelium config INTO tool config files (reverse of migration).
|
|
3
|
+
* Section-only replace: only touch MCP/skills/hooks sections, preserve everything else.
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from "node:fs/promises";
|
|
6
|
+
import * as path from "node:path";
|
|
7
|
+
import { TOOL_REGISTRY, resolvePath, expandPath } from "@mycelish/core";
|
|
8
|
+
import { readFileIfExists, mkdirp } from "./fs-helpers.js";
|
|
9
|
+
import { getAdapter } from "./tool-adapter.js";
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Backup / Restore
|
|
12
|
+
// ============================================================================
|
|
13
|
+
export async function backupConfig(configPath) {
|
|
14
|
+
const backupPath = `${configPath}.mycelium-backup`;
|
|
15
|
+
await fs.copyFile(configPath, backupPath);
|
|
16
|
+
return backupPath;
|
|
17
|
+
}
|
|
18
|
+
export async function restoreBackups() {
|
|
19
|
+
const restored = [];
|
|
20
|
+
const errors = [];
|
|
21
|
+
const searchDirs = [...new Set(Object.values(TOOL_REGISTRY).flatMap(t => t.paths.backupDirs.map(d => expandPath(d))))];
|
|
22
|
+
for (const dir of searchDirs) {
|
|
23
|
+
try {
|
|
24
|
+
const entries = await fs.readdir(dir);
|
|
25
|
+
for (const entry of entries) {
|
|
26
|
+
if (entry.endsWith(".mycelium-backup")) {
|
|
27
|
+
const backupPath = path.join(dir, entry);
|
|
28
|
+
const originalPath = backupPath.replace(/\.mycelium-backup$/, "");
|
|
29
|
+
try {
|
|
30
|
+
await fs.copyFile(backupPath, originalPath);
|
|
31
|
+
await fs.unlink(backupPath);
|
|
32
|
+
restored.push(originalPath);
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
errors.push(`Failed to restore ${originalPath}: ${err}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// directory doesn't exist
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return { restored, errors };
|
|
45
|
+
}
|
|
46
|
+
// ============================================================================
|
|
47
|
+
// Public API
|
|
48
|
+
// ============================================================================
|
|
49
|
+
export async function syncToTool(toolId, mcps, hooks) {
|
|
50
|
+
const desc = TOOL_REGISTRY[toolId];
|
|
51
|
+
if (!desc) {
|
|
52
|
+
return { configPath: "", backupPath: "", sectionsUpdated: [], success: false, error: `Unsupported tool: ${toolId}` };
|
|
53
|
+
}
|
|
54
|
+
let adapter;
|
|
55
|
+
try {
|
|
56
|
+
adapter = getAdapter(toolId);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return { configPath: "", backupPath: "", sectionsUpdated: [], success: false, error: `Unsupported tool: ${toolId}` };
|
|
60
|
+
}
|
|
61
|
+
const result = await adapter.syncAll(mcps);
|
|
62
|
+
// Handle hooks separately (Claude Code only)
|
|
63
|
+
if (toolId === "claude-code" && hooks?.length) {
|
|
64
|
+
await writeClaudeCodeHooks(hooks);
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
configPath: resolvePath(desc.paths.mcp) ?? "",
|
|
68
|
+
backupPath: "",
|
|
69
|
+
sectionsUpdated: result.success ? ["mcpServers"] : [],
|
|
70
|
+
success: result.success,
|
|
71
|
+
error: result.error,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
async function writeClaudeCodeHooks(hooks) {
|
|
75
|
+
const settingsPath = expandPath("~/.claude/settings.json");
|
|
76
|
+
const settingsRaw = await readFileIfExists(settingsPath);
|
|
77
|
+
const settings = settingsRaw ? JSON.parse(settingsRaw) : {};
|
|
78
|
+
if (settingsRaw) {
|
|
79
|
+
await backupConfig(settingsPath);
|
|
80
|
+
}
|
|
81
|
+
const hooksObj = {};
|
|
82
|
+
for (const hook of hooks) {
|
|
83
|
+
const event = hook.event ?? "PostToolUse";
|
|
84
|
+
if (!hooksObj[event])
|
|
85
|
+
hooksObj[event] = [];
|
|
86
|
+
const hookEntry = {};
|
|
87
|
+
if (hook.matchers?.length)
|
|
88
|
+
hookEntry.matchers = hook.matchers;
|
|
89
|
+
if (hook.command)
|
|
90
|
+
hookEntry.command = hook.command;
|
|
91
|
+
if (hook.timeout)
|
|
92
|
+
hookEntry.timeout = hook.timeout;
|
|
93
|
+
hooksObj[event].push(hookEntry);
|
|
94
|
+
}
|
|
95
|
+
settings.hooks = hooksObj;
|
|
96
|
+
await mkdirp(path.dirname(settingsPath));
|
|
97
|
+
await fs.writeFile(settingsPath, JSON.stringify(settings, null, 2), "utf-8");
|
|
98
|
+
}
|
|
99
|
+
export async function dryRunSync(toolId, mcps) {
|
|
100
|
+
const desc = TOOL_REGISTRY[toolId];
|
|
101
|
+
const configPath = resolvePath(desc?.paths.mcp) ?? "";
|
|
102
|
+
const currentContent = configPath ? await readFileIfExists(configPath) : null;
|
|
103
|
+
// Build what the new content would be
|
|
104
|
+
let newContent;
|
|
105
|
+
if (desc?.mcp.format === "toml") {
|
|
106
|
+
const lines = [];
|
|
107
|
+
for (const [name, mcp] of Object.entries(mcps)) {
|
|
108
|
+
lines.push(`[mcp.servers."${name}"]`);
|
|
109
|
+
lines.push(`command = "${mcp.command}"`);
|
|
110
|
+
if (mcp.args?.length) {
|
|
111
|
+
lines.push(`args = [${mcp.args.map((a) => `"${a}"`).join(", ")}]`);
|
|
112
|
+
}
|
|
113
|
+
lines.push("");
|
|
114
|
+
}
|
|
115
|
+
newContent = lines.join("\n");
|
|
116
|
+
}
|
|
117
|
+
else if (desc?.mcp.entryShape === "openclaw") {
|
|
118
|
+
const config = currentContent ? JSON.parse(currentContent) : {};
|
|
119
|
+
const plugins = config.plugins ?? {};
|
|
120
|
+
const existingEntries = plugins.entries ?? [];
|
|
121
|
+
const nonMcpEntries = existingEntries.filter((e) => e.type !== "mcp-adapter");
|
|
122
|
+
const mcpEntries = Object.entries(mcps).map(([name, mcp]) => ({
|
|
123
|
+
type: "mcp-adapter",
|
|
124
|
+
name,
|
|
125
|
+
command: mcp.command,
|
|
126
|
+
args: mcp.args || [],
|
|
127
|
+
...(mcp.env && Object.keys(mcp.env).length > 0 ? { env: mcp.env } : {}),
|
|
128
|
+
}));
|
|
129
|
+
config.plugins = { ...plugins, entries: [...nonMcpEntries, ...mcpEntries] };
|
|
130
|
+
newContent = JSON.stringify(config, null, 2);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
// JSON tools
|
|
134
|
+
const config = currentContent ? JSON.parse(currentContent) : {};
|
|
135
|
+
const cleanMcps = {};
|
|
136
|
+
for (const [name, mcp] of Object.entries(mcps)) {
|
|
137
|
+
const entry = { command: mcp.command };
|
|
138
|
+
if (mcp.args?.length)
|
|
139
|
+
entry.args = mcp.args;
|
|
140
|
+
if (mcp.env && Object.keys(mcp.env).length > 0)
|
|
141
|
+
entry.env = mcp.env;
|
|
142
|
+
cleanMcps[name] = entry;
|
|
143
|
+
}
|
|
144
|
+
const key = desc?.mcp.key ?? "mcpServers";
|
|
145
|
+
config[key] = cleanMcps;
|
|
146
|
+
newContent = JSON.stringify(config, null, 2);
|
|
147
|
+
}
|
|
148
|
+
return { configPath, currentContent, newContent };
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=sync-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-writer.js","sourceRoot":"","sources":["../../src/core/sync-writer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-writer.test.d.ts","sourceRoot":"","sources":["../../src/core/sync-writer.test.ts"],"names":[],"mappings":""}
|