@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/commands/skills.js
DELETED
|
@@ -1,717 +0,0 @@
|
|
|
1
|
-
import chalk from 'chalk';
|
|
2
|
-
import ora from 'ora';
|
|
3
|
-
import * as fs from 'fs';
|
|
4
|
-
import * as os from 'os';
|
|
5
|
-
import * as path from 'path';
|
|
6
|
-
import { select, checkbox, confirm } from '@inquirer/prompts';
|
|
7
|
-
import { SKILLS_CAPABLE_AGENTS, resolveAgentName, formatAgentError, agentLabel, } from '../lib/agents.js';
|
|
8
|
-
import { cloneRepo } from '../lib/git.js';
|
|
9
|
-
import { discoverSkillsFromRepo, installSkillCentrally, uninstallSkill, listInstalledSkills, listInstalledSkillsWithScope, getSkillInfo, getSkillRules, getSkillsDir, countSkillFiles, tryParseSkillMetadata, diffVersionSkills, installSkillToVersion, removeSkillFromVersion, iterSkillsCapableVersions, } from '../lib/skills.js';
|
|
10
|
-
import { getGlobalDefault, syncResourcesToVersion, promptAgentVersionSelection, resolveAgentVersionTargets, } from '../lib/versions.js';
|
|
11
|
-
import { recordVersionResources } from '../lib/state.js';
|
|
12
|
-
import { isPromptCancelled, isInteractiveTerminal, parseCommaSeparatedList, printWithPager, requireInteractiveSelection, } from './utils.js';
|
|
13
|
-
import { showResourceList, buildTargetsSection, } from './resource-view.js';
|
|
14
|
-
/** Register the `agents skills` command tree (list, add, remove, sync, prune, view). */
|
|
15
|
-
export function registerSkillsCommands(program) {
|
|
16
|
-
const skillsCmd = program
|
|
17
|
-
.command('skills')
|
|
18
|
-
.description('Add domain-specific capabilities to agents via packaged SKILL.md files')
|
|
19
|
-
.addHelpText('after', `
|
|
20
|
-
Skills are structured bundles (SKILL.md + rules/) that teach agents specialized domains: API conventions, testing patterns, code review checklists. Each skill can ship with its own rules that only apply when the skill is invoked.
|
|
21
|
-
|
|
22
|
-
Examples:
|
|
23
|
-
# See what skills are installed
|
|
24
|
-
agents skills list
|
|
25
|
-
|
|
26
|
-
# Check skills for a specific agent version
|
|
27
|
-
agents skills list claude@2.1.112
|
|
28
|
-
|
|
29
|
-
# Install a skill from GitHub
|
|
30
|
-
agents skills add gh:anthropics/skills --agents codex,claude
|
|
31
|
-
|
|
32
|
-
# Interactive: pick from ~/.agents/skills/
|
|
33
|
-
agents skills add
|
|
34
|
-
|
|
35
|
-
# Install a specific skill by name
|
|
36
|
-
agents skills add --names api-testing --agents codex@0.116.0
|
|
37
|
-
|
|
38
|
-
When to use:
|
|
39
|
-
- Onboarding: 'agents skills add gh:team/skills' to share expertise across the team
|
|
40
|
-
- Specialization: install domain skills (rush-product-knowledge, rdev) per project
|
|
41
|
-
- Version isolation: install different skills to different versions for experimentation
|
|
42
|
-
`);
|
|
43
|
-
skillsCmd
|
|
44
|
-
.command('list [agent]')
|
|
45
|
-
.description('Show which skills are installed and which agent versions they are synced to')
|
|
46
|
-
.option('-a, --agent <agent>', 'Filter to a specific agent (alternative to positional arg)')
|
|
47
|
-
.action(async (agentArg, options) => {
|
|
48
|
-
const spinner = ora({ text: 'Loading...', isSilent: !process.stdout.isTTY }).start();
|
|
49
|
-
const agentInput = agentArg || options.agent;
|
|
50
|
-
let filterAgent;
|
|
51
|
-
let filterVersion;
|
|
52
|
-
if (agentInput) {
|
|
53
|
-
const parts = agentInput.split('@');
|
|
54
|
-
const resolved = resolveAgentName(parts[0]);
|
|
55
|
-
if (!resolved) {
|
|
56
|
-
spinner.stop();
|
|
57
|
-
console.log(chalk.red(formatAgentError(parts[0], SKILLS_CAPABLE_AGENTS)));
|
|
58
|
-
process.exit(1);
|
|
59
|
-
}
|
|
60
|
-
filterAgent = resolved;
|
|
61
|
-
filterVersion = parts[1] || undefined;
|
|
62
|
-
}
|
|
63
|
-
const rows = await buildSkillRows({ filterAgent, filterVersion });
|
|
64
|
-
spinner.stop();
|
|
65
|
-
await showResourceList({
|
|
66
|
-
resourcePlural: 'skills',
|
|
67
|
-
resourceSingular: 'skill',
|
|
68
|
-
extraLabel: 'Files',
|
|
69
|
-
rows,
|
|
70
|
-
emptyMessage: filterAgent
|
|
71
|
-
? `No skills in central storage for ${agentLabel(filterAgent)}.`
|
|
72
|
-
: 'No skills in ~/.agents/skills/. Add one with: agents skills add gh:user/repo',
|
|
73
|
-
centralPath: getSkillsDir(),
|
|
74
|
-
filterAgent,
|
|
75
|
-
filterVersion,
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
skillsCmd
|
|
79
|
-
.command('add [source]')
|
|
80
|
-
.description('Install skills from a source (GitHub, local) or pick from central storage')
|
|
81
|
-
.option('-a, --agents <list>', 'Targets: claude, codex@0.116.0, or gemini@default')
|
|
82
|
-
.option('--names <list>', 'Skill names from ~/.agents/skills/ (comma-separated)')
|
|
83
|
-
.option('-y, --yes', 'Skip all prompts')
|
|
84
|
-
.addHelpText('after', `
|
|
85
|
-
Examples:
|
|
86
|
-
# Interactive picker from ~/.agents/skills/
|
|
87
|
-
agents skills add
|
|
88
|
-
|
|
89
|
-
# Install a specific skill to one version
|
|
90
|
-
agents skills add --names api-testing --agents codex@0.116.0
|
|
91
|
-
|
|
92
|
-
# Clone and install skills from GitHub
|
|
93
|
-
agents skills add gh:anthropics/skills --agents claude,codex
|
|
94
|
-
|
|
95
|
-
# Add a local skill directory (must contain SKILL.md)
|
|
96
|
-
agents skills add ~/my-skill --agents claude@default
|
|
97
|
-
`)
|
|
98
|
-
.action(async (source, options) => {
|
|
99
|
-
try {
|
|
100
|
-
let skills;
|
|
101
|
-
if (!source) {
|
|
102
|
-
// Interactive mode: pick from central storage
|
|
103
|
-
const installedSkills = listInstalledSkills();
|
|
104
|
-
if (installedSkills.size === 0) {
|
|
105
|
-
console.log(chalk.yellow('No skills in ~/.agents/skills/'));
|
|
106
|
-
console.log(chalk.gray('\nTo add skills from a repo:'));
|
|
107
|
-
console.log(chalk.cyan(' agents skills add gh:user/repo'));
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
const availableSkills = Array.from(installedSkills.keys());
|
|
111
|
-
const requestedNames = parseCommaSeparatedList(options.names);
|
|
112
|
-
let selectedNames;
|
|
113
|
-
if (requestedNames.length > 0) {
|
|
114
|
-
const missing = requestedNames.filter((name) => !installedSkills.has(name));
|
|
115
|
-
if (missing.length > 0) {
|
|
116
|
-
console.log(chalk.red(`Unknown skill(s): ${missing.join(', ')}`));
|
|
117
|
-
console.log(chalk.gray(`Available: ${availableSkills.join(', ')}`));
|
|
118
|
-
process.exit(1);
|
|
119
|
-
}
|
|
120
|
-
selectedNames = requestedNames;
|
|
121
|
-
}
|
|
122
|
-
else {
|
|
123
|
-
if (!isInteractiveTerminal()) {
|
|
124
|
-
requireInteractiveSelection('Selecting skills from ~/.agents/skills/', [
|
|
125
|
-
'agents skills add --names agents-cli --agents codex',
|
|
126
|
-
'agents skills add gh:user/repo --agents codex',
|
|
127
|
-
]);
|
|
128
|
-
}
|
|
129
|
-
const choices = Array.from(installedSkills.entries()).map(([name, skill]) => ({
|
|
130
|
-
value: name,
|
|
131
|
-
name: skill.metadata.description
|
|
132
|
-
? `${name} ${chalk.gray(skill.metadata.description.slice(0, 50))}`
|
|
133
|
-
: name,
|
|
134
|
-
}));
|
|
135
|
-
const selected = await checkbox({
|
|
136
|
-
message: 'Select skills to install',
|
|
137
|
-
choices: [
|
|
138
|
-
{ value: '__all__', name: chalk.bold('Select All') },
|
|
139
|
-
...choices,
|
|
140
|
-
],
|
|
141
|
-
});
|
|
142
|
-
if (selected.length === 0) {
|
|
143
|
-
console.log(chalk.gray('No skills selected.'));
|
|
144
|
-
return;
|
|
145
|
-
}
|
|
146
|
-
selectedNames = selected.includes('__all__')
|
|
147
|
-
? availableSkills
|
|
148
|
-
: selected.filter((s) => s !== '__all__');
|
|
149
|
-
}
|
|
150
|
-
skills = selectedNames.map((name) => {
|
|
151
|
-
const skill = installedSkills.get(name);
|
|
152
|
-
return { name, metadata: skill?.metadata || {} };
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
else {
|
|
156
|
-
// Source provided: fetch from repo or local path
|
|
157
|
-
const spinner = ora('Fetching skills...').start();
|
|
158
|
-
const isGitRepo = source.startsWith('gh:') || source.startsWith('git:') ||
|
|
159
|
-
source.startsWith('ssh:') || source.startsWith('https://') ||
|
|
160
|
-
source.startsWith('http://');
|
|
161
|
-
let localPath;
|
|
162
|
-
let discoveredSkills;
|
|
163
|
-
if (isGitRepo) {
|
|
164
|
-
const result = await cloneRepo(source);
|
|
165
|
-
localPath = result.localPath;
|
|
166
|
-
discoveredSkills = discoverSkillsFromRepo(localPath);
|
|
167
|
-
spinner.succeed('Repository cloned');
|
|
168
|
-
}
|
|
169
|
-
else {
|
|
170
|
-
localPath = source.startsWith('~')
|
|
171
|
-
? path.join(os.homedir(), source.slice(1))
|
|
172
|
-
: path.resolve(source);
|
|
173
|
-
if (!fs.existsSync(localPath)) {
|
|
174
|
-
spinner.fail(`Path not found: ${localPath}`);
|
|
175
|
-
return;
|
|
176
|
-
}
|
|
177
|
-
const skillMdPath = path.join(localPath, 'SKILL.md');
|
|
178
|
-
if (fs.existsSync(skillMdPath)) {
|
|
179
|
-
const skillName = path.basename(localPath);
|
|
180
|
-
const { validateSkillMetadata, countSkillRules } = await import('../lib/skills.js');
|
|
181
|
-
const parseResult = tryParseSkillMetadata(localPath);
|
|
182
|
-
const validation = validateSkillMetadata(parseResult.metadata, skillName);
|
|
183
|
-
// Warn if YAML is invalid
|
|
184
|
-
if (parseResult.error) {
|
|
185
|
-
spinner.warn(`Skill '${skillName}' has invalid SKILL.md`);
|
|
186
|
-
console.log(chalk.yellow(` ${parseResult.error}`));
|
|
187
|
-
console.log(chalk.gray(' The skill will be installed but may not appear in listings.\n'));
|
|
188
|
-
}
|
|
189
|
-
else {
|
|
190
|
-
spinner.succeed('Using skill directory');
|
|
191
|
-
}
|
|
192
|
-
discoveredSkills = [{
|
|
193
|
-
name: skillName,
|
|
194
|
-
path: localPath,
|
|
195
|
-
metadata: parseResult.metadata || { name: skillName, description: '' },
|
|
196
|
-
ruleCount: countSkillRules(localPath),
|
|
197
|
-
validation,
|
|
198
|
-
}];
|
|
199
|
-
}
|
|
200
|
-
else {
|
|
201
|
-
discoveredSkills = discoverSkillsFromRepo(localPath);
|
|
202
|
-
spinner.succeed('Using local path');
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
console.log(chalk.bold(`\nFound ${discoveredSkills.length} skill(s):`));
|
|
206
|
-
if (discoveredSkills.length === 0) {
|
|
207
|
-
console.log(chalk.yellow('No skills found (looking for SKILL.md files)'));
|
|
208
|
-
return;
|
|
209
|
-
}
|
|
210
|
-
for (const skill of discoveredSkills) {
|
|
211
|
-
const nameColor = skill.parseError ? chalk.yellow : chalk.cyan;
|
|
212
|
-
console.log(`\n ${nameColor(skill.name)}: ${skill.metadata.description || 'no description'}`);
|
|
213
|
-
if (skill.ruleCount > 0) {
|
|
214
|
-
console.log(` ${chalk.gray(`${skill.ruleCount} rules`)}`);
|
|
215
|
-
}
|
|
216
|
-
if (skill.parseError) {
|
|
217
|
-
console.log(` ${chalk.yellow('Warning:')} ${chalk.gray(skill.parseError)}`);
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
// Install to central storage first
|
|
221
|
-
const installSpinner = ora('Installing skills to central storage...').start();
|
|
222
|
-
let installed = 0;
|
|
223
|
-
for (const skill of discoveredSkills) {
|
|
224
|
-
const result = installSkillCentrally(skill.path, skill.name);
|
|
225
|
-
if (result.success) {
|
|
226
|
-
installed++;
|
|
227
|
-
}
|
|
228
|
-
else {
|
|
229
|
-
installSpinner.stop();
|
|
230
|
-
console.log(chalk.red(`\n Failed to install ${skill.name}: ${result.error}`));
|
|
231
|
-
installSpinner.start();
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
installSpinner.succeed(`Installed ${installed} skills to ~/.agents/skills/`);
|
|
235
|
-
skills = discoveredSkills;
|
|
236
|
-
}
|
|
237
|
-
// Get agent and version selection
|
|
238
|
-
let selectedAgents;
|
|
239
|
-
let versionSelections;
|
|
240
|
-
if (options.agents) {
|
|
241
|
-
const result = resolveAgentVersionTargets(options.agents, SKILLS_CAPABLE_AGENTS);
|
|
242
|
-
selectedAgents = result.selectedAgents;
|
|
243
|
-
versionSelections = result.versionSelections;
|
|
244
|
-
}
|
|
245
|
-
else {
|
|
246
|
-
const result = await promptAgentVersionSelection(SKILLS_CAPABLE_AGENTS, {
|
|
247
|
-
skipPrompts: options.yes || !isInteractiveTerminal(),
|
|
248
|
-
});
|
|
249
|
-
selectedAgents = result.selectedAgents;
|
|
250
|
-
versionSelections = result.versionSelections;
|
|
251
|
-
}
|
|
252
|
-
if (selectedAgents.length === 0) {
|
|
253
|
-
console.log(chalk.yellow('\nNo agents selected.'));
|
|
254
|
-
return;
|
|
255
|
-
}
|
|
256
|
-
// Sync to selected versions
|
|
257
|
-
const syncSpinner = ora('Syncing to agent versions...').start();
|
|
258
|
-
let synced = 0;
|
|
259
|
-
const skillNames = skills.map((s) => s.name);
|
|
260
|
-
for (const [agentId, versions] of versionSelections) {
|
|
261
|
-
for (const version of versions) {
|
|
262
|
-
syncResourcesToVersion(agentId, version);
|
|
263
|
-
recordVersionResources(agentId, version, 'skills', skillNames);
|
|
264
|
-
synced++;
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
if (synced > 0) {
|
|
268
|
-
syncSpinner.succeed(`Synced to ${synced} agent version(s)`);
|
|
269
|
-
}
|
|
270
|
-
else {
|
|
271
|
-
syncSpinner.info('No version-managed agents to sync');
|
|
272
|
-
}
|
|
273
|
-
console.log(chalk.green('\nSkills installed.'));
|
|
274
|
-
}
|
|
275
|
-
catch (err) {
|
|
276
|
-
if (isPromptCancelled(err)) {
|
|
277
|
-
console.log(chalk.gray('\nCancelled'));
|
|
278
|
-
return;
|
|
279
|
-
}
|
|
280
|
-
console.error(chalk.red('Failed to add skills'));
|
|
281
|
-
console.error(chalk.red(err.message));
|
|
282
|
-
process.exit(1);
|
|
283
|
-
}
|
|
284
|
-
});
|
|
285
|
-
skillsCmd
|
|
286
|
-
.command('remove [name]')
|
|
287
|
-
.description('Delete a skill from central storage (interactive picker if no name given)')
|
|
288
|
-
.addHelpText('after', `
|
|
289
|
-
Examples:
|
|
290
|
-
# Remove a skill by name
|
|
291
|
-
agents skills remove api-testing
|
|
292
|
-
|
|
293
|
-
# Interactive: pick skills to remove
|
|
294
|
-
agents skills remove
|
|
295
|
-
`)
|
|
296
|
-
.action(async (name) => {
|
|
297
|
-
let skillsToRemove;
|
|
298
|
-
if (name) {
|
|
299
|
-
skillsToRemove = [name];
|
|
300
|
-
}
|
|
301
|
-
else {
|
|
302
|
-
// Interactive picker
|
|
303
|
-
const installedSkills = listInstalledSkills();
|
|
304
|
-
if (installedSkills.size === 0) {
|
|
305
|
-
console.log(chalk.yellow('No skills installed.'));
|
|
306
|
-
return;
|
|
307
|
-
}
|
|
308
|
-
if (!isInteractiveTerminal()) {
|
|
309
|
-
requireInteractiveSelection('Selecting skills to remove', [
|
|
310
|
-
'agents skills remove agents-cli',
|
|
311
|
-
]);
|
|
312
|
-
}
|
|
313
|
-
try {
|
|
314
|
-
const choices = Array.from(installedSkills.entries()).map(([skillName, skill]) => ({
|
|
315
|
-
value: skillName,
|
|
316
|
-
name: skill.metadata.description
|
|
317
|
-
? `${skillName} - ${skill.metadata.description}`
|
|
318
|
-
: skillName,
|
|
319
|
-
}));
|
|
320
|
-
const selected = await checkbox({
|
|
321
|
-
message: 'Select skills to remove',
|
|
322
|
-
choices,
|
|
323
|
-
});
|
|
324
|
-
if (selected.length === 0) {
|
|
325
|
-
console.log(chalk.gray('No skills selected.'));
|
|
326
|
-
return;
|
|
327
|
-
}
|
|
328
|
-
skillsToRemove = selected;
|
|
329
|
-
}
|
|
330
|
-
catch (err) {
|
|
331
|
-
if (isPromptCancelled(err)) {
|
|
332
|
-
console.log(chalk.gray('Cancelled'));
|
|
333
|
-
return;
|
|
334
|
-
}
|
|
335
|
-
throw err;
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
for (const skillName of skillsToRemove) {
|
|
339
|
-
const result = uninstallSkill(skillName);
|
|
340
|
-
if (result.success) {
|
|
341
|
-
console.log(chalk.green(`Removed skill '${skillName}'`));
|
|
342
|
-
}
|
|
343
|
-
else {
|
|
344
|
-
console.log(chalk.red(result.error || `Failed to remove skill '${skillName}'`));
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
});
|
|
348
|
-
skillsCmd
|
|
349
|
-
.command('sync')
|
|
350
|
-
.description('Reconcile version-home skills against central ~/.agents/skills/ (add + update, never delete)')
|
|
351
|
-
.option('-a, --agent <agent>', 'Scope to a specific agent or agent@version')
|
|
352
|
-
.option('-m, --method <method>', 'Install method: copy (default) or symlink', 'copy')
|
|
353
|
-
.addHelpText('after', `
|
|
354
|
-
Examples:
|
|
355
|
-
# Sync every installed version of every skills-capable agent
|
|
356
|
-
agents skills sync
|
|
357
|
-
|
|
358
|
-
# Scope to one agent
|
|
359
|
-
agents skills sync --agent claude
|
|
360
|
-
|
|
361
|
-
# Scope to one version
|
|
362
|
-
agents skills sync --agent claude@2.1.113
|
|
363
|
-
|
|
364
|
-
# Symlink into version homes (central updates propagate automatically)
|
|
365
|
-
agents skills sync --method symlink
|
|
366
|
-
|
|
367
|
-
Sync is additive: it installs missing skills and refreshes changed ones. To
|
|
368
|
-
remove orphans (skills in a version home but not in central), use 'agents
|
|
369
|
-
skills prune'.
|
|
370
|
-
`)
|
|
371
|
-
.action(async (options) => {
|
|
372
|
-
const method = (options.method === 'symlink' ? 'symlink' : 'copy');
|
|
373
|
-
let filter;
|
|
374
|
-
if (options.agent) {
|
|
375
|
-
const [name, version] = String(options.agent).split('@');
|
|
376
|
-
const agentId = resolveAgentName(name);
|
|
377
|
-
if (!agentId) {
|
|
378
|
-
console.log(chalk.red(formatAgentError(name, SKILLS_CAPABLE_AGENTS)));
|
|
379
|
-
process.exit(1);
|
|
380
|
-
}
|
|
381
|
-
filter = { agent: agentId, version: version || undefined };
|
|
382
|
-
}
|
|
383
|
-
const pairs = iterSkillsCapableVersions(filter);
|
|
384
|
-
if (pairs.length === 0) {
|
|
385
|
-
console.log(chalk.gray('No matching installed versions.'));
|
|
386
|
-
return;
|
|
387
|
-
}
|
|
388
|
-
const diffs = pairs.map(({ agent, version }) => diffVersionSkills(agent, version));
|
|
389
|
-
const plan = diffs.filter((d) => d.toAdd.length > 0 || d.toUpdate.length > 0);
|
|
390
|
-
if (plan.length === 0) {
|
|
391
|
-
console.log(chalk.green('All version homes are up to date with central.'));
|
|
392
|
-
if (diffs.some((d) => d.orphans.length > 0)) {
|
|
393
|
-
console.log(chalk.gray('Orphan skills present. Run \'agents skills prune --dry-run\' to review.'));
|
|
394
|
-
}
|
|
395
|
-
return;
|
|
396
|
-
}
|
|
397
|
-
console.log(chalk.bold(`Syncing skills (method: ${method})\n`));
|
|
398
|
-
let adds = 0, updates = 0, failures = 0;
|
|
399
|
-
for (const diff of plan) {
|
|
400
|
-
const label = `${diff.agent}@${diff.version}`;
|
|
401
|
-
if (diff.toAdd.length > 0) {
|
|
402
|
-
console.log(` ${chalk.cyan(label)} ${chalk.gray('add:')} ${diff.toAdd.join(', ')}`);
|
|
403
|
-
for (const name of diff.toAdd) {
|
|
404
|
-
const r = installSkillToVersion(diff.agent, diff.version, name, method);
|
|
405
|
-
if (r.success)
|
|
406
|
-
adds++;
|
|
407
|
-
else {
|
|
408
|
-
failures++;
|
|
409
|
-
console.log(chalk.red(` ! ${name}: ${r.error}`));
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
if (diff.toUpdate.length > 0) {
|
|
414
|
-
console.log(` ${chalk.cyan(label)} ${chalk.gray('update:')} ${diff.toUpdate.join(', ')}`);
|
|
415
|
-
for (const name of diff.toUpdate) {
|
|
416
|
-
const r = installSkillToVersion(diff.agent, diff.version, name, method);
|
|
417
|
-
if (r.success)
|
|
418
|
-
updates++;
|
|
419
|
-
else {
|
|
420
|
-
failures++;
|
|
421
|
-
console.log(chalk.red(` ! ${name}: ${r.error}`));
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
console.log();
|
|
427
|
-
console.log(chalk.green(`Synced: ${adds} added, ${updates} updated${failures > 0 ? chalk.red(`, ${failures} failed`) : ''}.`));
|
|
428
|
-
const totalOrphans = diffs.reduce((n, d) => n + d.orphans.length, 0);
|
|
429
|
-
if (totalOrphans > 0) {
|
|
430
|
-
console.log(chalk.gray(`${totalOrphans} orphan(s) remain. Run 'agents skills prune --dry-run' to review.`));
|
|
431
|
-
}
|
|
432
|
-
});
|
|
433
|
-
skillsCmd
|
|
434
|
-
.command('prune')
|
|
435
|
-
.description('Remove orphan skills from version homes (skills present locally but not in central)')
|
|
436
|
-
.option('-a, --agent <agent>', 'Scope to a specific agent or agent@version')
|
|
437
|
-
.option('--dry-run', 'Show orphans without deleting')
|
|
438
|
-
.option('-y, --yes', 'Skip confirmation prompt')
|
|
439
|
-
.addHelpText('after', `
|
|
440
|
-
Examples:
|
|
441
|
-
# See what would be pruned
|
|
442
|
-
agents skills prune --dry-run
|
|
443
|
-
|
|
444
|
-
# Prune across every installed version (prompts for confirmation)
|
|
445
|
-
agents skills prune
|
|
446
|
-
|
|
447
|
-
# Scope to one agent or version
|
|
448
|
-
agents skills prune --agent claude@2.0.65
|
|
449
|
-
|
|
450
|
-
# Skip confirmation (for scripts)
|
|
451
|
-
agents skills prune -y
|
|
452
|
-
|
|
453
|
-
Orphans are skills that exist inside a version home but are missing from the
|
|
454
|
-
central ~/.agents/skills/ source of truth. Usually they are leftovers from a
|
|
455
|
-
skill that was deleted centrally but never removed from the version install.
|
|
456
|
-
`)
|
|
457
|
-
.action(async (options) => {
|
|
458
|
-
let filter;
|
|
459
|
-
if (options.agent) {
|
|
460
|
-
const [name, version] = String(options.agent).split('@');
|
|
461
|
-
const agentId = resolveAgentName(name);
|
|
462
|
-
if (!agentId) {
|
|
463
|
-
console.log(chalk.red(formatAgentError(name, SKILLS_CAPABLE_AGENTS)));
|
|
464
|
-
process.exit(1);
|
|
465
|
-
}
|
|
466
|
-
filter = { agent: agentId, version: version || undefined };
|
|
467
|
-
}
|
|
468
|
-
const pairs = iterSkillsCapableVersions(filter);
|
|
469
|
-
const diffs = pairs
|
|
470
|
-
.map(({ agent, version }) => diffVersionSkills(agent, version))
|
|
471
|
-
.filter((d) => d.orphans.length > 0);
|
|
472
|
-
if (diffs.length === 0) {
|
|
473
|
-
console.log(chalk.green('No orphan skills.'));
|
|
474
|
-
return;
|
|
475
|
-
}
|
|
476
|
-
const total = diffs.reduce((n, d) => n + d.orphans.length, 0);
|
|
477
|
-
console.log(chalk.bold(`Orphans (in version home, not in central)\n`));
|
|
478
|
-
for (const d of diffs) {
|
|
479
|
-
console.log(` ${chalk.cyan(`${d.agent}@${d.version}`)} ${d.orphans.join(', ')}`);
|
|
480
|
-
}
|
|
481
|
-
console.log();
|
|
482
|
-
if (options.dryRun) {
|
|
483
|
-
console.log(chalk.gray(`${total} orphan(s). Run without --dry-run to delete.`));
|
|
484
|
-
return;
|
|
485
|
-
}
|
|
486
|
-
if (!options.yes) {
|
|
487
|
-
if (!isInteractiveTerminal()) {
|
|
488
|
-
console.log(chalk.yellow('Non-interactive shell: pass -y to confirm, or --dry-run to preview.'));
|
|
489
|
-
process.exit(1);
|
|
490
|
-
}
|
|
491
|
-
let ok = false;
|
|
492
|
-
try {
|
|
493
|
-
ok = await confirm({
|
|
494
|
-
message: `Delete ${total} orphan skill director${total === 1 ? 'y' : 'ies'}?`,
|
|
495
|
-
default: false,
|
|
496
|
-
});
|
|
497
|
-
}
|
|
498
|
-
catch (err) {
|
|
499
|
-
if (isPromptCancelled(err)) {
|
|
500
|
-
console.log(chalk.gray('Cancelled'));
|
|
501
|
-
return;
|
|
502
|
-
}
|
|
503
|
-
throw err;
|
|
504
|
-
}
|
|
505
|
-
if (!ok) {
|
|
506
|
-
console.log(chalk.gray('Cancelled'));
|
|
507
|
-
return;
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
|
-
let removed = 0, failures = 0;
|
|
511
|
-
for (const d of diffs) {
|
|
512
|
-
for (const name of d.orphans) {
|
|
513
|
-
const r = removeSkillFromVersion(d.agent, d.version, name);
|
|
514
|
-
if (r.success)
|
|
515
|
-
removed++;
|
|
516
|
-
else {
|
|
517
|
-
failures++;
|
|
518
|
-
console.log(chalk.red(` ! ${d.agent}@${d.version} ${name}: ${r.error}`));
|
|
519
|
-
}
|
|
520
|
-
}
|
|
521
|
-
}
|
|
522
|
-
console.log(chalk.green(`Pruned ${removed} orphan(s)${failures > 0 ? chalk.red(`, ${failures} failed`) : ''}.`));
|
|
523
|
-
});
|
|
524
|
-
skillsCmd
|
|
525
|
-
.command('view [name]')
|
|
526
|
-
.description('Read skill metadata (name, description, rules count)')
|
|
527
|
-
.addHelpText('after', `
|
|
528
|
-
Examples:
|
|
529
|
-
# View details for a specific skill
|
|
530
|
-
agents skills view api-testing
|
|
531
|
-
|
|
532
|
-
# Interactive picker
|
|
533
|
-
agents skills view
|
|
534
|
-
`)
|
|
535
|
-
.action(async (name) => {
|
|
536
|
-
// If no name provided, show interactive select
|
|
537
|
-
if (!name) {
|
|
538
|
-
const cwd = process.cwd();
|
|
539
|
-
const allSkills = [];
|
|
540
|
-
const seenNames = new Set();
|
|
541
|
-
for (const agentId of SKILLS_CAPABLE_AGENTS) {
|
|
542
|
-
const skills = listInstalledSkillsWithScope(agentId, cwd);
|
|
543
|
-
for (const skill of skills) {
|
|
544
|
-
if (!seenNames.has(skill.name)) {
|
|
545
|
-
seenNames.add(skill.name);
|
|
546
|
-
allSkills.push({
|
|
547
|
-
name: skill.name,
|
|
548
|
-
description: skill.metadata.description || '',
|
|
549
|
-
});
|
|
550
|
-
}
|
|
551
|
-
}
|
|
552
|
-
}
|
|
553
|
-
if (allSkills.length === 0) {
|
|
554
|
-
console.log(chalk.yellow('No skills installed'));
|
|
555
|
-
return;
|
|
556
|
-
}
|
|
557
|
-
if (!isInteractiveTerminal()) {
|
|
558
|
-
requireInteractiveSelection('Selecting a skill to view', [
|
|
559
|
-
'agents skills view agents-cli',
|
|
560
|
-
]);
|
|
561
|
-
}
|
|
562
|
-
try {
|
|
563
|
-
name = await select({
|
|
564
|
-
message: 'Select a skill to view',
|
|
565
|
-
choices: allSkills.map((s) => {
|
|
566
|
-
const maxDescLen = Math.max(0, 70 - s.name.length);
|
|
567
|
-
const desc = s.description.length > maxDescLen
|
|
568
|
-
? s.description.slice(0, maxDescLen - 3) + '...'
|
|
569
|
-
: s.description;
|
|
570
|
-
return {
|
|
571
|
-
value: s.name,
|
|
572
|
-
name: desc ? `${s.name} - ${desc}` : s.name,
|
|
573
|
-
};
|
|
574
|
-
}),
|
|
575
|
-
});
|
|
576
|
-
}
|
|
577
|
-
catch (err) {
|
|
578
|
-
if (isPromptCancelled(err)) {
|
|
579
|
-
console.log(chalk.gray('Cancelled'));
|
|
580
|
-
return;
|
|
581
|
-
}
|
|
582
|
-
throw err;
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
const skill = getSkillInfo(name);
|
|
586
|
-
if (!skill) {
|
|
587
|
-
console.log(chalk.yellow(`Skill '${name}' not found`));
|
|
588
|
-
return;
|
|
589
|
-
}
|
|
590
|
-
// Build output
|
|
591
|
-
const lines = [];
|
|
592
|
-
lines.push(chalk.bold(`\n${skill.metadata.name}\n`));
|
|
593
|
-
if (skill.metadata.description) {
|
|
594
|
-
lines.push(` ${skill.metadata.description}`);
|
|
595
|
-
}
|
|
596
|
-
lines.push('');
|
|
597
|
-
if (skill.metadata.author) {
|
|
598
|
-
lines.push(` Author: ${skill.metadata.author}`);
|
|
599
|
-
}
|
|
600
|
-
if (skill.metadata.version) {
|
|
601
|
-
lines.push(` Version: ${skill.metadata.version}`);
|
|
602
|
-
}
|
|
603
|
-
if (skill.metadata.license) {
|
|
604
|
-
lines.push(` License: ${skill.metadata.license}`);
|
|
605
|
-
}
|
|
606
|
-
lines.push(` Path: ${skill.path}`);
|
|
607
|
-
const rules = getSkillRules(name);
|
|
608
|
-
if (rules.length > 0) {
|
|
609
|
-
lines.push(chalk.bold(`\n Rules (${rules.length}):\n`));
|
|
610
|
-
for (const rule of rules) {
|
|
611
|
-
lines.push(` ${chalk.cyan(rule)}`);
|
|
612
|
-
}
|
|
613
|
-
}
|
|
614
|
-
lines.push('');
|
|
615
|
-
const output = lines.join('\n');
|
|
616
|
-
printWithPager(output, lines.length);
|
|
617
|
-
});
|
|
618
|
-
// Deprecated alias for 'view'
|
|
619
|
-
skillsCmd
|
|
620
|
-
.command('info [name]', { hidden: true })
|
|
621
|
-
.action(async (name) => {
|
|
622
|
-
console.log(chalk.yellow('Deprecated: Use "agents skills view" instead of "agents skills info"\n'));
|
|
623
|
-
// Re-execute view command logic
|
|
624
|
-
await skillsCmd.commands.find((c) => c.name() === 'view')?.parseAsync(['view', ...(name ? [name] : [])], { from: 'user' });
|
|
625
|
-
});
|
|
626
|
-
}
|
|
627
|
-
/**
|
|
628
|
-
* Build the row data for `agents skills list`. Each row = one central skill
|
|
629
|
-
* with a sync-status target per (agent, version) in scope.
|
|
630
|
-
*/
|
|
631
|
-
async function buildSkillRows(opts) {
|
|
632
|
-
const central = listInstalledSkills(); // Map<name, DiscoveredSkill>
|
|
633
|
-
if (central.size === 0)
|
|
634
|
-
return [];
|
|
635
|
-
const targetPairs = iterSkillsCapableVersions({
|
|
636
|
-
agent: opts.filterAgent,
|
|
637
|
-
version: opts.filterVersion,
|
|
638
|
-
});
|
|
639
|
-
// Precompute per-(agent, version) diffs so we can look up each skill's
|
|
640
|
-
// status without re-diffing 16 times per skill.
|
|
641
|
-
const diffByTarget = new Map();
|
|
642
|
-
const defaultByAgent = new Map();
|
|
643
|
-
for (const { agent, version } of targetPairs) {
|
|
644
|
-
if (!defaultByAgent.has(agent))
|
|
645
|
-
defaultByAgent.set(agent, getGlobalDefault(agent));
|
|
646
|
-
diffByTarget.set(`${agent}@${version}`, diffVersionSkills(agent, version));
|
|
647
|
-
}
|
|
648
|
-
const rows = [];
|
|
649
|
-
for (const [name, skill] of central) {
|
|
650
|
-
const targets = [];
|
|
651
|
-
for (const { agent, version } of targetPairs) {
|
|
652
|
-
const diff = diffByTarget.get(`${agent}@${version}`);
|
|
653
|
-
let status;
|
|
654
|
-
if (diff.matched.includes(name))
|
|
655
|
-
status = 'synced';
|
|
656
|
-
else if (diff.toUpdate.includes(name))
|
|
657
|
-
status = 'stale';
|
|
658
|
-
else
|
|
659
|
-
status = 'missing';
|
|
660
|
-
targets.push({
|
|
661
|
-
agent,
|
|
662
|
-
version,
|
|
663
|
-
isDefault: defaultByAgent.get(agent) === version,
|
|
664
|
-
status,
|
|
665
|
-
});
|
|
666
|
-
}
|
|
667
|
-
const fileCount = countSkillFiles(skill.path);
|
|
668
|
-
rows.push({
|
|
669
|
-
name,
|
|
670
|
-
description: skill.metadata.description,
|
|
671
|
-
extra: fileCount > 0 ? `${fileCount}` : '-',
|
|
672
|
-
targets,
|
|
673
|
-
buildDetail: () => formatSkillDetail(name, skill, targets, fileCount),
|
|
674
|
-
});
|
|
675
|
-
}
|
|
676
|
-
// Sort: fully-synced first, then partial, then missing — stable by name within each tier.
|
|
677
|
-
rows.sort((a, b) => {
|
|
678
|
-
const aSynced = a.targets.filter((t) => t.status === 'synced').length;
|
|
679
|
-
const bSynced = b.targets.filter((t) => t.status === 'synced').length;
|
|
680
|
-
if (aSynced !== bSynced)
|
|
681
|
-
return bSynced - aSynced;
|
|
682
|
-
return a.name.localeCompare(b.name);
|
|
683
|
-
});
|
|
684
|
-
return rows;
|
|
685
|
-
}
|
|
686
|
-
function formatSkillDetail(name, skill, targets, fileCount) {
|
|
687
|
-
const lines = [];
|
|
688
|
-
lines.push(chalk.bold.cyan(name));
|
|
689
|
-
if (skill.metadata.description) {
|
|
690
|
-
lines.push(chalk.gray(skill.metadata.description));
|
|
691
|
-
}
|
|
692
|
-
lines.push('');
|
|
693
|
-
const meta = [];
|
|
694
|
-
if (skill.metadata.author)
|
|
695
|
-
meta.push(`author ${chalk.white(skill.metadata.author)}`);
|
|
696
|
-
if (skill.metadata.version)
|
|
697
|
-
meta.push(`v${chalk.white(skill.metadata.version)}`);
|
|
698
|
-
if (skill.metadata.license)
|
|
699
|
-
meta.push(`license ${chalk.white(skill.metadata.license)}`);
|
|
700
|
-
meta.push(`${chalk.white(fileCount)} file${fileCount === 1 ? '' : 's'}`);
|
|
701
|
-
if (skill.ruleCount > 0) {
|
|
702
|
-
meta.push(`${chalk.white(skill.ruleCount)} rule${skill.ruleCount === 1 ? '' : 's'}`);
|
|
703
|
-
}
|
|
704
|
-
lines.push(' ' + meta.join(chalk.gray(' · ')));
|
|
705
|
-
lines.push(' ' + chalk.gray(skill.path));
|
|
706
|
-
const rules = getSkillRules(name);
|
|
707
|
-
if (rules.length > 0) {
|
|
708
|
-
lines.push('');
|
|
709
|
-
lines.push(chalk.bold(' Rules'));
|
|
710
|
-
lines.push(' ' + rules.map((r) => chalk.gray(r)).join(', '));
|
|
711
|
-
}
|
|
712
|
-
lines.push('');
|
|
713
|
-
lines.push(chalk.bold(' Synced to'));
|
|
714
|
-
lines.push(buildTargetsSection(targets));
|
|
715
|
-
return lines.join('\n');
|
|
716
|
-
}
|
|
717
|
-
//# sourceMappingURL=skills.js.map
|