@swarmify/agents-cli 1.13.3 → 1.14.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/README.md +2 -319
- package/bin/agents.js +2 -0
- package/package.json +13 -79
- package/scripts/postinstall.js +4 -71
- package/CHANGELOG.md +0 -316
- package/LICENSE +0 -21
- package/dist/commands/__tests__/sessions-tail.test.d.ts +0 -2
- package/dist/commands/__tests__/sessions-tail.test.d.ts.map +0 -1
- package/dist/commands/__tests__/sessions-tail.test.js +0 -108
- package/dist/commands/__tests__/sessions-tail.test.js.map +0 -1
- package/dist/commands/__tests__/sessions.test.d.ts +0 -2
- package/dist/commands/__tests__/sessions.test.d.ts.map +0 -1
- package/dist/commands/__tests__/sessions.test.js +0 -636
- package/dist/commands/__tests__/sessions.test.js.map +0 -1
- package/dist/commands/cloud.d.ts +0 -11
- package/dist/commands/cloud.d.ts.map +0 -1
- package/dist/commands/cloud.js +0 -363
- package/dist/commands/cloud.js.map +0 -1
- package/dist/commands/commands.d.ts +0 -12
- package/dist/commands/commands.d.ts.map +0 -1
- package/dist/commands/commands.js +0 -629
- package/dist/commands/commands.js.map +0 -1
- package/dist/commands/daemon.d.ts +0 -11
- package/dist/commands/daemon.d.ts.map +0 -1
- package/dist/commands/daemon.js +0 -119
- package/dist/commands/daemon.js.map +0 -1
- package/dist/commands/drive.d.ts +0 -11
- package/dist/commands/drive.d.ts.map +0 -1
- package/dist/commands/drive.js +0 -175
- package/dist/commands/drive.js.map +0 -1
- package/dist/commands/exec.d.ts +0 -11
- package/dist/commands/exec.d.ts.map +0 -1
- package/dist/commands/exec.js +0 -251
- package/dist/commands/exec.js.map +0 -1
- package/dist/commands/factory.d.ts +0 -11
- package/dist/commands/factory.d.ts.map +0 -1
- package/dist/commands/factory.js +0 -445
- package/dist/commands/factory.js.map +0 -1
- package/dist/commands/fork.d.ts +0 -11
- package/dist/commands/fork.d.ts.map +0 -1
- package/dist/commands/fork.js +0 -147
- package/dist/commands/fork.js.map +0 -1
- package/dist/commands/hooks.d.ts +0 -12
- package/dist/commands/hooks.d.ts.map +0 -1
- package/dist/commands/hooks.js +0 -690
- package/dist/commands/hooks.js.map +0 -1
- package/dist/commands/init.d.ts +0 -15
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -137
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/mcp.d.ts +0 -12
- package/dist/commands/mcp.d.ts.map +0 -1
- package/dist/commands/mcp.js +0 -583
- package/dist/commands/mcp.js.map +0 -1
- package/dist/commands/models.d.ts +0 -11
- package/dist/commands/models.d.ts.map +0 -1
- package/dist/commands/models.js +0 -170
- package/dist/commands/models.js.map +0 -1
- package/dist/commands/packages.d.ts +0 -11
- package/dist/commands/packages.d.ts.map +0 -1
- package/dist/commands/packages.js +0 -551
- package/dist/commands/packages.js.map +0 -1
- package/dist/commands/permissions.d.ts +0 -12
- package/dist/commands/permissions.d.ts.map +0 -1
- package/dist/commands/permissions.js +0 -724
- package/dist/commands/permissions.js.map +0 -1
- package/dist/commands/plugins.d.ts +0 -11
- package/dist/commands/plugins.d.ts.map +0 -1
- package/dist/commands/plugins.js +0 -393
- package/dist/commands/plugins.js.map +0 -1
- package/dist/commands/profiles.d.ts +0 -12
- package/dist/commands/profiles.d.ts.map +0 -1
- package/dist/commands/profiles.js +0 -255
- package/dist/commands/profiles.js.map +0 -1
- package/dist/commands/pty.d.ts +0 -21
- package/dist/commands/pty.d.ts.map +0 -1
- package/dist/commands/pty.js +0 -391
- package/dist/commands/pty.js.map +0 -1
- package/dist/commands/pull.d.ts +0 -11
- package/dist/commands/pull.d.ts.map +0 -1
- package/dist/commands/pull.js +0 -456
- package/dist/commands/pull.js.map +0 -1
- package/dist/commands/push.d.ts +0 -11
- package/dist/commands/push.d.ts.map +0 -1
- package/dist/commands/push.js +0 -188
- package/dist/commands/push.js.map +0 -1
- package/dist/commands/refresh-memory.d.ts +0 -16
- package/dist/commands/refresh-memory.d.ts.map +0 -1
- package/dist/commands/refresh-memory.js +0 -52
- package/dist/commands/refresh-memory.js.map +0 -1
- package/dist/commands/resource-view.d.ts +0 -39
- package/dist/commands/resource-view.d.ts.map +0 -1
- package/dist/commands/resource-view.js +0 -197
- package/dist/commands/resource-view.js.map +0 -1
- package/dist/commands/routines.d.ts +0 -11
- package/dist/commands/routines.d.ts.map +0 -1
- package/dist/commands/routines.js +0 -590
- package/dist/commands/routines.js.map +0 -1
- package/dist/commands/rules.d.ts +0 -12
- package/dist/commands/rules.d.ts.map +0 -1
- package/dist/commands/rules.js +0 -489
- package/dist/commands/rules.js.map +0 -1
- package/dist/commands/secrets.d.ts +0 -11
- package/dist/commands/secrets.d.ts.map +0 -1
- package/dist/commands/secrets.js +0 -352
- package/dist/commands/secrets.js.map +0 -1
- package/dist/commands/sessions-picker.d.ts +0 -18
- package/dist/commands/sessions-picker.d.ts.map +0 -1
- package/dist/commands/sessions-picker.js +0 -265
- package/dist/commands/sessions-picker.js.map +0 -1
- package/dist/commands/sessions-tail.d.ts +0 -20
- package/dist/commands/sessions-tail.d.ts.map +0 -1
- package/dist/commands/sessions-tail.js +0 -236
- package/dist/commands/sessions-tail.js.map +0 -1
- package/dist/commands/sessions.d.ts +0 -18
- package/dist/commands/sessions.d.ts.map +0 -1
- package/dist/commands/sessions.js +0 -1173
- package/dist/commands/sessions.js.map +0 -1
- package/dist/commands/skills.d.ts +0 -12
- package/dist/commands/skills.d.ts.map +0 -1
- package/dist/commands/skills.js +0 -717
- package/dist/commands/skills.js.map +0 -1
- package/dist/commands/status.d.ts +0 -10
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/status.js +0 -26
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/subagents.d.ts +0 -11
- package/dist/commands/subagents.d.ts.map +0 -1
- package/dist/commands/subagents.js +0 -361
- package/dist/commands/subagents.js.map +0 -1
- package/dist/commands/sync.d.ts +0 -11
- package/dist/commands/sync.d.ts.map +0 -1
- package/dist/commands/sync.js +0 -70
- package/dist/commands/sync.js.map +0 -1
- package/dist/commands/teams-picker.d.ts +0 -18
- package/dist/commands/teams-picker.d.ts.map +0 -1
- package/dist/commands/teams-picker.js +0 -290
- package/dist/commands/teams-picker.js.map +0 -1
- package/dist/commands/teams.d.ts +0 -18
- package/dist/commands/teams.d.ts.map +0 -1
- package/dist/commands/teams.js +0 -1144
- package/dist/commands/teams.js.map +0 -1
- package/dist/commands/utils.d.ts +0 -45
- package/dist/commands/utils.d.ts.map +0 -1
- package/dist/commands/utils.js +0 -106
- package/dist/commands/utils.js.map +0 -1
- package/dist/commands/versions.d.ts +0 -11
- package/dist/commands/versions.d.ts.map +0 -1
- package/dist/commands/versions.js +0 -701
- package/dist/commands/versions.js.map +0 -1
- package/dist/commands/view.d.ts +0 -43
- package/dist/commands/view.d.ts.map +0 -1
- package/dist/commands/view.js +0 -894
- package/dist/commands/view.js.map +0 -1
- package/dist/index.d.ts +0 -9
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -496
- package/dist/index.js.map +0 -1
- package/dist/lib/__tests__/bugfixes.test.d.ts +0 -2
- package/dist/lib/__tests__/bugfixes.test.d.ts.map +0 -1
- package/dist/lib/__tests__/bugfixes.test.js +0 -192
- package/dist/lib/__tests__/bugfixes.test.js.map +0 -1
- package/dist/lib/__tests__/exec.test.d.ts +0 -2
- package/dist/lib/__tests__/exec.test.d.ts.map +0 -1
- package/dist/lib/__tests__/exec.test.js +0 -446
- package/dist/lib/__tests__/exec.test.js.map +0 -1
- package/dist/lib/__tests__/git-sync.test.d.ts +0 -2
- package/dist/lib/__tests__/git-sync.test.d.ts.map +0 -1
- package/dist/lib/__tests__/git-sync.test.js +0 -138
- package/dist/lib/__tests__/git-sync.test.js.map +0 -1
- package/dist/lib/__tests__/hooks.test.d.ts +0 -2
- package/dist/lib/__tests__/hooks.test.d.ts.map +0 -1
- package/dist/lib/__tests__/hooks.test.js +0 -203
- package/dist/lib/__tests__/hooks.test.js.map +0 -1
- package/dist/lib/__tests__/memory-compile.test.d.ts +0 -2
- package/dist/lib/__tests__/memory-compile.test.d.ts.map +0 -1
- package/dist/lib/__tests__/memory-compile.test.js +0 -95
- package/dist/lib/__tests__/memory-compile.test.js.map +0 -1
- package/dist/lib/__tests__/models.test.d.ts +0 -2
- package/dist/lib/__tests__/models.test.d.ts.map +0 -1
- package/dist/lib/__tests__/models.test.js +0 -239
- package/dist/lib/__tests__/models.test.js.map +0 -1
- package/dist/lib/__tests__/rotate.test.d.ts +0 -2
- package/dist/lib/__tests__/rotate.test.d.ts.map +0 -1
- package/dist/lib/__tests__/rotate.test.js +0 -80
- package/dist/lib/__tests__/rotate.test.js.map +0 -1
- package/dist/lib/__tests__/secrets-bundles.test.d.ts +0 -2
- package/dist/lib/__tests__/secrets-bundles.test.d.ts.map +0 -1
- package/dist/lib/__tests__/secrets-bundles.test.js +0 -104
- package/dist/lib/__tests__/secrets-bundles.test.js.map +0 -1
- package/dist/lib/__tests__/secrets.test.d.ts +0 -2
- package/dist/lib/__tests__/secrets.test.d.ts.map +0 -1
- package/dist/lib/__tests__/secrets.test.js +0 -90
- package/dist/lib/__tests__/secrets.test.js.map +0 -1
- package/dist/lib/__tests__/shims.test.d.ts +0 -2
- package/dist/lib/__tests__/shims.test.d.ts.map +0 -1
- package/dist/lib/__tests__/shims.test.js +0 -57
- package/dist/lib/__tests__/shims.test.js.map +0 -1
- package/dist/lib/__tests__/usage.test.d.ts +0 -2
- package/dist/lib/__tests__/usage.test.d.ts.map +0 -1
- package/dist/lib/__tests__/usage.test.js +0 -220
- package/dist/lib/__tests__/usage.test.js.map +0 -1
- package/dist/lib/__tests__/versions.test.d.ts +0 -2
- package/dist/lib/__tests__/versions.test.d.ts.map +0 -1
- package/dist/lib/__tests__/versions.test.js +0 -63
- package/dist/lib/__tests__/versions.test.js.map +0 -1
- package/dist/lib/agents.d.ts +0 -158
- package/dist/lib/agents.d.ts.map +0 -1
- package/dist/lib/agents.js +0 -1159
- package/dist/lib/agents.js.map +0 -1
- package/dist/lib/artifact-actions.d.ts +0 -27
- package/dist/lib/artifact-actions.d.ts.map +0 -1
- package/dist/lib/artifact-actions.js +0 -58
- package/dist/lib/artifact-actions.js.map +0 -1
- package/dist/lib/cloud/codex.d.ts +0 -26
- package/dist/lib/cloud/codex.d.ts.map +0 -1
- package/dist/lib/cloud/codex.js +0 -237
- package/dist/lib/cloud/codex.js.map +0 -1
- package/dist/lib/cloud/factory.d.ts +0 -32
- package/dist/lib/cloud/factory.d.ts.map +0 -1
- package/dist/lib/cloud/factory.js +0 -43
- package/dist/lib/cloud/factory.js.map +0 -1
- package/dist/lib/cloud/registry.d.ts +0 -16
- package/dist/lib/cloud/registry.d.ts.map +0 -1
- package/dist/lib/cloud/registry.js +0 -68
- package/dist/lib/cloud/registry.js.map +0 -1
- package/dist/lib/cloud/rush.d.ts +0 -37
- package/dist/lib/cloud/rush.d.ts.map +0 -1
- package/dist/lib/cloud/rush.js +0 -230
- package/dist/lib/cloud/rush.js.map +0 -1
- package/dist/lib/cloud/rush.test.d.ts +0 -2
- package/dist/lib/cloud/rush.test.d.ts.map +0 -1
- package/dist/lib/cloud/rush.test.js +0 -63
- package/dist/lib/cloud/rush.test.js.map +0 -1
- package/dist/lib/cloud/store.d.ts +0 -23
- package/dist/lib/cloud/store.d.ts.map +0 -1
- package/dist/lib/cloud/store.js +0 -116
- package/dist/lib/cloud/store.js.map +0 -1
- package/dist/lib/cloud/stream.d.ts +0 -24
- package/dist/lib/cloud/stream.d.ts.map +0 -1
- package/dist/lib/cloud/stream.js +0 -145
- package/dist/lib/cloud/stream.js.map +0 -1
- package/dist/lib/cloud/types.d.ts +0 -109
- package/dist/lib/cloud/types.d.ts.map +0 -1
- package/dist/lib/cloud/types.js +0 -33
- package/dist/lib/cloud/types.js.map +0 -1
- package/dist/lib/cloud/types.test.d.ts +0 -2
- package/dist/lib/cloud/types.test.d.ts.map +0 -1
- package/dist/lib/cloud/types.test.js +0 -41
- package/dist/lib/cloud/types.test.js.map +0 -1
- package/dist/lib/commands.d.ts +0 -141
- package/dist/lib/commands.d.ts.map +0 -1
- package/dist/lib/commands.js +0 -514
- package/dist/lib/commands.js.map +0 -1
- package/dist/lib/convert.d.ts +0 -21
- package/dist/lib/convert.d.ts.map +0 -1
- package/dist/lib/convert.js +0 -54
- package/dist/lib/convert.js.map +0 -1
- package/dist/lib/daemon.d.ts +0 -43
- package/dist/lib/daemon.d.ts.map +0 -1
- package/dist/lib/daemon.js +0 -332
- package/dist/lib/daemon.js.map +0 -1
- package/dist/lib/drive-sync.d.ts +0 -46
- package/dist/lib/drive-sync.d.ts.map +0 -1
- package/dist/lib/drive-sync.js +0 -209
- package/dist/lib/drive-sync.js.map +0 -1
- package/dist/lib/exec.d.ts +0 -101
- package/dist/lib/exec.d.ts.map +0 -1
- package/dist/lib/exec.js +0 -450
- package/dist/lib/exec.js.map +0 -1
- package/dist/lib/factory/__tests__/config.test.d.ts +0 -2
- package/dist/lib/factory/__tests__/config.test.d.ts.map +0 -1
- package/dist/lib/factory/__tests__/config.test.js +0 -128
- package/dist/lib/factory/__tests__/config.test.js.map +0 -1
- package/dist/lib/factory/config.d.ts +0 -49
- package/dist/lib/factory/config.d.ts.map +0 -1
- package/dist/lib/factory/config.js +0 -127
- package/dist/lib/factory/config.js.map +0 -1
- package/dist/lib/factory.d.ts +0 -57
- package/dist/lib/factory.d.ts.map +0 -1
- package/dist/lib/factory.js +0 -107
- package/dist/lib/factory.js.map +0 -1
- package/dist/lib/git.d.ts +0 -157
- package/dist/lib/git.d.ts.map +0 -1
- package/dist/lib/git.js +0 -647
- package/dist/lib/git.js.map +0 -1
- package/dist/lib/help.d.ts +0 -10
- package/dist/lib/help.d.ts.map +0 -1
- package/dist/lib/help.js +0 -66
- package/dist/lib/help.js.map +0 -1
- package/dist/lib/hooks.d.ts +0 -125
- package/dist/lib/hooks.d.ts.map +0 -1
- package/dist/lib/hooks.js +0 -846
- package/dist/lib/hooks.js.map +0 -1
- package/dist/lib/ledger/__tests__/local.test.d.ts +0 -2
- package/dist/lib/ledger/__tests__/local.test.d.ts.map +0 -1
- package/dist/lib/ledger/__tests__/local.test.js +0 -177
- package/dist/lib/ledger/__tests__/local.test.js.map +0 -1
- package/dist/lib/ledger/__tests__/sync.test.d.ts +0 -2
- package/dist/lib/ledger/__tests__/sync.test.d.ts.map +0 -1
- package/dist/lib/ledger/__tests__/sync.test.js +0 -117
- package/dist/lib/ledger/__tests__/sync.test.js.map +0 -1
- package/dist/lib/ledger/index.d.ts +0 -18
- package/dist/lib/ledger/index.d.ts.map +0 -1
- package/dist/lib/ledger/index.js +0 -32
- package/dist/lib/ledger/index.js.map +0 -1
- package/dist/lib/ledger/local.d.ts +0 -22
- package/dist/lib/ledger/local.d.ts.map +0 -1
- package/dist/lib/ledger/local.js +0 -333
- package/dist/lib/ledger/local.js.map +0 -1
- package/dist/lib/ledger/r2.d.ts +0 -41
- package/dist/lib/ledger/r2.d.ts.map +0 -1
- package/dist/lib/ledger/r2.js +0 -335
- package/dist/lib/ledger/r2.js.map +0 -1
- package/dist/lib/ledger/sync.d.ts +0 -33
- package/dist/lib/ledger/sync.d.ts.map +0 -1
- package/dist/lib/ledger/sync.js +0 -106
- package/dist/lib/ledger/sync.js.map +0 -1
- package/dist/lib/ledger/types.d.ts +0 -100
- package/dist/lib/ledger/types.d.ts.map +0 -1
- package/dist/lib/ledger/types.js +0 -21
- package/dist/lib/ledger/types.js.map +0 -1
- package/dist/lib/manifest.d.ts +0 -14
- package/dist/lib/manifest.d.ts.map +0 -1
- package/dist/lib/manifest.js +0 -48
- package/dist/lib/manifest.js.map +0 -1
- package/dist/lib/markdown.d.ts +0 -5
- package/dist/lib/markdown.d.ts.map +0 -1
- package/dist/lib/markdown.js +0 -17
- package/dist/lib/markdown.js.map +0 -1
- package/dist/lib/mcp.d.ts +0 -64
- package/dist/lib/mcp.d.ts.map +0 -1
- package/dist/lib/mcp.js +0 -327
- package/dist/lib/mcp.js.map +0 -1
- package/dist/lib/memory-compile.d.ts +0 -65
- package/dist/lib/memory-compile.d.ts.map +0 -1
- package/dist/lib/memory-compile.js +0 -174
- package/dist/lib/memory-compile.js.map +0 -1
- package/dist/lib/memory.d.ts +0 -64
- package/dist/lib/memory.d.ts.map +0 -1
- package/dist/lib/memory.js +0 -275
- package/dist/lib/memory.js.map +0 -1
- package/dist/lib/models.d.ts +0 -98
- package/dist/lib/models.d.ts.map +0 -1
- package/dist/lib/models.js +0 -728
- package/dist/lib/models.js.map +0 -1
- package/dist/lib/permissions.d.ts +0 -227
- package/dist/lib/permissions.d.ts.map +0 -1
- package/dist/lib/permissions.js +0 -1071
- package/dist/lib/permissions.js.map +0 -1
- package/dist/lib/picker.d.ts +0 -27
- package/dist/lib/picker.d.ts.map +0 -1
- package/dist/lib/picker.js +0 -110
- package/dist/lib/picker.js.map +0 -1
- package/dist/lib/plugins.d.ts +0 -80
- package/dist/lib/plugins.d.ts.map +0 -1
- package/dist/lib/plugins.js +0 -556
- package/dist/lib/plugins.js.map +0 -1
- package/dist/lib/profiles-keychain.d.ts +0 -11
- package/dist/lib/profiles-keychain.d.ts.map +0 -1
- package/dist/lib/profiles-keychain.js +0 -14
- package/dist/lib/profiles-keychain.js.map +0 -1
- package/dist/lib/profiles-presets.d.ts +0 -25
- package/dist/lib/profiles-presets.d.ts.map +0 -1
- package/dist/lib/profiles-presets.js +0 -104
- package/dist/lib/profiles-presets.js.map +0 -1
- package/dist/lib/profiles.d.ts +0 -70
- package/dist/lib/profiles.d.ts.map +0 -1
- package/dist/lib/profiles.js +0 -145
- package/dist/lib/profiles.js.map +0 -1
- package/dist/lib/pty-client.d.ts +0 -23
- package/dist/lib/pty-client.d.ts.map +0 -1
- package/dist/lib/pty-client.js +0 -181
- package/dist/lib/pty-client.js.map +0 -1
- package/dist/lib/pty-server.d.ts +0 -21
- package/dist/lib/pty-server.d.ts.map +0 -1
- package/dist/lib/pty-server.js +0 -427
- package/dist/lib/pty-server.js.map +0 -1
- package/dist/lib/registry.d.ts +0 -45
- package/dist/lib/registry.d.ts.map +0 -1
- package/dist/lib/registry.js +0 -220
- package/dist/lib/registry.js.map +0 -1
- package/dist/lib/resources.d.ts +0 -55
- package/dist/lib/resources.d.ts.map +0 -1
- package/dist/lib/resources.js +0 -103
- package/dist/lib/resources.js.map +0 -1
- package/dist/lib/rotate.d.ts +0 -58
- package/dist/lib/rotate.d.ts.map +0 -1
- package/dist/lib/rotate.js +0 -93
- package/dist/lib/rotate.js.map +0 -1
- package/dist/lib/routines.d.ts +0 -99
- package/dist/lib/routines.d.ts.map +0 -1
- package/dist/lib/routines.js +0 -352
- package/dist/lib/routines.js.map +0 -1
- package/dist/lib/runner.d.ts +0 -26
- package/dist/lib/runner.d.ts.map +0 -1
- package/dist/lib/runner.js +0 -325
- package/dist/lib/runner.js.map +0 -1
- package/dist/lib/sandbox.d.ts +0 -26
- package/dist/lib/sandbox.d.ts.map +0 -1
- package/dist/lib/sandbox.js +0 -218
- package/dist/lib/sandbox.js.map +0 -1
- package/dist/lib/scheduler.d.ts +0 -26
- package/dist/lib/scheduler.d.ts.map +0 -1
- package/dist/lib/scheduler.js +0 -77
- package/dist/lib/scheduler.js.map +0 -1
- package/dist/lib/secrets-bundles.d.ts +0 -38
- package/dist/lib/secrets-bundles.d.ts.map +0 -1
- package/dist/lib/secrets-bundles.js +0 -176
- package/dist/lib/secrets-bundles.js.map +0 -1
- package/dist/lib/secrets.d.ts +0 -53
- package/dist/lib/secrets.d.ts.map +0 -1
- package/dist/lib/secrets.js +0 -140
- package/dist/lib/secrets.js.map +0 -1
- package/dist/lib/session/__tests__/db.test.d.ts +0 -2
- package/dist/lib/session/__tests__/db.test.d.ts.map +0 -1
- package/dist/lib/session/__tests__/db.test.js +0 -54
- package/dist/lib/session/__tests__/db.test.js.map +0 -1
- package/dist/lib/session/__tests__/discover.test.d.ts +0 -2
- package/dist/lib/session/__tests__/discover.test.d.ts.map +0 -1
- package/dist/lib/session/__tests__/discover.test.js +0 -63
- package/dist/lib/session/__tests__/discover.test.js.map +0 -1
- package/dist/lib/session/__tests__/prompt.test.d.ts +0 -2
- package/dist/lib/session/__tests__/prompt.test.d.ts.map +0 -1
- package/dist/lib/session/__tests__/prompt.test.js +0 -44
- package/dist/lib/session/__tests__/prompt.test.js.map +0 -1
- package/dist/lib/session/__tests__/render.test.d.ts +0 -2
- package/dist/lib/session/__tests__/render.test.d.ts.map +0 -1
- package/dist/lib/session/__tests__/render.test.js +0 -602
- package/dist/lib/session/__tests__/render.test.js.map +0 -1
- package/dist/lib/session/active.d.ts +0 -44
- package/dist/lib/session/active.d.ts.map +0 -1
- package/dist/lib/session/active.js +0 -379
- package/dist/lib/session/active.js.map +0 -1
- package/dist/lib/session/artifacts.d.ts +0 -15
- package/dist/lib/session/artifacts.d.ts.map +0 -1
- package/dist/lib/session/artifacts.js +0 -86
- package/dist/lib/session/artifacts.js.map +0 -1
- package/dist/lib/session/db.d.ts +0 -140
- package/dist/lib/session/db.d.ts.map +0 -1
- package/dist/lib/session/db.js +0 -599
- package/dist/lib/session/db.js.map +0 -1
- package/dist/lib/session/discover.d.ts +0 -72
- package/dist/lib/session/discover.d.ts.map +0 -1
- package/dist/lib/session/discover.js +0 -1315
- package/dist/lib/session/discover.js.map +0 -1
- package/dist/lib/session/parse.d.ts +0 -34
- package/dist/lib/session/parse.d.ts.map +0 -1
- package/dist/lib/session/parse.js +0 -663
- package/dist/lib/session/parse.js.map +0 -1
- package/dist/lib/session/prompt.d.ts +0 -13
- package/dist/lib/session/prompt.d.ts.map +0 -1
- package/dist/lib/session/prompt.js +0 -79
- package/dist/lib/session/prompt.js.map +0 -1
- package/dist/lib/session/prompt.test.d.ts +0 -2
- package/dist/lib/session/prompt.test.d.ts.map +0 -1
- package/dist/lib/session/prompt.test.js +0 -57
- package/dist/lib/session/prompt.test.js.map +0 -1
- package/dist/lib/session/render.d.ts +0 -103
- package/dist/lib/session/render.d.ts.map +0 -1
- package/dist/lib/session/render.js +0 -798
- package/dist/lib/session/render.js.map +0 -1
- package/dist/lib/session/team-filter.d.ts +0 -35
- package/dist/lib/session/team-filter.d.ts.map +0 -1
- package/dist/lib/session/team-filter.js +0 -75
- package/dist/lib/session/team-filter.js.map +0 -1
- package/dist/lib/session/team-filter.test.d.ts +0 -2
- package/dist/lib/session/team-filter.test.d.ts.map +0 -1
- package/dist/lib/session/team-filter.test.js +0 -157
- package/dist/lib/session/team-filter.test.js.map +0 -1
- package/dist/lib/session/types.d.ts +0 -84
- package/dist/lib/session/types.d.ts.map +0 -1
- package/dist/lib/session/types.js +0 -11
- package/dist/lib/session/types.js.map +0 -1
- package/dist/lib/shims.d.ts +0 -272
- package/dist/lib/shims.d.ts.map +0 -1
- package/dist/lib/shims.js +0 -1322
- package/dist/lib/shims.js.map +0 -1
- package/dist/lib/skills.d.ts +0 -142
- package/dist/lib/skills.d.ts.map +0 -1
- package/dist/lib/skills.js +0 -791
- package/dist/lib/skills.js.map +0 -1
- package/dist/lib/state.d.ts +0 -87
- package/dist/lib/state.d.ts.map +0 -1
- package/dist/lib/state.js +0 -333
- package/dist/lib/state.js.map +0 -1
- package/dist/lib/subagents.d.ts +0 -84
- package/dist/lib/subagents.d.ts.map +0 -1
- package/dist/lib/subagents.js +0 -410
- package/dist/lib/subagents.js.map +0 -1
- package/dist/lib/teams/__tests__/oracle.test.d.ts +0 -2
- package/dist/lib/teams/__tests__/oracle.test.d.ts.map +0 -1
- package/dist/lib/teams/__tests__/oracle.test.js +0 -89
- package/dist/lib/teams/__tests__/oracle.test.js.map +0 -1
- package/dist/lib/teams/__tests__/supervisor.test.d.ts +0 -2
- package/dist/lib/teams/__tests__/supervisor.test.d.ts.map +0 -1
- package/dist/lib/teams/__tests__/supervisor.test.js +0 -179
- package/dist/lib/teams/__tests__/supervisor.test.js.map +0 -1
- package/dist/lib/teams/agents.d.ts +0 -247
- package/dist/lib/teams/agents.d.ts.map +0 -1
- package/dist/lib/teams/agents.js +0 -1244
- package/dist/lib/teams/agents.js.map +0 -1
- package/dist/lib/teams/api.d.ts +0 -91
- package/dist/lib/teams/api.d.ts.map +0 -1
- package/dist/lib/teams/api.js +0 -239
- package/dist/lib/teams/api.js.map +0 -1
- package/dist/lib/teams/cloud.d.ts +0 -11
- package/dist/lib/teams/cloud.d.ts.map +0 -1
- package/dist/lib/teams/cloud.js +0 -169
- package/dist/lib/teams/cloud.js.map +0 -1
- package/dist/lib/teams/debug.d.ts +0 -8
- package/dist/lib/teams/debug.d.ts.map +0 -1
- package/dist/lib/teams/debug.js +0 -12
- package/dist/lib/teams/debug.js.map +0 -1
- package/dist/lib/teams/file_ops.d.ts +0 -13
- package/dist/lib/teams/file_ops.d.ts.map +0 -1
- package/dist/lib/teams/file_ops.js +0 -66
- package/dist/lib/teams/file_ops.js.map +0 -1
- package/dist/lib/teams/index.d.ts +0 -16
- package/dist/lib/teams/index.d.ts.map +0 -1
- package/dist/lib/teams/index.js +0 -15
- package/dist/lib/teams/index.js.map +0 -1
- package/dist/lib/teams/oracle.d.ts +0 -20
- package/dist/lib/teams/oracle.d.ts.map +0 -1
- package/dist/lib/teams/oracle.js +0 -59
- package/dist/lib/teams/oracle.js.map +0 -1
- package/dist/lib/teams/parsers.d.ts +0 -9
- package/dist/lib/teams/parsers.d.ts.map +0 -1
- package/dist/lib/teams/parsers.js +0 -837
- package/dist/lib/teams/parsers.js.map +0 -1
- package/dist/lib/teams/persistence.d.ts +0 -43
- package/dist/lib/teams/persistence.d.ts.map +0 -1
- package/dist/lib/teams/persistence.js +0 -299
- package/dist/lib/teams/persistence.js.map +0 -1
- package/dist/lib/teams/ralph.d.ts +0 -8
- package/dist/lib/teams/ralph.d.ts.map +0 -1
- package/dist/lib/teams/ralph.js +0 -59
- package/dist/lib/teams/ralph.js.map +0 -1
- package/dist/lib/teams/registry.d.ts +0 -18
- package/dist/lib/teams/registry.d.ts.map +0 -1
- package/dist/lib/teams/registry.js +0 -68
- package/dist/lib/teams/registry.js.map +0 -1
- package/dist/lib/teams/summarizer.d.ts +0 -73
- package/dist/lib/teams/summarizer.d.ts.map +0 -1
- package/dist/lib/teams/summarizer.js +0 -780
- package/dist/lib/teams/summarizer.js.map +0 -1
- package/dist/lib/teams/supervisor.d.ts +0 -49
- package/dist/lib/teams/supervisor.d.ts.map +0 -1
- package/dist/lib/teams/supervisor.js +0 -74
- package/dist/lib/teams/supervisor.js.map +0 -1
- package/dist/lib/template.d.ts +0 -27
- package/dist/lib/template.d.ts.map +0 -1
- package/dist/lib/template.js +0 -60
- package/dist/lib/template.js.map +0 -1
- package/dist/lib/types.d.ts +0 -331
- package/dist/lib/types.d.ts.map +0 -1
- package/dist/lib/types.js +0 -29
- package/dist/lib/types.js.map +0 -1
- package/dist/lib/usage.d.ts +0 -105
- package/dist/lib/usage.d.ts.map +0 -1
- package/dist/lib/usage.js +0 -686
- package/dist/lib/usage.js.map +0 -1
- package/dist/lib/versions.d.ts +0 -253
- package/dist/lib/versions.d.ts.map +0 -1
- package/dist/lib/versions.js +0 -1796
- package/dist/lib/versions.js.map +0 -1
- package/scripts/rebuild-sqlite.sh +0 -46
package/dist/lib/skills.js
DELETED
|
@@ -1,791 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Skill management -- discovery, installation, and syncing of SKILL.md bundles.
|
|
3
|
-
*
|
|
4
|
-
* Skills are knowledge packs stored in ~/.agents/skills/. Each skill directory
|
|
5
|
-
* contains a SKILL.md (with frontmatter metadata) and optional supporting files
|
|
6
|
-
* (rules/, examples/, etc.). This module handles parsing skill metadata,
|
|
7
|
-
* installing skills into agent version homes, and tracking installation state.
|
|
8
|
-
*/
|
|
9
|
-
import * as fs from 'fs';
|
|
10
|
-
import * as path from 'path';
|
|
11
|
-
import * as os from 'os';
|
|
12
|
-
import * as yaml from 'yaml';
|
|
13
|
-
import { SKILLS_CAPABLE_AGENTS, ensureSkillsDir } from './agents.js';
|
|
14
|
-
import { getAgentsDir, getProjectAgentsDir } from './state.js';
|
|
15
|
-
import { getEffectiveHome, getVersionHomePath, listInstalledVersions } from './versions.js';
|
|
16
|
-
const HOME = os.homedir();
|
|
17
|
-
export function getSkillsDir() {
|
|
18
|
-
return path.join(getAgentsDir(), 'skills');
|
|
19
|
-
}
|
|
20
|
-
export function ensureCentralSkillsDir() {
|
|
21
|
-
const dir = getSkillsDir();
|
|
22
|
-
if (!fs.existsSync(dir)) {
|
|
23
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
export function getAgentSkillsDir(agentId) {
|
|
27
|
-
const home = getEffectiveHome(agentId);
|
|
28
|
-
return path.join(home, `.${agentId}`, 'skills');
|
|
29
|
-
}
|
|
30
|
-
export function getProjectSkillsDir(agentId, cwd = process.cwd()) {
|
|
31
|
-
const dirs = [];
|
|
32
|
-
const projectAgentsDir = getProjectAgentsDir(cwd);
|
|
33
|
-
if (projectAgentsDir) {
|
|
34
|
-
dirs.push(path.join(projectAgentsDir, 'skills'));
|
|
35
|
-
}
|
|
36
|
-
dirs.push(path.join(cwd, `.${agentId}`, 'skills'));
|
|
37
|
-
// Return the first existing dir, otherwise default to the first candidate
|
|
38
|
-
for (const dir of dirs) {
|
|
39
|
-
if (fs.existsSync(dir))
|
|
40
|
-
return dir;
|
|
41
|
-
}
|
|
42
|
-
return dirs[0];
|
|
43
|
-
}
|
|
44
|
-
export function validateSkillMetadata(metadata, skillName) {
|
|
45
|
-
const errors = [];
|
|
46
|
-
const warnings = [];
|
|
47
|
-
if (!metadata) {
|
|
48
|
-
errors.push('SKILL.md not found or has no valid frontmatter');
|
|
49
|
-
return { valid: false, errors, warnings };
|
|
50
|
-
}
|
|
51
|
-
// name is required
|
|
52
|
-
if (!metadata.name || metadata.name.trim() === '') {
|
|
53
|
-
errors.push('Missing required field: name');
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
if (metadata.name.length > 64) {
|
|
57
|
-
errors.push(`name exceeds 64 characters (${metadata.name.length})`);
|
|
58
|
-
}
|
|
59
|
-
if (!/^[a-z0-9-]+$/.test(metadata.name)) {
|
|
60
|
-
warnings.push('name should be lowercase with hyphens (e.g., my-skill-name)');
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
// description is required
|
|
64
|
-
if (!metadata.description || metadata.description.trim() === '') {
|
|
65
|
-
errors.push('Missing required field: description');
|
|
66
|
-
}
|
|
67
|
-
else if (metadata.description.length > 1024) {
|
|
68
|
-
warnings.push(`description exceeds 1024 characters (${metadata.description.length})`);
|
|
69
|
-
}
|
|
70
|
-
return { valid: errors.length === 0, errors, warnings };
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Parse skill metadata from SKILL.md, returning both result and any error.
|
|
74
|
-
*/
|
|
75
|
-
export function tryParseSkillMetadata(skillDir) {
|
|
76
|
-
const skillMdPath = path.join(skillDir, 'SKILL.md');
|
|
77
|
-
if (!fs.existsSync(skillMdPath)) {
|
|
78
|
-
return { metadata: null, error: 'SKILL.md not found' };
|
|
79
|
-
}
|
|
80
|
-
try {
|
|
81
|
-
const content = fs.readFileSync(skillMdPath, 'utf-8');
|
|
82
|
-
const lines = content.split('\n');
|
|
83
|
-
// Check for YAML frontmatter (required)
|
|
84
|
-
if (lines[0] === '---') {
|
|
85
|
-
const endIndex = lines.slice(1).findIndex((l) => l === '---');
|
|
86
|
-
if (endIndex > 0) {
|
|
87
|
-
const frontmatter = lines.slice(1, endIndex + 1).join('\n');
|
|
88
|
-
const parsed = yaml.parse(frontmatter);
|
|
89
|
-
return {
|
|
90
|
-
metadata: {
|
|
91
|
-
name: parsed.name || '',
|
|
92
|
-
description: parsed.description || '',
|
|
93
|
-
author: parsed.author,
|
|
94
|
-
version: parsed.version,
|
|
95
|
-
license: parsed.license,
|
|
96
|
-
keywords: parsed.keywords,
|
|
97
|
-
},
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
// No valid frontmatter
|
|
102
|
-
return { metadata: null, error: 'No valid YAML frontmatter found' };
|
|
103
|
-
}
|
|
104
|
-
catch (e) {
|
|
105
|
-
const msg = e instanceof Error ? e.message : 'Unknown parse error';
|
|
106
|
-
return { metadata: null, error: `Invalid YAML: ${msg}` };
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Parse skill metadata from SKILL.md (backward-compatible, returns null on error).
|
|
111
|
-
*/
|
|
112
|
-
export function parseSkillMetadata(skillDir) {
|
|
113
|
-
return tryParseSkillMetadata(skillDir).metadata;
|
|
114
|
-
}
|
|
115
|
-
export function countSkillRules(skillDir) {
|
|
116
|
-
const rulesDir = path.join(skillDir, 'rules');
|
|
117
|
-
if (!fs.existsSync(rulesDir)) {
|
|
118
|
-
return 0;
|
|
119
|
-
}
|
|
120
|
-
try {
|
|
121
|
-
const files = fs.readdirSync(rulesDir);
|
|
122
|
-
return files.filter((f) => f.endsWith('.md')).length;
|
|
123
|
-
}
|
|
124
|
-
catch {
|
|
125
|
-
return 0;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* Count bundled resource files in a skill directory: every regular file
|
|
130
|
-
* beyond SKILL.md itself (reference docs, scripts, assets, etc). Hidden
|
|
131
|
-
* files and hidden directories are skipped.
|
|
132
|
-
*/
|
|
133
|
-
export function countSkillFiles(skillDir) {
|
|
134
|
-
if (!fs.existsSync(skillDir))
|
|
135
|
-
return 0;
|
|
136
|
-
let count = 0;
|
|
137
|
-
const walk = (dir) => {
|
|
138
|
-
let entries;
|
|
139
|
-
try {
|
|
140
|
-
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
141
|
-
}
|
|
142
|
-
catch {
|
|
143
|
-
return;
|
|
144
|
-
}
|
|
145
|
-
for (const entry of entries) {
|
|
146
|
-
if (entry.name.startsWith('.'))
|
|
147
|
-
continue;
|
|
148
|
-
const full = path.join(dir, entry.name);
|
|
149
|
-
if (entry.isDirectory()) {
|
|
150
|
-
walk(full);
|
|
151
|
-
}
|
|
152
|
-
else if (entry.isFile()) {
|
|
153
|
-
if (dir === skillDir && entry.name === 'SKILL.md')
|
|
154
|
-
continue;
|
|
155
|
-
count++;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
};
|
|
159
|
-
walk(skillDir);
|
|
160
|
-
return count;
|
|
161
|
-
}
|
|
162
|
-
export function discoverSkillsFromRepo(repoPath) {
|
|
163
|
-
const skills = [];
|
|
164
|
-
// Look for skills in common locations
|
|
165
|
-
const searchPaths = [
|
|
166
|
-
path.join(repoPath, 'skills'),
|
|
167
|
-
path.join(repoPath, 'agent-skills'),
|
|
168
|
-
repoPath, // Root level skill directories
|
|
169
|
-
];
|
|
170
|
-
for (const searchPath of searchPaths) {
|
|
171
|
-
if (!fs.existsSync(searchPath))
|
|
172
|
-
continue;
|
|
173
|
-
try {
|
|
174
|
-
const entries = fs.readdirSync(searchPath, { withFileTypes: true });
|
|
175
|
-
for (const entry of entries) {
|
|
176
|
-
if (!entry.isDirectory())
|
|
177
|
-
continue;
|
|
178
|
-
// Skip hidden directories (e.g., .system)
|
|
179
|
-
if (entry.name.startsWith('.'))
|
|
180
|
-
continue;
|
|
181
|
-
const skillDir = path.join(searchPath, entry.name);
|
|
182
|
-
const skillMdPath = path.join(skillDir, 'SKILL.md');
|
|
183
|
-
if (fs.existsSync(skillMdPath)) {
|
|
184
|
-
const parseResult = tryParseSkillMetadata(skillDir);
|
|
185
|
-
const validation = validateSkillMetadata(parseResult.metadata, entry.name);
|
|
186
|
-
// Include even if invalid (for discovery/listing with warnings)
|
|
187
|
-
skills.push({
|
|
188
|
-
name: entry.name,
|
|
189
|
-
path: skillDir,
|
|
190
|
-
metadata: parseResult.metadata || { name: entry.name, description: '' },
|
|
191
|
-
ruleCount: countSkillRules(skillDir),
|
|
192
|
-
validation,
|
|
193
|
-
parseError: parseResult.error,
|
|
194
|
-
});
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
catch {
|
|
199
|
-
// Skip inaccessible directories
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
return skills;
|
|
203
|
-
}
|
|
204
|
-
export function installSkill(sourcePath, skillName, agents, method = 'symlink') {
|
|
205
|
-
// Validate skill metadata before installation
|
|
206
|
-
const metadata = parseSkillMetadata(sourcePath);
|
|
207
|
-
const validation = validateSkillMetadata(metadata, skillName);
|
|
208
|
-
if (!validation.valid) {
|
|
209
|
-
return {
|
|
210
|
-
success: false,
|
|
211
|
-
error: `Invalid skill: ${validation.errors.join(', ')}`,
|
|
212
|
-
warnings: validation.warnings,
|
|
213
|
-
};
|
|
214
|
-
}
|
|
215
|
-
ensureCentralSkillsDir();
|
|
216
|
-
const centralPath = path.join(getSkillsDir(), skillName);
|
|
217
|
-
// Copy to central location if not already there
|
|
218
|
-
if (!fs.existsSync(centralPath)) {
|
|
219
|
-
try {
|
|
220
|
-
fs.cpSync(sourcePath, centralPath, { recursive: true });
|
|
221
|
-
}
|
|
222
|
-
catch (err) {
|
|
223
|
-
return { success: false, error: `Failed to copy skill: ${err.message}` };
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
// Symlink to each agent
|
|
227
|
-
for (const agentId of agents) {
|
|
228
|
-
if (!SKILLS_CAPABLE_AGENTS.includes(agentId)) {
|
|
229
|
-
continue;
|
|
230
|
-
}
|
|
231
|
-
ensureSkillsDir(agentId);
|
|
232
|
-
const agentSkillPath = path.join(getAgentSkillsDir(agentId), skillName);
|
|
233
|
-
// Remove existing if present
|
|
234
|
-
if (fs.existsSync(agentSkillPath)) {
|
|
235
|
-
try {
|
|
236
|
-
fs.rmSync(agentSkillPath, { recursive: true, force: true });
|
|
237
|
-
}
|
|
238
|
-
catch {
|
|
239
|
-
// Ignore removal errors
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
try {
|
|
243
|
-
if (method === 'symlink') {
|
|
244
|
-
fs.symlinkSync(centralPath, agentSkillPath, 'dir');
|
|
245
|
-
}
|
|
246
|
-
else {
|
|
247
|
-
fs.cpSync(centralPath, agentSkillPath, { recursive: true });
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
catch (err) {
|
|
251
|
-
return {
|
|
252
|
-
success: false,
|
|
253
|
-
error: `Failed to ${method} skill to ${agentId}: ${err.message}`,
|
|
254
|
-
};
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
return { success: true };
|
|
258
|
-
}
|
|
259
|
-
/**
|
|
260
|
-
* Check if a skill exists for an agent.
|
|
261
|
-
*/
|
|
262
|
-
export function skillExists(agentId, skillName) {
|
|
263
|
-
const agentSkillPath = path.join(getAgentSkillsDir(agentId), skillName);
|
|
264
|
-
return fs.existsSync(agentSkillPath);
|
|
265
|
-
}
|
|
266
|
-
/**
|
|
267
|
-
* Normalize content for comparison (trim, normalize line endings).
|
|
268
|
-
*/
|
|
269
|
-
function normalizeContent(content) {
|
|
270
|
-
return content.replace(/\r\n/g, '\n').trim();
|
|
271
|
-
}
|
|
272
|
-
/**
|
|
273
|
-
* Compare two directories recursively for content equality.
|
|
274
|
-
*/
|
|
275
|
-
function directoriesMatch(dir1, dir2) {
|
|
276
|
-
if (!fs.existsSync(dir1) || !fs.existsSync(dir2)) {
|
|
277
|
-
return fs.existsSync(dir1) === fs.existsSync(dir2);
|
|
278
|
-
}
|
|
279
|
-
try {
|
|
280
|
-
const files1 = fs.readdirSync(dir1).filter(f => f.endsWith('.md')).sort();
|
|
281
|
-
const files2 = fs.readdirSync(dir2).filter(f => f.endsWith('.md')).sort();
|
|
282
|
-
if (files1.length !== files2.length)
|
|
283
|
-
return false;
|
|
284
|
-
if (files1.join(',') !== files2.join(','))
|
|
285
|
-
return false;
|
|
286
|
-
for (const file of files1) {
|
|
287
|
-
const content1 = fs.readFileSync(path.join(dir1, file), 'utf-8');
|
|
288
|
-
const content2 = fs.readFileSync(path.join(dir2, file), 'utf-8');
|
|
289
|
-
if (normalizeContent(content1) !== normalizeContent(content2)) {
|
|
290
|
-
return false;
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
return true;
|
|
294
|
-
}
|
|
295
|
-
catch {
|
|
296
|
-
return false;
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
/**
|
|
300
|
-
* Check if installed skill content matches source content.
|
|
301
|
-
* Compares SKILL.md and all rules/*.md files.
|
|
302
|
-
*/
|
|
303
|
-
export function skillContentMatches(agentId, skillName, sourcePath) {
|
|
304
|
-
const installedPath = path.join(getAgentSkillsDir(agentId), skillName);
|
|
305
|
-
if (!fs.existsSync(installedPath) || !fs.existsSync(sourcePath)) {
|
|
306
|
-
return false;
|
|
307
|
-
}
|
|
308
|
-
try {
|
|
309
|
-
const installedSkillMd = path.join(installedPath, 'SKILL.md');
|
|
310
|
-
const sourceSkillMd = path.join(sourcePath, 'SKILL.md');
|
|
311
|
-
if (!fs.existsSync(installedSkillMd) || !fs.existsSync(sourceSkillMd)) {
|
|
312
|
-
return false;
|
|
313
|
-
}
|
|
314
|
-
const installedContent = fs.readFileSync(installedSkillMd, 'utf-8');
|
|
315
|
-
const sourceContent = fs.readFileSync(sourceSkillMd, 'utf-8');
|
|
316
|
-
if (normalizeContent(installedContent) !== normalizeContent(sourceContent)) {
|
|
317
|
-
return false;
|
|
318
|
-
}
|
|
319
|
-
const installedRulesDir = path.join(installedPath, 'rules');
|
|
320
|
-
const sourceRulesDir = path.join(sourcePath, 'rules');
|
|
321
|
-
return directoriesMatch(installedRulesDir, sourceRulesDir);
|
|
322
|
-
}
|
|
323
|
-
catch {
|
|
324
|
-
return false;
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
/**
|
|
328
|
-
* List skill names in the central ~/.agents/skills/ directory.
|
|
329
|
-
*/
|
|
330
|
-
export function listCentralSkills() {
|
|
331
|
-
const dir = getSkillsDir();
|
|
332
|
-
if (!fs.existsSync(dir))
|
|
333
|
-
return [];
|
|
334
|
-
return fs.readdirSync(dir, { withFileTypes: true })
|
|
335
|
-
.filter((e) => e.isDirectory() && !e.name.startsWith('.'))
|
|
336
|
-
.filter((e) => fs.existsSync(path.join(dir, e.name, 'SKILL.md')))
|
|
337
|
-
.map((e) => e.name)
|
|
338
|
-
.sort();
|
|
339
|
-
}
|
|
340
|
-
/**
|
|
341
|
-
* Path to the skills dir of a specific version home (not the active one).
|
|
342
|
-
*/
|
|
343
|
-
export function getVersionSkillsDir(agent, version) {
|
|
344
|
-
const home = getVersionHomePath(agent, version);
|
|
345
|
-
return path.join(home, `.${agent}`, 'skills');
|
|
346
|
-
}
|
|
347
|
-
/**
|
|
348
|
-
* List skill names installed in a specific version home.
|
|
349
|
-
*/
|
|
350
|
-
export function listSkillsInVersionHome(agent, version) {
|
|
351
|
-
const dir = getVersionSkillsDir(agent, version);
|
|
352
|
-
if (!fs.existsSync(dir))
|
|
353
|
-
return [];
|
|
354
|
-
return fs.readdirSync(dir, { withFileTypes: true })
|
|
355
|
-
.filter((e) => e.isDirectory() && !e.name.startsWith('.'))
|
|
356
|
-
.filter((e) => fs.existsSync(path.join(dir, e.name, 'SKILL.md')))
|
|
357
|
-
.map((e) => e.name)
|
|
358
|
-
.sort();
|
|
359
|
-
}
|
|
360
|
-
/**
|
|
361
|
-
* Check if a skill installed in a specific version matches central content.
|
|
362
|
-
*/
|
|
363
|
-
function versionSkillMatches(agent, version, skillName) {
|
|
364
|
-
const installedPath = path.join(getVersionSkillsDir(agent, version), skillName);
|
|
365
|
-
const centralPath = path.join(getSkillsDir(), skillName);
|
|
366
|
-
if (!fs.existsSync(installedPath) || !fs.existsSync(centralPath))
|
|
367
|
-
return false;
|
|
368
|
-
const installedSkillMd = path.join(installedPath, 'SKILL.md');
|
|
369
|
-
const centralSkillMd = path.join(centralPath, 'SKILL.md');
|
|
370
|
-
if (!fs.existsSync(installedSkillMd) || !fs.existsSync(centralSkillMd))
|
|
371
|
-
return false;
|
|
372
|
-
try {
|
|
373
|
-
if (normalizeContent(fs.readFileSync(installedSkillMd, 'utf-8')) !==
|
|
374
|
-
normalizeContent(fs.readFileSync(centralSkillMd, 'utf-8'))) {
|
|
375
|
-
return false;
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
catch {
|
|
379
|
-
return false;
|
|
380
|
-
}
|
|
381
|
-
return directoriesMatch(path.join(installedPath, 'rules'), path.join(centralPath, 'rules'));
|
|
382
|
-
}
|
|
383
|
-
/**
|
|
384
|
-
* Compare a version home's skills against central. Returns the reconciliation diff.
|
|
385
|
-
*/
|
|
386
|
-
export function diffVersionSkills(agent, version) {
|
|
387
|
-
const central = new Set(listCentralSkills());
|
|
388
|
-
const installed = new Set(listSkillsInVersionHome(agent, version));
|
|
389
|
-
const toAdd = [];
|
|
390
|
-
const toUpdate = [];
|
|
391
|
-
const matched = [];
|
|
392
|
-
const orphans = [];
|
|
393
|
-
for (const name of central) {
|
|
394
|
-
if (!installed.has(name)) {
|
|
395
|
-
toAdd.push(name);
|
|
396
|
-
}
|
|
397
|
-
else if (!versionSkillMatches(agent, version, name)) {
|
|
398
|
-
toUpdate.push(name);
|
|
399
|
-
}
|
|
400
|
-
else {
|
|
401
|
-
matched.push(name);
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
for (const name of installed) {
|
|
405
|
-
if (!central.has(name))
|
|
406
|
-
orphans.push(name);
|
|
407
|
-
}
|
|
408
|
-
return { agent, version, toAdd: toAdd.sort(), toUpdate: toUpdate.sort(), matched, orphans: orphans.sort() };
|
|
409
|
-
}
|
|
410
|
-
/**
|
|
411
|
-
* Walk a directory and return every file's path relative to base.
|
|
412
|
-
* Follows no symlinks. Returns empty set if the dir doesn't exist.
|
|
413
|
-
*/
|
|
414
|
-
function walkRelativeFiles(base) {
|
|
415
|
-
const out = new Set();
|
|
416
|
-
if (!fs.existsSync(base))
|
|
417
|
-
return out;
|
|
418
|
-
const stack = [''];
|
|
419
|
-
while (stack.length > 0) {
|
|
420
|
-
const rel = stack.pop();
|
|
421
|
-
const abs = path.join(base, rel);
|
|
422
|
-
let entries;
|
|
423
|
-
try {
|
|
424
|
-
entries = fs.readdirSync(abs, { withFileTypes: true });
|
|
425
|
-
}
|
|
426
|
-
catch {
|
|
427
|
-
continue;
|
|
428
|
-
}
|
|
429
|
-
for (const entry of entries) {
|
|
430
|
-
const childRel = rel ? path.join(rel, entry.name) : entry.name;
|
|
431
|
-
if (entry.isDirectory()) {
|
|
432
|
-
stack.push(childRel);
|
|
433
|
-
}
|
|
434
|
-
else if (entry.isFile()) {
|
|
435
|
-
out.add(childRel);
|
|
436
|
-
}
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
return out;
|
|
440
|
-
}
|
|
441
|
-
/**
|
|
442
|
-
* Install a single skill from central into a specific version home.
|
|
443
|
-
*
|
|
444
|
-
* Copy mode preserves any files that exist in the version home but NOT in
|
|
445
|
-
* central — e.g. user-populated `.env` alongside the git-tracked `.env.example`.
|
|
446
|
-
* Without this, re-running `sync` whenever central content changes would wipe
|
|
447
|
-
* local secrets.
|
|
448
|
-
*/
|
|
449
|
-
export function installSkillToVersion(agent, version, skillName, method = 'copy') {
|
|
450
|
-
const centralPath = path.join(getSkillsDir(), skillName);
|
|
451
|
-
if (!fs.existsSync(centralPath)) {
|
|
452
|
-
return { success: false, error: `Skill '${skillName}' not found in central` };
|
|
453
|
-
}
|
|
454
|
-
const skillsDir = getVersionSkillsDir(agent, version);
|
|
455
|
-
if (!fs.existsSync(skillsDir)) {
|
|
456
|
-
fs.mkdirSync(skillsDir, { recursive: true });
|
|
457
|
-
}
|
|
458
|
-
const target = path.join(skillsDir, skillName);
|
|
459
|
-
// Snapshot files unique to the version home so we can restore them after
|
|
460
|
-
// the fresh copy (copy mode only; symlink shares central so there's nothing
|
|
461
|
-
// local to preserve — and writing a .env into a symlinked skill would
|
|
462
|
-
// pollute the git-tracked central dir anyway).
|
|
463
|
-
const preserved = [];
|
|
464
|
-
if (method === 'copy' && fs.existsSync(target) && !fs.lstatSync(target).isSymbolicLink()) {
|
|
465
|
-
const centralFiles = walkRelativeFiles(centralPath);
|
|
466
|
-
const installedFiles = walkRelativeFiles(target);
|
|
467
|
-
for (const rel of installedFiles) {
|
|
468
|
-
if (centralFiles.has(rel))
|
|
469
|
-
continue;
|
|
470
|
-
try {
|
|
471
|
-
const abs = path.join(target, rel);
|
|
472
|
-
preserved.push({
|
|
473
|
-
rel,
|
|
474
|
-
buf: fs.readFileSync(abs),
|
|
475
|
-
mode: fs.statSync(abs).mode,
|
|
476
|
-
});
|
|
477
|
-
}
|
|
478
|
-
catch {
|
|
479
|
-
// Unreadable — skip rather than fail the whole install
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
if (fs.existsSync(target) || fs.lstatSync(target, { throwIfNoEntry: false })) {
|
|
484
|
-
try {
|
|
485
|
-
fs.rmSync(target, { recursive: true, force: true });
|
|
486
|
-
}
|
|
487
|
-
catch (err) {
|
|
488
|
-
return { success: false, error: `Failed to remove existing: ${err.message}` };
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
try {
|
|
492
|
-
if (method === 'symlink') {
|
|
493
|
-
fs.symlinkSync(centralPath, target, 'dir');
|
|
494
|
-
}
|
|
495
|
-
else {
|
|
496
|
-
fs.cpSync(centralPath, target, { recursive: true });
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
catch (err) {
|
|
500
|
-
return { success: false, error: `Failed to ${method}: ${err.message}` };
|
|
501
|
-
}
|
|
502
|
-
// Restore preserved files on top of the fresh copy.
|
|
503
|
-
for (const { rel, buf, mode } of preserved) {
|
|
504
|
-
try {
|
|
505
|
-
const dest = path.join(target, rel);
|
|
506
|
-
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
507
|
-
fs.writeFileSync(dest, buf);
|
|
508
|
-
fs.chmodSync(dest, mode);
|
|
509
|
-
}
|
|
510
|
-
catch {
|
|
511
|
-
// Best-effort; failure here shouldn't unwind the install
|
|
512
|
-
}
|
|
513
|
-
}
|
|
514
|
-
return { success: true };
|
|
515
|
-
}
|
|
516
|
-
/**
|
|
517
|
-
* Remove a single skill from a specific version home.
|
|
518
|
-
*/
|
|
519
|
-
export function removeSkillFromVersion(agent, version, skillName) {
|
|
520
|
-
const target = path.join(getVersionSkillsDir(agent, version), skillName);
|
|
521
|
-
if (!fs.existsSync(target) && !fs.lstatSync(target, { throwIfNoEntry: false })) {
|
|
522
|
-
return { success: true };
|
|
523
|
-
}
|
|
524
|
-
try {
|
|
525
|
-
fs.rmSync(target, { recursive: true, force: true });
|
|
526
|
-
}
|
|
527
|
-
catch (err) {
|
|
528
|
-
return { success: false, error: err.message };
|
|
529
|
-
}
|
|
530
|
-
return { success: true };
|
|
531
|
-
}
|
|
532
|
-
/**
|
|
533
|
-
* Iterate all (agent, version) pairs that support skills and are installed,
|
|
534
|
-
* optionally scoped to a single agent/version.
|
|
535
|
-
*/
|
|
536
|
-
export function iterSkillsCapableVersions(filter) {
|
|
537
|
-
const pairs = [];
|
|
538
|
-
const agents = filter?.agent ? [filter.agent] : SKILLS_CAPABLE_AGENTS;
|
|
539
|
-
for (const agent of agents) {
|
|
540
|
-
if (!SKILLS_CAPABLE_AGENTS.includes(agent))
|
|
541
|
-
continue;
|
|
542
|
-
const versions = listInstalledVersions(agent);
|
|
543
|
-
for (const version of versions) {
|
|
544
|
-
if (filter?.version && filter.version !== version)
|
|
545
|
-
continue;
|
|
546
|
-
pairs.push({ agent, version });
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
return pairs;
|
|
550
|
-
}
|
|
551
|
-
export function uninstallSkill(skillName) {
|
|
552
|
-
// Remove from central location
|
|
553
|
-
const centralPath = path.join(getSkillsDir(), skillName);
|
|
554
|
-
if (!fs.existsSync(centralPath)) {
|
|
555
|
-
return { success: false, error: `Skill '${skillName}' not found` };
|
|
556
|
-
}
|
|
557
|
-
// Remove from all agents
|
|
558
|
-
for (const agentId of SKILLS_CAPABLE_AGENTS) {
|
|
559
|
-
const agentSkillPath = path.join(getAgentSkillsDir(agentId), skillName);
|
|
560
|
-
if (fs.existsSync(agentSkillPath)) {
|
|
561
|
-
try {
|
|
562
|
-
fs.rmSync(agentSkillPath, { recursive: true, force: true });
|
|
563
|
-
}
|
|
564
|
-
catch {
|
|
565
|
-
// Ignore removal errors
|
|
566
|
-
}
|
|
567
|
-
}
|
|
568
|
-
}
|
|
569
|
-
try {
|
|
570
|
-
fs.rmSync(centralPath, { recursive: true, force: true });
|
|
571
|
-
}
|
|
572
|
-
catch {
|
|
573
|
-
// Ignore removal errors
|
|
574
|
-
}
|
|
575
|
-
return { success: true };
|
|
576
|
-
}
|
|
577
|
-
export function listInstalledSkills() {
|
|
578
|
-
const skills = new Map();
|
|
579
|
-
const centralDir = getSkillsDir();
|
|
580
|
-
if (!fs.existsSync(centralDir)) {
|
|
581
|
-
return skills;
|
|
582
|
-
}
|
|
583
|
-
try {
|
|
584
|
-
const entries = fs.readdirSync(centralDir, { withFileTypes: true });
|
|
585
|
-
for (const entry of entries) {
|
|
586
|
-
if (!entry.isDirectory())
|
|
587
|
-
continue;
|
|
588
|
-
// Skip hidden directories (e.g., .system)
|
|
589
|
-
if (entry.name.startsWith('.'))
|
|
590
|
-
continue;
|
|
591
|
-
const skillDir = path.join(centralDir, entry.name);
|
|
592
|
-
const metadata = parseSkillMetadata(skillDir);
|
|
593
|
-
const validation = validateSkillMetadata(metadata, entry.name);
|
|
594
|
-
if (metadata) {
|
|
595
|
-
skills.set(entry.name, {
|
|
596
|
-
name: entry.name,
|
|
597
|
-
path: skillDir,
|
|
598
|
-
metadata,
|
|
599
|
-
ruleCount: countSkillRules(skillDir),
|
|
600
|
-
validation,
|
|
601
|
-
});
|
|
602
|
-
}
|
|
603
|
-
}
|
|
604
|
-
}
|
|
605
|
-
catch {
|
|
606
|
-
// Ignore errors
|
|
607
|
-
}
|
|
608
|
-
return skills;
|
|
609
|
-
}
|
|
610
|
-
export function listInstalledSkillsWithScope(agentId, cwd = process.cwd(), options) {
|
|
611
|
-
const results = [];
|
|
612
|
-
const seen = new Set();
|
|
613
|
-
// Project-scoped skills
|
|
614
|
-
const projectCandidates = [];
|
|
615
|
-
const projectAgentsDir = getProjectAgentsDir(cwd);
|
|
616
|
-
if (projectAgentsDir) {
|
|
617
|
-
projectCandidates.push(path.join(projectAgentsDir, 'skills'));
|
|
618
|
-
}
|
|
619
|
-
projectCandidates.push(path.join(cwd, `.${agentId}`, 'skills'));
|
|
620
|
-
for (const projectSkillsDir of projectCandidates) {
|
|
621
|
-
if (!fs.existsSync(projectSkillsDir))
|
|
622
|
-
continue;
|
|
623
|
-
try {
|
|
624
|
-
const entries = fs.readdirSync(projectSkillsDir, { withFileTypes: true });
|
|
625
|
-
for (const entry of entries) {
|
|
626
|
-
if (entry.name.startsWith('.'))
|
|
627
|
-
continue;
|
|
628
|
-
const skillDir = path.join(projectSkillsDir, entry.name);
|
|
629
|
-
let isDir = entry.isDirectory();
|
|
630
|
-
if (entry.isSymbolicLink()) {
|
|
631
|
-
try {
|
|
632
|
-
const stat = fs.statSync(skillDir);
|
|
633
|
-
isDir = stat.isDirectory();
|
|
634
|
-
}
|
|
635
|
-
catch {
|
|
636
|
-
continue;
|
|
637
|
-
}
|
|
638
|
-
}
|
|
639
|
-
if (!isDir)
|
|
640
|
-
continue;
|
|
641
|
-
const result = tryParseSkillMetadata(skillDir);
|
|
642
|
-
if (result.metadata && !seen.has(entry.name)) {
|
|
643
|
-
results.push({
|
|
644
|
-
name: entry.name,
|
|
645
|
-
path: skillDir,
|
|
646
|
-
metadata: result.metadata,
|
|
647
|
-
ruleCount: countSkillRules(skillDir),
|
|
648
|
-
scope: 'project',
|
|
649
|
-
agent: agentId,
|
|
650
|
-
});
|
|
651
|
-
seen.add(entry.name);
|
|
652
|
-
}
|
|
653
|
-
else if (result.error && options?.errors && !seen.has(entry.name)) {
|
|
654
|
-
options.errors.push({
|
|
655
|
-
name: entry.name,
|
|
656
|
-
path: skillDir,
|
|
657
|
-
error: result.error,
|
|
658
|
-
scope: 'project',
|
|
659
|
-
});
|
|
660
|
-
seen.add(entry.name);
|
|
661
|
-
}
|
|
662
|
-
}
|
|
663
|
-
}
|
|
664
|
-
catch {
|
|
665
|
-
// Ignore errors
|
|
666
|
-
}
|
|
667
|
-
}
|
|
668
|
-
// User-scoped skills (version-aware when home is provided)
|
|
669
|
-
const userSkillsDir = options?.home
|
|
670
|
-
? path.join(options.home, `.${agentId}`, 'skills')
|
|
671
|
-
: getAgentSkillsDir(agentId);
|
|
672
|
-
if (fs.existsSync(userSkillsDir)) {
|
|
673
|
-
try {
|
|
674
|
-
const entries = fs.readdirSync(userSkillsDir, { withFileTypes: true });
|
|
675
|
-
for (const entry of entries) {
|
|
676
|
-
if (entry.name.startsWith('.'))
|
|
677
|
-
continue;
|
|
678
|
-
const skillDir = path.join(userSkillsDir, entry.name);
|
|
679
|
-
let isDir = entry.isDirectory();
|
|
680
|
-
if (entry.isSymbolicLink()) {
|
|
681
|
-
try {
|
|
682
|
-
const stat = fs.statSync(skillDir);
|
|
683
|
-
isDir = stat.isDirectory();
|
|
684
|
-
}
|
|
685
|
-
catch {
|
|
686
|
-
continue;
|
|
687
|
-
}
|
|
688
|
-
}
|
|
689
|
-
if (!isDir)
|
|
690
|
-
continue;
|
|
691
|
-
const result = tryParseSkillMetadata(skillDir);
|
|
692
|
-
if (result.metadata && !seen.has(entry.name)) {
|
|
693
|
-
results.push({
|
|
694
|
-
name: entry.name,
|
|
695
|
-
path: skillDir,
|
|
696
|
-
metadata: result.metadata,
|
|
697
|
-
ruleCount: countSkillRules(skillDir),
|
|
698
|
-
scope: 'user',
|
|
699
|
-
agent: agentId,
|
|
700
|
-
});
|
|
701
|
-
seen.add(entry.name);
|
|
702
|
-
}
|
|
703
|
-
else if (result.error && options?.errors && !seen.has(entry.name)) {
|
|
704
|
-
options.errors.push({
|
|
705
|
-
name: entry.name,
|
|
706
|
-
path: skillDir,
|
|
707
|
-
error: result.error,
|
|
708
|
-
scope: 'user',
|
|
709
|
-
});
|
|
710
|
-
seen.add(entry.name);
|
|
711
|
-
}
|
|
712
|
-
}
|
|
713
|
-
}
|
|
714
|
-
catch {
|
|
715
|
-
// Ignore errors
|
|
716
|
-
}
|
|
717
|
-
}
|
|
718
|
-
return results;
|
|
719
|
-
}
|
|
720
|
-
export function getSkillInfo(skillName) {
|
|
721
|
-
const centralPath = path.join(getSkillsDir(), skillName);
|
|
722
|
-
if (!fs.existsSync(centralPath)) {
|
|
723
|
-
return null;
|
|
724
|
-
}
|
|
725
|
-
const metadata = parseSkillMetadata(centralPath);
|
|
726
|
-
const validation = validateSkillMetadata(metadata, skillName);
|
|
727
|
-
if (!metadata) {
|
|
728
|
-
return null;
|
|
729
|
-
}
|
|
730
|
-
return {
|
|
731
|
-
name: skillName,
|
|
732
|
-
path: centralPath,
|
|
733
|
-
metadata,
|
|
734
|
-
ruleCount: countSkillRules(centralPath),
|
|
735
|
-
validation,
|
|
736
|
-
};
|
|
737
|
-
}
|
|
738
|
-
export function getSkillRules(skillName) {
|
|
739
|
-
const centralPath = path.join(getSkillsDir(), skillName);
|
|
740
|
-
const rulesDir = path.join(centralPath, 'rules');
|
|
741
|
-
if (!fs.existsSync(rulesDir)) {
|
|
742
|
-
return [];
|
|
743
|
-
}
|
|
744
|
-
try {
|
|
745
|
-
const files = fs.readdirSync(rulesDir);
|
|
746
|
-
return files.filter((f) => f.endsWith('.md')).map((f) => f.replace(/\.md$/, ''));
|
|
747
|
-
}
|
|
748
|
-
catch {
|
|
749
|
-
return [];
|
|
750
|
-
}
|
|
751
|
-
}
|
|
752
|
-
/**
|
|
753
|
-
* Install a skill to central ~/.agents/skills/ directory only.
|
|
754
|
-
* Does not create per-agent symlinks (shims handle that for synced agents).
|
|
755
|
-
*/
|
|
756
|
-
export function installSkillCentrally(sourcePath, skillName) {
|
|
757
|
-
// Validate skill metadata (warnings only, don't block installation)
|
|
758
|
-
const metadata = parseSkillMetadata(sourcePath);
|
|
759
|
-
const validation = validateSkillMetadata(metadata, skillName);
|
|
760
|
-
const allWarnings = [...validation.warnings];
|
|
761
|
-
// Convert validation errors to warnings instead of blocking
|
|
762
|
-
if (!validation.valid) {
|
|
763
|
-
allWarnings.push(...validation.errors.map(e => `Validation: ${e}`));
|
|
764
|
-
}
|
|
765
|
-
ensureCentralSkillsDir();
|
|
766
|
-
const centralPath = path.join(getSkillsDir(), skillName);
|
|
767
|
-
// Resolve to absolute paths for comparison
|
|
768
|
-
const resolvedSource = path.resolve(sourcePath);
|
|
769
|
-
const resolvedCentral = path.resolve(centralPath);
|
|
770
|
-
// If source is already the central path, nothing to copy
|
|
771
|
-
if (resolvedSource === resolvedCentral) {
|
|
772
|
-
return { success: true, warnings: allWarnings.length > 0 ? allWarnings : undefined };
|
|
773
|
-
}
|
|
774
|
-
// Remove existing if present
|
|
775
|
-
if (fs.existsSync(centralPath)) {
|
|
776
|
-
try {
|
|
777
|
-
fs.rmSync(centralPath, { recursive: true, force: true });
|
|
778
|
-
}
|
|
779
|
-
catch {
|
|
780
|
-
// Ignore removal errors
|
|
781
|
-
}
|
|
782
|
-
}
|
|
783
|
-
try {
|
|
784
|
-
fs.cpSync(sourcePath, centralPath, { recursive: true });
|
|
785
|
-
return { success: true, warnings: allWarnings.length > 0 ? allWarnings : undefined };
|
|
786
|
-
}
|
|
787
|
-
catch (err) {
|
|
788
|
-
return { success: false, error: `Failed to copy skill: ${err.message}` };
|
|
789
|
-
}
|
|
790
|
-
}
|
|
791
|
-
//# sourceMappingURL=skills.js.map
|