@skillsmith/cli 0.7.2 → 0.7.3
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/CHANGELOG.md +5 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/cli.js +44039 -0
- package/package.json +21 -11
- package/dist/src/commands/__meta__/telemetry-coverage.test.d.ts +0 -20
- package/dist/src/commands/__meta__/telemetry-coverage.test.d.ts.map +0 -1
- package/dist/src/commands/__meta__/telemetry-coverage.test.js +0 -118
- package/dist/src/commands/__meta__/telemetry-coverage.test.js.map +0 -1
- package/dist/src/commands/ab-test.d.ts +0 -29
- package/dist/src/commands/ab-test.d.ts.map +0 -1
- package/dist/src/commands/ab-test.js +0 -226
- package/dist/src/commands/ab-test.js.map +0 -1
- package/dist/src/commands/ab-test.test.d.ts +0 -7
- package/dist/src/commands/ab-test.test.d.ts.map +0 -1
- package/dist/src/commands/ab-test.test.js +0 -255
- package/dist/src/commands/ab-test.test.js.map +0 -1
- package/dist/src/commands/analyze.d.ts +0 -14
- package/dist/src/commands/analyze.d.ts.map +0 -1
- package/dist/src/commands/analyze.js +0 -191
- package/dist/src/commands/analyze.js.map +0 -1
- package/dist/src/commands/audit-collisions.d.ts +0 -68
- package/dist/src/commands/audit-collisions.d.ts.map +0 -1
- package/dist/src/commands/audit-collisions.js +0 -309
- package/dist/src/commands/audit-collisions.js.map +0 -1
- package/dist/src/commands/audit-sources.action.d.ts +0 -37
- package/dist/src/commands/audit-sources.action.d.ts.map +0 -1
- package/dist/src/commands/audit-sources.action.js +0 -321
- package/dist/src/commands/audit-sources.action.js.map +0 -1
- package/dist/src/commands/audit-sources.d.ts +0 -37
- package/dist/src/commands/audit-sources.d.ts.map +0 -1
- package/dist/src/commands/audit-sources.js +0 -55
- package/dist/src/commands/audit-sources.js.map +0 -1
- package/dist/src/commands/audit-sources.test.d.ts +0 -9
- package/dist/src/commands/audit-sources.test.d.ts.map +0 -1
- package/dist/src/commands/audit-sources.test.js +0 -228
- package/dist/src/commands/audit-sources.test.js.map +0 -1
- package/dist/src/commands/audit.d.ts +0 -40
- package/dist/src/commands/audit.d.ts.map +0 -1
- package/dist/src/commands/audit.js +0 -223
- package/dist/src/commands/audit.js.map +0 -1
- package/dist/src/commands/audit.test.d.ts +0 -8
- package/dist/src/commands/audit.test.d.ts.map +0 -1
- package/dist/src/commands/audit.test.js +0 -97
- package/dist/src/commands/audit.test.js.map +0 -1
- package/dist/src/commands/author/index.d.ts +0 -17
- package/dist/src/commands/author/index.d.ts.map +0 -1
- package/dist/src/commands/author/index.js +0 -21
- package/dist/src/commands/author/index.js.map +0 -1
- package/dist/src/commands/author/init.action.d.ts +0 -29
- package/dist/src/commands/author/init.action.d.ts.map +0 -1
- package/dist/src/commands/author/init.action.js +0 -131
- package/dist/src/commands/author/init.action.js.map +0 -1
- package/dist/src/commands/author/init.d.ts +0 -36
- package/dist/src/commands/author/init.d.ts.map +0 -1
- package/dist/src/commands/author/init.helpers.d.ts +0 -80
- package/dist/src/commands/author/init.helpers.d.ts.map +0 -1
- package/dist/src/commands/author/init.helpers.js +0 -107
- package/dist/src/commands/author/init.helpers.js.map +0 -1
- package/dist/src/commands/author/init.js +0 -320
- package/dist/src/commands/author/init.js.map +0 -1
- package/dist/src/commands/author/mcp-init.d.ts +0 -21
- package/dist/src/commands/author/mcp-init.d.ts.map +0 -1
- package/dist/src/commands/author/mcp-init.js +0 -202
- package/dist/src/commands/author/mcp-init.js.map +0 -1
- package/dist/src/commands/author/subagent.d.ts +0 -23
- package/dist/src/commands/author/subagent.d.ts.map +0 -1
- package/dist/src/commands/author/subagent.js +0 -174
- package/dist/src/commands/author/subagent.js.map +0 -1
- package/dist/src/commands/author/transform.d.ts +0 -23
- package/dist/src/commands/author/transform.d.ts.map +0 -1
- package/dist/src/commands/author/transform.js +0 -149
- package/dist/src/commands/author/transform.js.map +0 -1
- package/dist/src/commands/author/utils.d.ts +0 -27
- package/dist/src/commands/author/utils.d.ts.map +0 -1
- package/dist/src/commands/author/utils.js +0 -118
- package/dist/src/commands/author/utils.js.map +0 -1
- package/dist/src/commands/config.d.ts +0 -57
- package/dist/src/commands/config.d.ts.map +0 -1
- package/dist/src/commands/config.js +0 -226
- package/dist/src/commands/config.js.map +0 -1
- package/dist/src/commands/create.d.ts +0 -43
- package/dist/src/commands/create.d.ts.map +0 -1
- package/dist/src/commands/create.js +0 -336
- package/dist/src/commands/create.js.map +0 -1
- package/dist/src/commands/diff.d.ts +0 -21
- package/dist/src/commands/diff.d.ts.map +0 -1
- package/dist/src/commands/diff.js +0 -227
- package/dist/src/commands/diff.js.map +0 -1
- package/dist/src/commands/diff.test.d.ts +0 -6
- package/dist/src/commands/diff.test.d.ts.map +0 -1
- package/dist/src/commands/diff.test.js +0 -327
- package/dist/src/commands/diff.test.js.map +0 -1
- package/dist/src/commands/import-local.d.ts +0 -28
- package/dist/src/commands/import-local.d.ts.map +0 -1
- package/dist/src/commands/import-local.helpers.d.ts +0 -28
- package/dist/src/commands/import-local.helpers.d.ts.map +0 -1
- package/dist/src/commands/import-local.helpers.js +0 -166
- package/dist/src/commands/import-local.helpers.js.map +0 -1
- package/dist/src/commands/import-local.js +0 -273
- package/dist/src/commands/import-local.js.map +0 -1
- package/dist/src/commands/import-local.types.d.ts +0 -59
- package/dist/src/commands/import-local.types.d.ts.map +0 -1
- package/dist/src/commands/import-local.types.js +0 -2
- package/dist/src/commands/import-local.types.js.map +0 -1
- package/dist/src/commands/import.d.ts +0 -47
- package/dist/src/commands/import.d.ts.map +0 -1
- package/dist/src/commands/import.js +0 -314
- package/dist/src/commands/import.js.map +0 -1
- package/dist/src/commands/index.d.ts +0 -28
- package/dist/src/commands/index.d.ts.map +0 -1
- package/dist/src/commands/index.js +0 -50
- package/dist/src/commands/index.js.map +0 -1
- package/dist/src/commands/info.d.ts +0 -19
- package/dist/src/commands/info.d.ts.map +0 -1
- package/dist/src/commands/info.js +0 -110
- package/dist/src/commands/info.js.map +0 -1
- package/dist/src/commands/install-skill.d.ts +0 -16
- package/dist/src/commands/install-skill.d.ts.map +0 -1
- package/dist/src/commands/install-skill.js +0 -155
- package/dist/src/commands/install-skill.js.map +0 -1
- package/dist/src/commands/install.d.ts +0 -34
- package/dist/src/commands/install.d.ts.map +0 -1
- package/dist/src/commands/install.js +0 -311
- package/dist/src/commands/install.js.map +0 -1
- package/dist/src/commands/inventory.action.d.ts +0 -55
- package/dist/src/commands/inventory.action.d.ts.map +0 -1
- package/dist/src/commands/inventory.action.js +0 -179
- package/dist/src/commands/inventory.action.js.map +0 -1
- package/dist/src/commands/inventory.action.test.d.ts +0 -19
- package/dist/src/commands/inventory.action.test.d.ts.map +0 -1
- package/dist/src/commands/inventory.action.test.js +0 -371
- package/dist/src/commands/inventory.action.test.js.map +0 -1
- package/dist/src/commands/inventory.d.ts +0 -21
- package/dist/src/commands/inventory.d.ts.map +0 -1
- package/dist/src/commands/inventory.js +0 -42
- package/dist/src/commands/inventory.js.map +0 -1
- package/dist/src/commands/login.d.ts +0 -7
- package/dist/src/commands/login.d.ts.map +0 -1
- package/dist/src/commands/login.js +0 -323
- package/dist/src/commands/login.js.map +0 -1
- package/dist/src/commands/login.test-helpers.d.ts +0 -7
- package/dist/src/commands/login.test-helpers.d.ts.map +0 -1
- package/dist/src/commands/login.test-helpers.js +0 -44
- package/dist/src/commands/login.test-helpers.js.map +0 -1
- package/dist/src/commands/login.test.d.ts +0 -2
- package/dist/src/commands/login.test.d.ts.map +0 -1
- package/dist/src/commands/login.test.js +0 -387
- package/dist/src/commands/login.test.js.map +0 -1
- package/dist/src/commands/logout.d.ts +0 -15
- package/dist/src/commands/logout.d.ts.map +0 -1
- package/dist/src/commands/logout.js +0 -54
- package/dist/src/commands/logout.js.map +0 -1
- package/dist/src/commands/logout.test.d.ts +0 -8
- package/dist/src/commands/logout.test.d.ts.map +0 -1
- package/dist/src/commands/logout.test.js +0 -137
- package/dist/src/commands/logout.test.js.map +0 -1
- package/dist/src/commands/manage.d.ts +0 -19
- package/dist/src/commands/manage.d.ts.map +0 -1
- package/dist/src/commands/manage.js +0 -346
- package/dist/src/commands/manage.js.map +0 -1
- package/dist/src/commands/merge.d.ts +0 -24
- package/dist/src/commands/merge.d.ts.map +0 -1
- package/dist/src/commands/merge.js +0 -168
- package/dist/src/commands/merge.js.map +0 -1
- package/dist/src/commands/pin.d.ts +0 -26
- package/dist/src/commands/pin.d.ts.map +0 -1
- package/dist/src/commands/pin.js +0 -138
- package/dist/src/commands/pin.js.map +0 -1
- package/dist/src/commands/pin.test.d.ts +0 -6
- package/dist/src/commands/pin.test.d.ts.map +0 -1
- package/dist/src/commands/pin.test.js +0 -206
- package/dist/src/commands/pin.test.js.map +0 -1
- package/dist/src/commands/recommend-scoring.d.ts +0 -29
- package/dist/src/commands/recommend-scoring.d.ts.map +0 -1
- package/dist/src/commands/recommend-scoring.js +0 -141
- package/dist/src/commands/recommend-scoring.js.map +0 -1
- package/dist/src/commands/recommend.d.ts +0 -15
- package/dist/src/commands/recommend.d.ts.map +0 -1
- package/dist/src/commands/recommend.helpers.d.ts +0 -44
- package/dist/src/commands/recommend.helpers.d.ts.map +0 -1
- package/dist/src/commands/recommend.helpers.js +0 -303
- package/dist/src/commands/recommend.helpers.js.map +0 -1
- package/dist/src/commands/recommend.js +0 -198
- package/dist/src/commands/recommend.js.map +0 -1
- package/dist/src/commands/recommend.types.d.ts +0 -66
- package/dist/src/commands/recommend.types.d.ts.map +0 -1
- package/dist/src/commands/recommend.types.js +0 -14
- package/dist/src/commands/recommend.types.js.map +0 -1
- package/dist/src/commands/run-registry-sync.d.ts +0 -31
- package/dist/src/commands/run-registry-sync.d.ts.map +0 -1
- package/dist/src/commands/run-registry-sync.js +0 -45
- package/dist/src/commands/run-registry-sync.js.map +0 -1
- package/dist/src/commands/search-formatters.d.ts +0 -36
- package/dist/src/commands/search-formatters.d.ts.map +0 -1
- package/dist/src/commands/search-formatters.js +0 -132
- package/dist/src/commands/search-formatters.js.map +0 -1
- package/dist/src/commands/search-types.d.ts +0 -46
- package/dist/src/commands/search-types.d.ts.map +0 -1
- package/dist/src/commands/search-types.js +0 -12
- package/dist/src/commands/search-types.js.map +0 -1
- package/dist/src/commands/search.action.d.ts +0 -16
- package/dist/src/commands/search.action.d.ts.map +0 -1
- package/dist/src/commands/search.action.js +0 -384
- package/dist/src/commands/search.action.js.map +0 -1
- package/dist/src/commands/search.d.ts +0 -18
- package/dist/src/commands/search.d.ts.map +0 -1
- package/dist/src/commands/search.helpers.d.ts +0 -52
- package/dist/src/commands/search.helpers.d.ts.map +0 -1
- package/dist/src/commands/search.helpers.js +0 -95
- package/dist/src/commands/search.helpers.js.map +0 -1
- package/dist/src/commands/search.js +0 -48
- package/dist/src/commands/search.js.map +0 -1
- package/dist/src/commands/search.test.d.ts +0 -10
- package/dist/src/commands/search.test.d.ts.map +0 -1
- package/dist/src/commands/search.test.js +0 -179
- package/dist/src/commands/search.test.js.map +0 -1
- package/dist/src/commands/sync.action.d.ts +0 -39
- package/dist/src/commands/sync.action.d.ts.map +0 -1
- package/dist/src/commands/sync.action.js +0 -353
- package/dist/src/commands/sync.action.js.map +0 -1
- package/dist/src/commands/sync.d.ts +0 -24
- package/dist/src/commands/sync.d.ts.map +0 -1
- package/dist/src/commands/sync.helpers.d.ts +0 -55
- package/dist/src/commands/sync.helpers.d.ts.map +0 -1
- package/dist/src/commands/sync.helpers.js +0 -90
- package/dist/src/commands/sync.helpers.js.map +0 -1
- package/dist/src/commands/sync.js +0 -101
- package/dist/src/commands/sync.js.map +0 -1
- package/dist/src/commands/telemetry.action.d.ts +0 -38
- package/dist/src/commands/telemetry.action.d.ts.map +0 -1
- package/dist/src/commands/telemetry.action.js +0 -350
- package/dist/src/commands/telemetry.action.js.map +0 -1
- package/dist/src/commands/telemetry.d.ts +0 -30
- package/dist/src/commands/telemetry.d.ts.map +0 -1
- package/dist/src/commands/telemetry.helpers.d.ts +0 -58
- package/dist/src/commands/telemetry.helpers.d.ts.map +0 -1
- package/dist/src/commands/telemetry.helpers.js +0 -173
- package/dist/src/commands/telemetry.helpers.js.map +0 -1
- package/dist/src/commands/telemetry.helpers.test.d.ts +0 -15
- package/dist/src/commands/telemetry.helpers.test.d.ts.map +0 -1
- package/dist/src/commands/telemetry.helpers.test.js +0 -240
- package/dist/src/commands/telemetry.helpers.test.js.map +0 -1
- package/dist/src/commands/telemetry.js +0 -65
- package/dist/src/commands/telemetry.js.map +0 -1
- package/dist/src/commands/telemetry.test.d.ts +0 -18
- package/dist/src/commands/telemetry.test.d.ts.map +0 -1
- package/dist/src/commands/telemetry.test.js +0 -401
- package/dist/src/commands/telemetry.test.js.map +0 -1
- package/dist/src/commands/whoami.d.ts +0 -15
- package/dist/src/commands/whoami.d.ts.map +0 -1
- package/dist/src/commands/whoami.js +0 -55
- package/dist/src/commands/whoami.js.map +0 -1
- package/dist/src/commands/whoami.test.d.ts +0 -8
- package/dist/src/commands/whoami.test.d.ts.map +0 -1
- package/dist/src/commands/whoami.test.js +0 -133
- package/dist/src/commands/whoami.test.js.map +0 -1
- package/dist/src/config.d.ts +0 -29
- package/dist/src/config.d.ts.map +0 -1
- package/dist/src/config.js +0 -34
- package/dist/src/config.js.map +0 -1
- package/dist/src/index.d.ts +0 -22
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -117
- package/dist/src/index.js.map +0 -1
- package/dist/src/templates/changelog.md.template.d.ts +0 -8
- package/dist/src/templates/changelog.md.template.d.ts.map +0 -1
- package/dist/src/templates/changelog.md.template.js +0 -19
- package/dist/src/templates/changelog.md.template.js.map +0 -1
- package/dist/src/templates/index.d.ts +0 -11
- package/dist/src/templates/index.d.ts.map +0 -1
- package/dist/src/templates/index.js +0 -11
- package/dist/src/templates/index.js.map +0 -1
- package/dist/src/templates/mcp-server.template.d.ts +0 -82
- package/dist/src/templates/mcp-server.template.d.ts.map +0 -1
- package/dist/src/templates/mcp-server.template.js +0 -430
- package/dist/src/templates/mcp-server.template.js.map +0 -1
- package/dist/src/templates/mcp-server.template.snippets.d.ts +0 -51
- package/dist/src/templates/mcp-server.template.snippets.d.ts.map +0 -1
- package/dist/src/templates/mcp-server.template.snippets.js +0 -162
- package/dist/src/templates/mcp-server.template.snippets.js.map +0 -1
- package/dist/src/templates/mcp-template-handlers.d.ts +0 -33
- package/dist/src/templates/mcp-template-handlers.d.ts.map +0 -1
- package/dist/src/templates/mcp-template-handlers.js +0 -106
- package/dist/src/templates/mcp-template-handlers.js.map +0 -1
- package/dist/src/templates/mcp-template-types.d.ts +0 -48
- package/dist/src/templates/mcp-template-types.d.ts.map +0 -1
- package/dist/src/templates/mcp-template-types.js +0 -18
- package/dist/src/templates/mcp-template-types.js.map +0 -1
- package/dist/src/templates/readme.md.template.d.ts +0 -8
- package/dist/src/templates/readme.md.template.d.ts.map +0 -1
- package/dist/src/templates/readme.md.template.js +0 -86
- package/dist/src/templates/readme.md.template.js.map +0 -1
- package/dist/src/templates/skill.md.template.d.ts +0 -8
- package/dist/src/templates/skill.md.template.d.ts.map +0 -1
- package/dist/src/templates/skill.md.template.js +0 -97
- package/dist/src/templates/skill.md.template.js.map +0 -1
- package/dist/src/templates/subagent.md.template.d.ts +0 -38
- package/dist/src/templates/subagent.md.template.d.ts.map +0 -1
- package/dist/src/templates/subagent.md.template.js +0 -128
- package/dist/src/templates/subagent.md.template.js.map +0 -1
- package/dist/src/utils/errors.d.ts +0 -52
- package/dist/src/utils/errors.d.ts.map +0 -1
- package/dist/src/utils/errors.js +0 -58
- package/dist/src/utils/errors.js.map +0 -1
- package/dist/src/utils/formatters.d.ts +0 -39
- package/dist/src/utils/formatters.d.ts.map +0 -1
- package/dist/src/utils/formatters.js +0 -69
- package/dist/src/utils/formatters.js.map +0 -1
- package/dist/src/utils/license-types.d.ts +0 -88
- package/dist/src/utils/license-types.d.ts.map +0 -1
- package/dist/src/utils/license-types.js +0 -60
- package/dist/src/utils/license-types.js.map +0 -1
- package/dist/src/utils/license-validation.d.ts +0 -61
- package/dist/src/utils/license-validation.d.ts.map +0 -1
- package/dist/src/utils/license-validation.js +0 -198
- package/dist/src/utils/license-validation.js.map +0 -1
- package/dist/src/utils/license.d.ts +0 -56
- package/dist/src/utils/license.d.ts.map +0 -1
- package/dist/src/utils/license.js +0 -163
- package/dist/src/utils/license.js.map +0 -1
- package/dist/src/utils/license.test.d.ts +0 -7
- package/dist/src/utils/license.test.d.ts.map +0 -1
- package/dist/src/utils/license.test.js +0 -308
- package/dist/src/utils/license.test.js.map +0 -1
- package/dist/src/utils/manifest.d.ts +0 -121
- package/dist/src/utils/manifest.d.ts.map +0 -1
- package/dist/src/utils/manifest.js +0 -133
- package/dist/src/utils/manifest.js.map +0 -1
- package/dist/src/utils/manifest.test.d.ts +0 -20
- package/dist/src/utils/manifest.test.d.ts.map +0 -1
- package/dist/src/utils/manifest.test.js +0 -344
- package/dist/src/utils/manifest.test.js.map +0 -1
- package/dist/src/utils/node-version.d.ts +0 -41
- package/dist/src/utils/node-version.d.ts.map +0 -1
- package/dist/src/utils/node-version.js +0 -123
- package/dist/src/utils/node-version.js.map +0 -1
- package/dist/src/utils/open-database.d.ts +0 -35
- package/dist/src/utils/open-database.d.ts.map +0 -1
- package/dist/src/utils/open-database.js +0 -73
- package/dist/src/utils/open-database.js.map +0 -1
- package/dist/src/utils/require-tier.d.ts +0 -38
- package/dist/src/utils/require-tier.d.ts.map +0 -1
- package/dist/src/utils/require-tier.js +0 -74
- package/dist/src/utils/require-tier.js.map +0 -1
- package/dist/src/utils/sanitize.d.ts +0 -30
- package/dist/src/utils/sanitize.d.ts.map +0 -1
- package/dist/src/utils/sanitize.js +0 -45
- package/dist/src/utils/sanitize.js.map +0 -1
- package/dist/src/utils/skill-name.d.ts +0 -19
- package/dist/src/utils/skill-name.d.ts.map +0 -1
- package/dist/src/utils/skill-name.js +0 -26
- package/dist/src/utils/skill-name.js.map +0 -1
- package/dist/src/utils/skills-directory.d.ts +0 -95
- package/dist/src/utils/skills-directory.d.ts.map +0 -1
- package/dist/src/utils/skills-directory.js +0 -285
- package/dist/src/utils/skills-directory.js.map +0 -1
- package/dist/src/utils/startup-header-gate.d.ts +0 -29
- package/dist/src/utils/startup-header-gate.d.ts.map +0 -1
- package/dist/src/utils/startup-header-gate.js +0 -44
- package/dist/src/utils/startup-header-gate.js.map +0 -1
- package/dist/src/utils/startup-header-gate.test.d.ts +0 -2
- package/dist/src/utils/startup-header-gate.test.d.ts.map +0 -1
- package/dist/src/utils/startup-header-gate.test.js +0 -46
- package/dist/src/utils/startup-header-gate.test.js.map +0 -1
- package/dist/src/utils/tool-analyzer.d.ts +0 -54
- package/dist/src/utils/tool-analyzer.d.ts.map +0 -1
- package/dist/src/utils/tool-analyzer.js +0 -156
- package/dist/src/utils/tool-analyzer.js.map +0 -1
- package/dist/src/version.d.ts +0 -2
- package/dist/src/version.d.ts.map +0 -1
- package/dist/src/version.js +0 -24
- package/dist/src/version.js.map +0 -1
- package/dist/tests/audit-collisions.test.d.ts +0 -42
- package/dist/tests/audit-collisions.test.d.ts.map +0 -1
- package/dist/tests/audit-collisions.test.js +0 -370
- package/dist/tests/audit-collisions.test.js.map +0 -1
- package/dist/tests/audit-restructure.test.d.ts +0 -15
- package/dist/tests/audit-restructure.test.d.ts.map +0 -1
- package/dist/tests/audit-restructure.test.js +0 -151
- package/dist/tests/audit-restructure.test.js.map +0 -1
- package/dist/tests/author.test.d.ts +0 -5
- package/dist/tests/author.test.d.ts.map +0 -1
- package/dist/tests/author.test.js +0 -653
- package/dist/tests/author.test.js.map +0 -1
- package/dist/tests/config.test.d.ts +0 -33
- package/dist/tests/config.test.d.ts.map +0 -1
- package/dist/tests/config.test.js +0 -240
- package/dist/tests/config.test.js.map +0 -1
- package/dist/tests/create.test.d.ts +0 -5
- package/dist/tests/create.test.d.ts.map +0 -1
- package/dist/tests/create.test.js +0 -449
- package/dist/tests/create.test.js.map +0 -1
- package/dist/tests/e2e/audit-sources-affix.test.d.ts +0 -11
- package/dist/tests/e2e/audit-sources-affix.test.d.ts.map +0 -1
- package/dist/tests/e2e/audit-sources-affix.test.js +0 -121
- package/dist/tests/e2e/audit-sources-affix.test.js.map +0 -1
- package/dist/tests/e2e/audit-sources-apply.test.d.ts +0 -13
- package/dist/tests/e2e/audit-sources-apply.test.d.ts.map +0 -1
- package/dist/tests/e2e/audit-sources-apply.test.js +0 -166
- package/dist/tests/e2e/audit-sources-apply.test.js.map +0 -1
- package/dist/tests/e2e/audit-sources-recovery.test.d.ts +0 -15
- package/dist/tests/e2e/audit-sources-recovery.test.d.ts.map +0 -1
- package/dist/tests/e2e/audit-sources-recovery.test.js +0 -179
- package/dist/tests/e2e/audit-sources-recovery.test.js.map +0 -1
- package/dist/tests/e2e/audit-sources-roundtrip.test.d.ts +0 -23
- package/dist/tests/e2e/audit-sources-roundtrip.test.d.ts.map +0 -1
- package/dist/tests/e2e/audit-sources-roundtrip.test.js +0 -139
- package/dist/tests/e2e/audit-sources-roundtrip.test.js.map +0 -1
- package/dist/tests/e2e/author.e2e.test.d.ts +0 -9
- package/dist/tests/e2e/author.e2e.test.d.ts.map +0 -1
- package/dist/tests/e2e/author.e2e.test.js +0 -666
- package/dist/tests/e2e/author.e2e.test.js.map +0 -1
- package/dist/tests/e2e/import.e2e.test.d.ts +0 -10
- package/dist/tests/e2e/import.e2e.test.d.ts.map +0 -1
- package/dist/tests/e2e/import.e2e.test.js +0 -213
- package/dist/tests/e2e/import.e2e.test.js.map +0 -1
- package/dist/tests/e2e/manage.e2e.test.d.ts +0 -9
- package/dist/tests/e2e/manage.e2e.test.d.ts.map +0 -1
- package/dist/tests/e2e/manage.e2e.test.js +0 -277
- package/dist/tests/e2e/manage.e2e.test.js.map +0 -1
- package/dist/tests/e2e/search.e2e.test.d.ts +0 -10
- package/dist/tests/e2e/search.e2e.test.d.ts.map +0 -1
- package/dist/tests/e2e/search.e2e.test.js +0 -324
- package/dist/tests/e2e/search.e2e.test.js.map +0 -1
- package/dist/tests/e2e/test-config.d.ts +0 -39
- package/dist/tests/e2e/test-config.d.ts.map +0 -1
- package/dist/tests/e2e/test-config.js +0 -44
- package/dist/tests/e2e/test-config.js.map +0 -1
- package/dist/tests/e2e/utils/baseline-collector.d.ts +0 -107
- package/dist/tests/e2e/utils/baseline-collector.d.ts.map +0 -1
- package/dist/tests/e2e/utils/baseline-collector.js +0 -211
- package/dist/tests/e2e/utils/baseline-collector.js.map +0 -1
- package/dist/tests/e2e/utils/hardcoded-detector.d.ts +0 -46
- package/dist/tests/e2e/utils/hardcoded-detector.d.ts.map +0 -1
- package/dist/tests/e2e/utils/hardcoded-detector.js +0 -238
- package/dist/tests/e2e/utils/hardcoded-detector.js.map +0 -1
- package/dist/tests/e2e/utils/index.d.ts +0 -12
- package/dist/tests/e2e/utils/index.d.ts.map +0 -1
- package/dist/tests/e2e/utils/index.js +0 -12
- package/dist/tests/e2e/utils/index.js.map +0 -1
- package/dist/tests/e2e/utils/linear-reporter.d.ts +0 -60
- package/dist/tests/e2e/utils/linear-reporter.d.ts.map +0 -1
- package/dist/tests/e2e/utils/linear-reporter.js +0 -223
- package/dist/tests/e2e/utils/linear-reporter.js.map +0 -1
- package/dist/tests/e2e/utils/mock-github.d.ts +0 -23
- package/dist/tests/e2e/utils/mock-github.d.ts.map +0 -1
- package/dist/tests/e2e/utils/mock-github.js +0 -60
- package/dist/tests/e2e/utils/mock-github.js.map +0 -1
- package/dist/tests/e2e/utils/mock-prompts.d.ts +0 -19
- package/dist/tests/e2e/utils/mock-prompts.d.ts.map +0 -1
- package/dist/tests/e2e/utils/mock-prompts.js +0 -48
- package/dist/tests/e2e/utils/mock-prompts.js.map +0 -1
- package/dist/tests/e2e/utils/source-recovery-fixture.d.ts +0 -49
- package/dist/tests/e2e/utils/source-recovery-fixture.d.ts.map +0 -1
- package/dist/tests/e2e/utils/source-recovery-fixture.js +0 -106
- package/dist/tests/e2e/utils/source-recovery-fixture.js.map +0 -1
- package/dist/tests/embedding-probe-stdio.test.d.ts +0 -11
- package/dist/tests/embedding-probe-stdio.test.d.ts.map +0 -1
- package/dist/tests/embedding-probe-stdio.test.js +0 -58
- package/dist/tests/embedding-probe-stdio.test.js.map +0 -1
- package/dist/tests/import.test.d.ts +0 -5
- package/dist/tests/import.test.d.ts.map +0 -1
- package/dist/tests/import.test.js +0 -11
- package/dist/tests/import.test.js.map +0 -1
- package/dist/tests/init.test.d.ts +0 -30
- package/dist/tests/init.test.d.ts.map +0 -1
- package/dist/tests/init.test.js +0 -357
- package/dist/tests/init.test.js.map +0 -1
- package/dist/tests/install-multi-client.test.d.ts +0 -2
- package/dist/tests/install-multi-client.test.d.ts.map +0 -1
- package/dist/tests/install-multi-client.test.js +0 -202
- package/dist/tests/install-multi-client.test.js.map +0 -1
- package/dist/tests/install-quarantine.test.d.ts +0 -10
- package/dist/tests/install-quarantine.test.d.ts.map +0 -1
- package/dist/tests/install-quarantine.test.js +0 -86
- package/dist/tests/install-quarantine.test.js.map +0 -1
- package/dist/tests/install-skill.test.d.ts +0 -8
- package/dist/tests/install-skill.test.d.ts.map +0 -1
- package/dist/tests/install-skill.test.js +0 -414
- package/dist/tests/install-skill.test.js.map +0 -1
- package/dist/tests/integration/import-local.test.d.ts +0 -2
- package/dist/tests/integration/import-local.test.d.ts.map +0 -1
- package/dist/tests/integration/import-local.test.js +0 -158
- package/dist/tests/integration/import-local.test.js.map +0 -1
- package/dist/tests/license-validation.test.d.ts +0 -8
- package/dist/tests/license-validation.test.d.ts.map +0 -1
- package/dist/tests/license-validation.test.js +0 -186
- package/dist/tests/license-validation.test.js.map +0 -1
- package/dist/tests/manage.test.d.ts +0 -5
- package/dist/tests/manage.test.d.ts.map +0 -1
- package/dist/tests/manage.test.js +0 -495
- package/dist/tests/manage.test.js.map +0 -1
- package/dist/tests/mcp-server-template.test.d.ts +0 -7
- package/dist/tests/mcp-server-template.test.d.ts.map +0 -1
- package/dist/tests/mcp-server-template.test.js +0 -372
- package/dist/tests/mcp-server-template.test.js.map +0 -1
- package/dist/tests/node-version.test.d.ts +0 -8
- package/dist/tests/node-version.test.d.ts.map +0 -1
- package/dist/tests/node-version.test.js +0 -200
- package/dist/tests/node-version.test.js.map +0 -1
- package/dist/tests/open-database.test.d.ts +0 -2
- package/dist/tests/open-database.test.d.ts.map +0 -1
- package/dist/tests/open-database.test.js +0 -77
- package/dist/tests/open-database.test.js.map +0 -1
- package/dist/tests/recommend-helpers.test.d.ts +0 -9
- package/dist/tests/recommend-helpers.test.d.ts.map +0 -1
- package/dist/tests/recommend-helpers.test.js +0 -308
- package/dist/tests/recommend-helpers.test.js.map +0 -1
- package/dist/tests/recommend-scoring.test.d.ts +0 -8
- package/dist/tests/recommend-scoring.test.d.ts.map +0 -1
- package/dist/tests/recommend-scoring.test.js +0 -184
- package/dist/tests/recommend-scoring.test.js.map +0 -1
- package/dist/tests/recommend.errors.test.d.ts +0 -8
- package/dist/tests/recommend.errors.test.d.ts.map +0 -1
- package/dist/tests/recommend.errors.test.js +0 -232
- package/dist/tests/recommend.errors.test.js.map +0 -1
- package/dist/tests/recommend.filters.test.d.ts +0 -9
- package/dist/tests/recommend.filters.test.d.ts.map +0 -1
- package/dist/tests/recommend.filters.test.js +0 -235
- package/dist/tests/recommend.filters.test.js.map +0 -1
- package/dist/tests/recommend.test-helpers.d.ts +0 -66
- package/dist/tests/recommend.test-helpers.d.ts.map +0 -1
- package/dist/tests/recommend.test-helpers.js +0 -79
- package/dist/tests/recommend.test-helpers.js.map +0 -1
- package/dist/tests/recommend.test.d.ts +0 -11
- package/dist/tests/recommend.test.d.ts.map +0 -1
- package/dist/tests/recommend.test.js +0 -320
- package/dist/tests/recommend.test.js.map +0 -1
- package/dist/tests/search-helpers.test.d.ts +0 -2
- package/dist/tests/search-helpers.test.d.ts.map +0 -1
- package/dist/tests/search-helpers.test.js +0 -110
- package/dist/tests/search-helpers.test.js.map +0 -1
- package/dist/tests/search.test.d.ts +0 -5
- package/dist/tests/search.test.d.ts.map +0 -1
- package/dist/tests/search.test.js +0 -91
- package/dist/tests/search.test.js.map +0 -1
- package/dist/tests/skills-directory-per-harness.test.d.ts +0 -2
- package/dist/tests/skills-directory-per-harness.test.d.ts.map +0 -1
- package/dist/tests/skills-directory-per-harness.test.js +0 -116
- package/dist/tests/skills-directory-per-harness.test.js.map +0 -1
- package/dist/tests/skills-directory.test.d.ts +0 -2
- package/dist/tests/skills-directory.test.d.ts.map +0 -1
- package/dist/tests/skills-directory.test.js +0 -108
- package/dist/tests/skills-directory.test.js.map +0 -1
- package/dist/tests/sync.auth-ux.test.d.ts +0 -14
- package/dist/tests/sync.auth-ux.test.d.ts.map +0 -1
- package/dist/tests/sync.auth-ux.test.js +0 -148
- package/dist/tests/sync.auth-ux.test.js.map +0 -1
- package/dist/tests/tool-analyzer.test.d.ts +0 -8
- package/dist/tests/tool-analyzer.test.d.ts.map +0 -1
- package/dist/tests/tool-analyzer.test.js +0 -149
- package/dist/tests/tool-analyzer.test.js.map +0 -1
- package/dist/tests/unit/commands/install.test.d.ts +0 -7
- package/dist/tests/unit/commands/install.test.d.ts.map +0 -1
- package/dist/tests/unit/commands/install.test.js +0 -482
- package/dist/tests/unit/commands/install.test.js.map +0 -1
- package/dist/tests/unit/import-local.helpers.test.d.ts +0 -2
- package/dist/tests/unit/import-local.helpers.test.d.ts.map +0 -1
- package/dist/tests/unit/import-local.helpers.test.js +0 -96
- package/dist/tests/unit/import-local.helpers.test.js.map +0 -1
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* License status utilities for Skillsmith CLI
|
|
3
|
-
*
|
|
4
|
-
* Handles license validation, status display, and tier formatting.
|
|
5
|
-
* Supports community (free), team, and enterprise license tiers.
|
|
6
|
-
*
|
|
7
|
-
* When @skillsmith/enterprise is available, uses proper RS256 JWT validation.
|
|
8
|
-
* Otherwise, falls back to community tier (no error).
|
|
9
|
-
*
|
|
10
|
-
* Environment variable: SKILLSMITH_LICENSE_KEY
|
|
11
|
-
*
|
|
12
|
-
* @see SMI-1090: CLI should use enterprise LicenseValidator when available
|
|
13
|
-
*/
|
|
14
|
-
import chalk from 'chalk';
|
|
15
|
-
export { TIER_FEATURES, TIER_QUOTAS } from './license-types.js';
|
|
16
|
-
// Re-export validation functions
|
|
17
|
-
export { tryLoadEnterpriseValidator, _resetEnterpriseValidatorCache, decodeLicenseKey, isExpired, getLicenseStatus, getLicenseStatusLegacy, } from './license-validation.js';
|
|
18
|
-
import { getLicenseStatus } from './license-validation.js';
|
|
19
|
-
// ============================================================================
|
|
20
|
-
// Display Helpers
|
|
21
|
-
// ============================================================================
|
|
22
|
-
/**
|
|
23
|
-
* Format a tier badge with color
|
|
24
|
-
*
|
|
25
|
-
* @param tier - License tier
|
|
26
|
-
* @returns Formatted tier badge string
|
|
27
|
-
*/
|
|
28
|
-
export function formatTierBadge(tier) {
|
|
29
|
-
switch (tier) {
|
|
30
|
-
case 'enterprise':
|
|
31
|
-
return chalk.magenta.bold('Enterprise');
|
|
32
|
-
case 'team':
|
|
33
|
-
return chalk.blue.bold('Team');
|
|
34
|
-
case 'individual':
|
|
35
|
-
return chalk.cyan.bold('Individual');
|
|
36
|
-
case 'community':
|
|
37
|
-
default:
|
|
38
|
-
return chalk.yellow('Community');
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Display a progress bar for quota usage
|
|
43
|
-
*
|
|
44
|
-
* @param used - API calls used
|
|
45
|
-
* @param limit - API call limit
|
|
46
|
-
* @returns Formatted progress bar string
|
|
47
|
-
*/
|
|
48
|
-
export function displayQuotaProgressBar(used, limit) {
|
|
49
|
-
const width = 30;
|
|
50
|
-
const percent = Math.min((used / limit) * 100, 100);
|
|
51
|
-
const filled = Math.round((percent / 100) * width);
|
|
52
|
-
const empty = width - filled;
|
|
53
|
-
// Color based on usage level
|
|
54
|
-
let color = chalk.green;
|
|
55
|
-
if (percent >= 90)
|
|
56
|
-
color = chalk.red;
|
|
57
|
-
else if (percent >= 80)
|
|
58
|
-
color = chalk.yellow;
|
|
59
|
-
const bar = color('█'.repeat(filled)) + chalk.gray('░'.repeat(empty));
|
|
60
|
-
return `[${bar}] ${percent.toFixed(0)}%`;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Display a quota warning box
|
|
64
|
-
*
|
|
65
|
-
* @param quota - Quota information
|
|
66
|
-
* @param tier - Current tier for upgrade suggestions
|
|
67
|
-
*/
|
|
68
|
-
export function displayQuotaWarning(quota, tier) {
|
|
69
|
-
const percentUsed = quota.percentUsed;
|
|
70
|
-
const resetFormatted = quota.resetAt.toLocaleDateString();
|
|
71
|
-
console.log();
|
|
72
|
-
if (percentUsed >= 100) {
|
|
73
|
-
console.log(chalk.red('━'.repeat(50)));
|
|
74
|
-
console.log(chalk.red.bold('❌ API Quota Exceeded'));
|
|
75
|
-
console.log(chalk.red(`You've used all ${quota.limit.toLocaleString()} API calls this month`));
|
|
76
|
-
console.log(chalk.red(`Quota resets on ${resetFormatted}`));
|
|
77
|
-
if (tier !== 'enterprise') {
|
|
78
|
-
console.log(chalk.dim(`Upgrade at: https://skillsmith.app/upgrade`));
|
|
79
|
-
}
|
|
80
|
-
console.log(chalk.red('━'.repeat(50)));
|
|
81
|
-
}
|
|
82
|
-
else if (percentUsed >= 90) {
|
|
83
|
-
console.log(chalk.yellow('━'.repeat(50)));
|
|
84
|
-
console.log(chalk.yellow.bold('⚠️ API Quota Warning'));
|
|
85
|
-
console.log(chalk.yellow(`You've used ${percentUsed.toFixed(0)}% of your monthly quota (${quota.used.toLocaleString()}/${quota.limit.toLocaleString()})`));
|
|
86
|
-
console.log(chalk.yellow(`${(quota.limit - quota.used).toLocaleString()} calls remaining until ${resetFormatted}`));
|
|
87
|
-
if (tier !== 'enterprise') {
|
|
88
|
-
console.log(chalk.dim(`Upgrade at: https://skillsmith.app/upgrade`));
|
|
89
|
-
}
|
|
90
|
-
console.log(chalk.yellow('━'.repeat(50)));
|
|
91
|
-
}
|
|
92
|
-
else if (percentUsed >= 80) {
|
|
93
|
-
console.log(chalk.yellow('━'.repeat(50)));
|
|
94
|
-
console.log(chalk.yellow('⚠️ Approaching API Quota Limit'));
|
|
95
|
-
console.log(chalk.yellow(`${percentUsed.toFixed(0)}% used (${quota.used.toLocaleString()}/${quota.limit.toLocaleString()})`));
|
|
96
|
-
console.log(chalk.yellow('━'.repeat(50)));
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Display license status on CLI startup
|
|
101
|
-
*
|
|
102
|
-
* Shows license tier, expiration (if applicable), features for paid tiers,
|
|
103
|
-
* and quota usage information.
|
|
104
|
-
* Uses colored output: green for valid, yellow for community, red for expired/invalid.
|
|
105
|
-
*
|
|
106
|
-
* @param status - License status to display
|
|
107
|
-
*/
|
|
108
|
-
export function displayLicenseStatus(status) {
|
|
109
|
-
const tierBadge = formatTierBadge(status.tier);
|
|
110
|
-
if (status.tier === 'community') {
|
|
111
|
-
console.log(`License: ${tierBadge} ${chalk.dim('(free tier - 1,000 API calls/month)')}`);
|
|
112
|
-
}
|
|
113
|
-
else if (status.tier === 'individual') {
|
|
114
|
-
const expiresInfo = status.expiresAt
|
|
115
|
-
? chalk.green(`(expires: ${status.expiresAt.toISOString().split('T')[0]})`)
|
|
116
|
-
: '';
|
|
117
|
-
console.log(`License: ${tierBadge} ${expiresInfo}`);
|
|
118
|
-
}
|
|
119
|
-
else if (status.valid && status.expiresAt) {
|
|
120
|
-
const expiresFormatted = status.expiresAt.toISOString().split('T')[0];
|
|
121
|
-
console.log(`License: ${tierBadge} ${chalk.green(`(expires: ${expiresFormatted})`)}`);
|
|
122
|
-
console.log(`Features: ${chalk.dim(status.features.join(', '))}`);
|
|
123
|
-
}
|
|
124
|
-
// Display quota information if available
|
|
125
|
-
if (status.quota && status.tier !== 'enterprise') {
|
|
126
|
-
const { used, limit, percentUsed, resetAt } = status.quota;
|
|
127
|
-
const resetFormatted = resetAt.toISOString().split('T')[0];
|
|
128
|
-
if (percentUsed >= 100) {
|
|
129
|
-
console.log(chalk.red.bold(`API Quota: EXCEEDED (${used.toLocaleString()}/${limit.toLocaleString()} calls)`));
|
|
130
|
-
console.log(chalk.red(`Quota resets on ${resetFormatted}. Upgrade to continue.`));
|
|
131
|
-
}
|
|
132
|
-
else if (percentUsed >= 90) {
|
|
133
|
-
console.log(chalk.yellow.bold(`API Quota: ${used.toLocaleString()}/${limit.toLocaleString()} (${percentUsed.toFixed(0)}%)`));
|
|
134
|
-
console.log(chalk.yellow(`Warning: Approaching limit. Resets ${resetFormatted}`));
|
|
135
|
-
}
|
|
136
|
-
else if (percentUsed >= 80) {
|
|
137
|
-
console.log(chalk.yellow(`API Quota: ${used.toLocaleString()}/${limit.toLocaleString()} (${percentUsed.toFixed(0)}%)`));
|
|
138
|
-
}
|
|
139
|
-
else {
|
|
140
|
-
console.log(chalk.dim(`API Quota: ${used.toLocaleString()}/${limit.toLocaleString()} calls used`));
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
else if (status.tier === 'enterprise') {
|
|
144
|
-
console.log(chalk.dim('API Quota: Unlimited'));
|
|
145
|
-
}
|
|
146
|
-
// Show warnings for invalid/expired licenses
|
|
147
|
-
if (status.error) {
|
|
148
|
-
console.log(chalk.red(`Warning: ${status.error}`));
|
|
149
|
-
console.log(chalk.dim('Continuing with community tier features'));
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Display the full CLI header with version and license info
|
|
154
|
-
*
|
|
155
|
-
* @param version - CLI version string
|
|
156
|
-
*/
|
|
157
|
-
export async function displayStartupHeader(version) {
|
|
158
|
-
console.log(`Skillsmith CLI v${version}`);
|
|
159
|
-
const status = await getLicenseStatus();
|
|
160
|
-
displayLicenseStatus(status);
|
|
161
|
-
console.log(); // Empty line after header
|
|
162
|
-
}
|
|
163
|
-
//# sourceMappingURL=license.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"license.js","sourceRoot":"","sources":["../../../src/utils/license.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"license.test.d.ts","sourceRoot":"","sources":["../../../src/utils/license.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -1,308 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for license utilities
|
|
3
|
-
*
|
|
4
|
-
* @see SMI-1090: CLI should use enterprise LicenseValidator when available
|
|
5
|
-
*/
|
|
6
|
-
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
7
|
-
import { getLicenseStatus, getLicenseStatusLegacy, displayLicenseStatus, formatTierBadge, _resetEnterpriseValidatorCache, } from './license.js';
|
|
8
|
-
// Mock chalk to avoid ANSI codes in test output
|
|
9
|
-
vi.mock('chalk', () => ({
|
|
10
|
-
default: {
|
|
11
|
-
green: (s) => `[green]${s}[/green]`,
|
|
12
|
-
yellow: (s) => `[yellow]${s}[/yellow]`,
|
|
13
|
-
red: (s) => `[red]${s}[/red]`,
|
|
14
|
-
blue: {
|
|
15
|
-
bold: (s) => `[blue.bold]${s}[/blue.bold]`,
|
|
16
|
-
},
|
|
17
|
-
magenta: {
|
|
18
|
-
bold: (s) => `[magenta.bold]${s}[/magenta.bold]`,
|
|
19
|
-
},
|
|
20
|
-
dim: (s) => `[dim]${s}[/dim]`,
|
|
21
|
-
},
|
|
22
|
-
}));
|
|
23
|
-
describe('license utilities', () => {
|
|
24
|
-
const originalEnv = process.env['SKILLSMITH_LICENSE_KEY'];
|
|
25
|
-
beforeEach(() => {
|
|
26
|
-
delete process.env['SKILLSMITH_LICENSE_KEY'];
|
|
27
|
-
// Reset the enterprise validator cache before each test
|
|
28
|
-
_resetEnterpriseValidatorCache();
|
|
29
|
-
});
|
|
30
|
-
afterEach(() => {
|
|
31
|
-
if (originalEnv !== undefined) {
|
|
32
|
-
process.env['SKILLSMITH_LICENSE_KEY'] = originalEnv;
|
|
33
|
-
}
|
|
34
|
-
else {
|
|
35
|
-
delete process.env['SKILLSMITH_LICENSE_KEY'];
|
|
36
|
-
}
|
|
37
|
-
// Reset mock state
|
|
38
|
-
vi.restoreAllMocks();
|
|
39
|
-
});
|
|
40
|
-
/**
|
|
41
|
-
* Helper to create a valid legacy license key (base64 JSON)
|
|
42
|
-
*/
|
|
43
|
-
function createLegacyLicenseKey(tier, expiresAt, features) {
|
|
44
|
-
const payload = {
|
|
45
|
-
tier,
|
|
46
|
-
expiresAt: expiresAt.toISOString(),
|
|
47
|
-
features: features || [],
|
|
48
|
-
};
|
|
49
|
-
return Buffer.from(JSON.stringify(payload)).toString('base64');
|
|
50
|
-
}
|
|
51
|
-
describe('getLicenseStatus (without enterprise package)', () => {
|
|
52
|
-
beforeEach(() => {
|
|
53
|
-
// Mock the enterprise package to simulate it not being available
|
|
54
|
-
vi.doMock('@skillsmith/enterprise', () => {
|
|
55
|
-
throw new Error('Module not found');
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
afterEach(() => {
|
|
59
|
-
vi.doUnmock('@skillsmith/enterprise');
|
|
60
|
-
});
|
|
61
|
-
it('returns community tier when no license key is set', async () => {
|
|
62
|
-
const status = await getLicenseStatus();
|
|
63
|
-
expect(status.valid).toBe(true);
|
|
64
|
-
expect(status.tier).toBe('community');
|
|
65
|
-
expect(status.features).toContain('basic_search');
|
|
66
|
-
expect(status.features).toContain('skill_install');
|
|
67
|
-
expect(status.features).toContain('local_validation');
|
|
68
|
-
expect(status.error).toBeUndefined();
|
|
69
|
-
expect(status.expiresAt).toBeUndefined();
|
|
70
|
-
});
|
|
71
|
-
it('returns community tier when license key is set but enterprise package unavailable', async () => {
|
|
72
|
-
// Set a license key - without enterprise package, should fall back to community
|
|
73
|
-
process.env['SKILLSMITH_LICENSE_KEY'] = 'some-license-key';
|
|
74
|
-
// Reset cache to force re-evaluation of enterprise availability
|
|
75
|
-
_resetEnterpriseValidatorCache();
|
|
76
|
-
const status = await getLicenseStatus();
|
|
77
|
-
// In monorepo CI, enterprise package IS available and will validate the key
|
|
78
|
-
// An invalid key results in valid: false with community fallback
|
|
79
|
-
// This is the correct security behavior - invalid keys should not be valid
|
|
80
|
-
expect(status.tier).toBe('community');
|
|
81
|
-
expect(status.features).toContain('basic_search');
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
describe('getLicenseStatus (with enterprise package)', () => {
|
|
85
|
-
// Mock the enterprise package for these tests
|
|
86
|
-
beforeEach(() => {
|
|
87
|
-
// Reset cache to allow fresh mocking
|
|
88
|
-
_resetEnterpriseValidatorCache();
|
|
89
|
-
});
|
|
90
|
-
it('falls back to community tier when enterprise validator cannot validate', async () => {
|
|
91
|
-
// Note: This test verifies fallback behavior when enterprise validation fails
|
|
92
|
-
// Due to dynamic import mocking limitations in vitest, the enterprise package
|
|
93
|
-
// cannot be properly mocked to return validated results. This test confirms
|
|
94
|
-
// the graceful fallback to community tier when validation cannot complete.
|
|
95
|
-
//
|
|
96
|
-
// SMI-1588: Increased timeout to handle enterprise validator initialization
|
|
97
|
-
// in monorepo CI where the package is available but validation may be slow.
|
|
98
|
-
process.env['SKILLSMITH_LICENSE_KEY'] = 'valid-jwt-token';
|
|
99
|
-
// Since we can't easily mock dynamic imports in vitest without module reset,
|
|
100
|
-
// getLicenseStatus will attempt to load enterprise and fall back gracefully
|
|
101
|
-
const status = await getLicenseStatus();
|
|
102
|
-
// Without actual enterprise package validation, falls back to community
|
|
103
|
-
// In CI with enterprise available, the key is validated and rejected (invalid format)
|
|
104
|
-
// Both outcomes result in community tier, which is correct behavior
|
|
105
|
-
expect(status.tier).toBe('community');
|
|
106
|
-
}, 15000); // Extended timeout for enterprise validator initialization
|
|
107
|
-
it('returns community tier for invalid license', async () => {
|
|
108
|
-
// When enterprise package IS available but no public key is configured,
|
|
109
|
-
// or the license key is invalid, it falls back to community tier.
|
|
110
|
-
// The exact behavior depends on environment configuration.
|
|
111
|
-
process.env['SKILLSMITH_LICENSE_KEY'] = 'expired-jwt-token';
|
|
112
|
-
const status = await getLicenseStatus();
|
|
113
|
-
// Either valid=false (validator active, key rejected) or valid=true (no validator/key)
|
|
114
|
-
// In both cases, tier should be community
|
|
115
|
-
expect(status.tier).toBe('community');
|
|
116
|
-
// If enterprise validator is active but no public key configured,
|
|
117
|
-
// it returns valid:false. If validator unavailable, returns valid:true.
|
|
118
|
-
// Both are acceptable security behavior.
|
|
119
|
-
expect(typeof status.valid).toBe('boolean');
|
|
120
|
-
});
|
|
121
|
-
});
|
|
122
|
-
describe('getLicenseStatusLegacy (base64 JSON decoding)', () => {
|
|
123
|
-
it('returns community tier when no license key is set', async () => {
|
|
124
|
-
const status = await getLicenseStatusLegacy();
|
|
125
|
-
expect(status.valid).toBe(true);
|
|
126
|
-
expect(status.tier).toBe('community');
|
|
127
|
-
expect(status.features).toContain('basic_search');
|
|
128
|
-
expect(status.features).toContain('skill_install');
|
|
129
|
-
expect(status.features).toContain('local_validation');
|
|
130
|
-
expect(status.error).toBeUndefined();
|
|
131
|
-
expect(status.expiresAt).toBeUndefined();
|
|
132
|
-
});
|
|
133
|
-
it('returns valid team tier for valid team license', async () => {
|
|
134
|
-
const futureDate = new Date();
|
|
135
|
-
futureDate.setFullYear(futureDate.getFullYear() + 1);
|
|
136
|
-
const features = ['team_workspaces', 'private_skills', 'usage_analytics'];
|
|
137
|
-
process.env['SKILLSMITH_LICENSE_KEY'] = createLegacyLicenseKey('team', futureDate, features);
|
|
138
|
-
const status = await getLicenseStatusLegacy();
|
|
139
|
-
expect(status.valid).toBe(true);
|
|
140
|
-
expect(status.tier).toBe('team');
|
|
141
|
-
expect(status.features).toEqual(features);
|
|
142
|
-
expect(status.expiresAt).toBeDefined();
|
|
143
|
-
expect(status.error).toBeUndefined();
|
|
144
|
-
});
|
|
145
|
-
it('returns valid enterprise tier for valid enterprise license', async () => {
|
|
146
|
-
const futureDate = new Date();
|
|
147
|
-
futureDate.setFullYear(futureDate.getFullYear() + 1);
|
|
148
|
-
// Use canonical feature names from enterprise package
|
|
149
|
-
const features = ['sso_saml', 'audit_logging', 'rbac', 'siem_export'];
|
|
150
|
-
process.env['SKILLSMITH_LICENSE_KEY'] = createLegacyLicenseKey('enterprise', futureDate, features);
|
|
151
|
-
const status = await getLicenseStatusLegacy();
|
|
152
|
-
expect(status.valid).toBe(true);
|
|
153
|
-
expect(status.tier).toBe('enterprise');
|
|
154
|
-
expect(status.features).toEqual(features);
|
|
155
|
-
expect(status.expiresAt).toBeDefined();
|
|
156
|
-
expect(status.error).toBeUndefined();
|
|
157
|
-
});
|
|
158
|
-
it('returns error for expired license', async () => {
|
|
159
|
-
const pastDate = new Date();
|
|
160
|
-
pastDate.setFullYear(pastDate.getFullYear() - 1);
|
|
161
|
-
process.env['SKILLSMITH_LICENSE_KEY'] = createLegacyLicenseKey('team', pastDate);
|
|
162
|
-
const status = await getLicenseStatusLegacy();
|
|
163
|
-
expect(status.valid).toBe(false);
|
|
164
|
-
expect(status.tier).toBe('community');
|
|
165
|
-
expect(status.error).toContain('License expired');
|
|
166
|
-
expect(status.features).toContain('basic_search'); // Falls back to community features
|
|
167
|
-
});
|
|
168
|
-
it('returns error for invalid license key format', async () => {
|
|
169
|
-
process.env['SKILLSMITH_LICENSE_KEY'] = 'not-valid-base64!!!';
|
|
170
|
-
const status = await getLicenseStatusLegacy();
|
|
171
|
-
expect(status.valid).toBe(false);
|
|
172
|
-
expect(status.tier).toBe('community');
|
|
173
|
-
expect(status.error).toBe('Invalid license key format');
|
|
174
|
-
});
|
|
175
|
-
it('returns error for malformed JSON in license key', async () => {
|
|
176
|
-
process.env['SKILLSMITH_LICENSE_KEY'] = Buffer.from('not valid json').toString('base64');
|
|
177
|
-
const status = await getLicenseStatusLegacy();
|
|
178
|
-
expect(status.valid).toBe(false);
|
|
179
|
-
expect(status.tier).toBe('community');
|
|
180
|
-
expect(status.error).toBe('Invalid license key format');
|
|
181
|
-
});
|
|
182
|
-
it('returns error for license with invalid tier', async () => {
|
|
183
|
-
const payload = {
|
|
184
|
-
tier: 'invalid_tier',
|
|
185
|
-
expiresAt: new Date().toISOString(),
|
|
186
|
-
features: [],
|
|
187
|
-
};
|
|
188
|
-
process.env['SKILLSMITH_LICENSE_KEY'] = Buffer.from(JSON.stringify(payload)).toString('base64');
|
|
189
|
-
const status = await getLicenseStatusLegacy();
|
|
190
|
-
expect(status.valid).toBe(false);
|
|
191
|
-
expect(status.tier).toBe('community');
|
|
192
|
-
expect(status.error).toBe('Invalid license key format');
|
|
193
|
-
});
|
|
194
|
-
it('returns error for license with invalid expiration date', async () => {
|
|
195
|
-
const payload = {
|
|
196
|
-
tier: 'team',
|
|
197
|
-
expiresAt: 'not-a-date',
|
|
198
|
-
features: [],
|
|
199
|
-
};
|
|
200
|
-
process.env['SKILLSMITH_LICENSE_KEY'] = Buffer.from(JSON.stringify(payload)).toString('base64');
|
|
201
|
-
const status = await getLicenseStatusLegacy();
|
|
202
|
-
expect(status.valid).toBe(false);
|
|
203
|
-
expect(status.tier).toBe('community');
|
|
204
|
-
expect(status.error).toBe('Invalid license key format');
|
|
205
|
-
});
|
|
206
|
-
it('uses default tier features when features array is empty', async () => {
|
|
207
|
-
const futureDate = new Date();
|
|
208
|
-
futureDate.setFullYear(futureDate.getFullYear() + 1);
|
|
209
|
-
const payload = {
|
|
210
|
-
tier: 'team',
|
|
211
|
-
expiresAt: futureDate.toISOString(),
|
|
212
|
-
features: [], // Empty features should use defaults
|
|
213
|
-
};
|
|
214
|
-
process.env['SKILLSMITH_LICENSE_KEY'] = Buffer.from(JSON.stringify(payload)).toString('base64');
|
|
215
|
-
const status = await getLicenseStatusLegacy();
|
|
216
|
-
// When features array is empty, it should use the provided empty array
|
|
217
|
-
// (this is intentional - allows explicit empty features)
|
|
218
|
-
expect(status.features).toEqual([]);
|
|
219
|
-
});
|
|
220
|
-
});
|
|
221
|
-
describe('formatTierBadge', () => {
|
|
222
|
-
it('formats community tier with yellow color', () => {
|
|
223
|
-
const badge = formatTierBadge('community');
|
|
224
|
-
expect(badge).toContain('Community');
|
|
225
|
-
expect(badge).toContain('[yellow]');
|
|
226
|
-
});
|
|
227
|
-
it('formats team tier with blue bold', () => {
|
|
228
|
-
const badge = formatTierBadge('team');
|
|
229
|
-
expect(badge).toContain('Team');
|
|
230
|
-
expect(badge).toContain('[blue.bold]');
|
|
231
|
-
});
|
|
232
|
-
it('formats enterprise tier with magenta bold', () => {
|
|
233
|
-
const badge = formatTierBadge('enterprise');
|
|
234
|
-
expect(badge).toContain('Enterprise');
|
|
235
|
-
expect(badge).toContain('[magenta.bold]');
|
|
236
|
-
});
|
|
237
|
-
});
|
|
238
|
-
describe('displayLicenseStatus', () => {
|
|
239
|
-
let consoleSpy;
|
|
240
|
-
beforeEach(() => {
|
|
241
|
-
consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
242
|
-
});
|
|
243
|
-
afterEach(() => {
|
|
244
|
-
consoleSpy.mockRestore();
|
|
245
|
-
});
|
|
246
|
-
it('displays community tier with free tier label', () => {
|
|
247
|
-
const status = {
|
|
248
|
-
valid: true,
|
|
249
|
-
tier: 'community',
|
|
250
|
-
features: ['basic_search'],
|
|
251
|
-
};
|
|
252
|
-
displayLicenseStatus(status);
|
|
253
|
-
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Community'));
|
|
254
|
-
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('free tier'));
|
|
255
|
-
});
|
|
256
|
-
it('displays team tier with expiration date', () => {
|
|
257
|
-
const expiresAt = new Date('2026-12-31T00:00:00.000Z');
|
|
258
|
-
const status = {
|
|
259
|
-
valid: true,
|
|
260
|
-
tier: 'team',
|
|
261
|
-
expiresAt,
|
|
262
|
-
features: ['team_workspaces', 'private_skills'],
|
|
263
|
-
};
|
|
264
|
-
displayLicenseStatus(status);
|
|
265
|
-
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Team'));
|
|
266
|
-
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('2026-12-31'));
|
|
267
|
-
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('team_workspaces'));
|
|
268
|
-
});
|
|
269
|
-
it('displays enterprise tier with features', () => {
|
|
270
|
-
const expiresAt = new Date('2027-06-15T00:00:00.000Z');
|
|
271
|
-
const status = {
|
|
272
|
-
valid: true,
|
|
273
|
-
tier: 'enterprise',
|
|
274
|
-
expiresAt,
|
|
275
|
-
// Use canonical feature names from enterprise package
|
|
276
|
-
features: ['sso_saml', 'audit_logging', 'rbac'],
|
|
277
|
-
};
|
|
278
|
-
displayLicenseStatus(status);
|
|
279
|
-
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Enterprise'));
|
|
280
|
-
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('sso_saml'));
|
|
281
|
-
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('audit_logging'));
|
|
282
|
-
});
|
|
283
|
-
it('displays warning for invalid license', () => {
|
|
284
|
-
const status = {
|
|
285
|
-
valid: false,
|
|
286
|
-
tier: 'community',
|
|
287
|
-
features: ['basic_search'],
|
|
288
|
-
error: 'Invalid license key format',
|
|
289
|
-
};
|
|
290
|
-
displayLicenseStatus(status);
|
|
291
|
-
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Invalid license key format'));
|
|
292
|
-
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Continuing with community tier'));
|
|
293
|
-
});
|
|
294
|
-
it('displays warning for expired license', () => {
|
|
295
|
-
const status = {
|
|
296
|
-
valid: false,
|
|
297
|
-
tier: 'community',
|
|
298
|
-
expiresAt: new Date('2024-01-15'),
|
|
299
|
-
features: ['basic_search'],
|
|
300
|
-
error: 'License expired on 2024-01-15',
|
|
301
|
-
};
|
|
302
|
-
displayLicenseStatus(status);
|
|
303
|
-
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('License expired'));
|
|
304
|
-
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Continuing with community tier'));
|
|
305
|
-
});
|
|
306
|
-
});
|
|
307
|
-
});
|
|
308
|
-
//# sourceMappingURL=license.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"license.test.js","sourceRoot":"","sources":["../../../src/utils/license.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Thin manifest reader for the Skillsmith CLI
|
|
3
|
-
* @module @skillsmith/cli/utils/manifest
|
|
4
|
-
* @see SMI-skill-version-tracking Wave 2
|
|
5
|
-
* @see SMI-5012 Wave 3: telemetry block + annual anonymous_id rotation
|
|
6
|
-
*
|
|
7
|
-
* Reads (and optionally writes) the ~/.skillsmith/manifest.json file.
|
|
8
|
-
* This mirrors the SkillManifest types defined in
|
|
9
|
-
* @skillsmith/mcp-server/tools/install.types without creating a cross-package
|
|
10
|
-
* dependency on mcp-server.
|
|
11
|
-
*
|
|
12
|
-
* The CLI owns its own read path; write operations (pin/unpin) use
|
|
13
|
-
* updateManifestEntry below which does an atomic temp-file rename.
|
|
14
|
-
*
|
|
15
|
-
* Concurrency note (v1): the atomic temp-file rename guarantees readers never
|
|
16
|
-
* see partial writes (POSIX rename(2) is atomic). A full file-lock (proper-lockfile)
|
|
17
|
-
* is NOT used here because proper-lockfile is not in the CLI's dependencies.
|
|
18
|
-
* v1 assumes single-writer-per-process; concurrent writers from the same machine
|
|
19
|
-
* (e.g., two concurrent `skillsmith telemetry` calls) may last-write-wins.
|
|
20
|
-
* This matches the shared-state matrix entry (plan line 715) which notes the
|
|
21
|
-
* proper-lockfile pattern but is aspirational for v2.
|
|
22
|
-
*/
|
|
23
|
-
export interface SkillManifestEntry {
|
|
24
|
-
id: string;
|
|
25
|
-
name: string;
|
|
26
|
-
version: string;
|
|
27
|
-
source: string;
|
|
28
|
-
installPath: string;
|
|
29
|
-
installedAt: string;
|
|
30
|
-
lastUpdated: string;
|
|
31
|
-
originalContentHash?: string;
|
|
32
|
-
contentHash?: string;
|
|
33
|
-
/** Wave 2: pinned content hash (8-char truncation of full SHA-256) */
|
|
34
|
-
pinnedVersion?: string;
|
|
35
|
-
updatePolicy?: 'auto' | 'manual' | 'never';
|
|
36
|
-
}
|
|
37
|
-
export interface SkillManifest {
|
|
38
|
-
version: string;
|
|
39
|
-
installedSkills: Record<string, SkillManifestEntry>;
|
|
40
|
-
/** SMI-5012 W3: telemetry opt-in block. Absent on older configs; treated as { enabled: false }. */
|
|
41
|
-
telemetry?: TelemetryManifest;
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Telemetry configuration stored in ~/.skillsmith/manifest.json.
|
|
45
|
-
*
|
|
46
|
-
* Schema is additive: older configs without this block continue to load
|
|
47
|
-
* (missing block is treated as { enabled: false } everywhere it is read).
|
|
48
|
-
*
|
|
49
|
-
* anonymous_id rotation policy (U6 / M7):
|
|
50
|
-
* - Generated via SHA-256(crypto.randomUUID()) on first opt-in
|
|
51
|
-
* - Auto-rotates after 365 days (checked on `skillsmith telemetry status`)
|
|
52
|
-
* - One-week overlap window: previous id is retained in previousAnonymousId
|
|
53
|
-
* until previousAnonymousIdRetiredAt so cross-rotation events can be joined
|
|
54
|
-
* - Manual rotation: `skillsmith telemetry reset-id` (SMI-5021)
|
|
55
|
-
*/
|
|
56
|
-
export interface TelemetryManifest {
|
|
57
|
-
/** Whether telemetry is enabled. Always opt-in; default false. */
|
|
58
|
-
enabled: boolean;
|
|
59
|
-
/** SHA-256 hex of a random UUID; 64 hex chars. Present only when enabled. */
|
|
60
|
-
anonymousId?: string;
|
|
61
|
-
/** ISO-8601 date when anonymousId was generated. Enables annual rotation check. */
|
|
62
|
-
anonymousIdCreatedAt?: string;
|
|
63
|
-
/** Previous anonymousId retained for one-week overlap window after rotation. */
|
|
64
|
-
previousAnonymousId?: string;
|
|
65
|
-
/** ISO-8601 date after which previousAnonymousId can be swept. */
|
|
66
|
-
previousAnonymousIdRetiredAt?: string;
|
|
67
|
-
/** Telemetry scope. Default 'personal'. */
|
|
68
|
-
scope?: 'personal' | 'team';
|
|
69
|
-
/** Present when scope === 'team'. */
|
|
70
|
-
teamId?: string;
|
|
71
|
-
/** Override for staging. Default: prod events endpoint. */
|
|
72
|
-
endpoint?: string;
|
|
73
|
-
/** ISO-8601 date when the Claude Code hook was last installed. */
|
|
74
|
-
installedAt?: string;
|
|
75
|
-
}
|
|
76
|
-
export declare const MANIFEST_PATH: string;
|
|
77
|
-
/**
|
|
78
|
-
* Load the manifest from disk.
|
|
79
|
-
* Returns an empty manifest if the file does not exist.
|
|
80
|
-
*/
|
|
81
|
-
export declare function loadManifest(): Promise<SkillManifest>;
|
|
82
|
-
/**
|
|
83
|
-
* Save the manifest atomically (temp file → rename).
|
|
84
|
-
*/
|
|
85
|
-
export declare function saveManifest(manifest: SkillManifest): Promise<void>;
|
|
86
|
-
/**
|
|
87
|
-
* Load the manifest, apply an update function, and save atomically.
|
|
88
|
-
*/
|
|
89
|
-
export declare function updateManifestEntry(updateFn: (manifest: SkillManifest) => SkillManifest): Promise<void>;
|
|
90
|
-
/**
|
|
91
|
-
* Generate a new anonymous telemetry id.
|
|
92
|
-
*
|
|
93
|
-
* Returns SHA-256(crypto.randomUUID()) as a 64-character lowercase hex string.
|
|
94
|
-
* The UUID is not stored; only the hash reaches the wire (plan line 719).
|
|
95
|
-
*/
|
|
96
|
-
export declare function generateAnonymousId(): string;
|
|
97
|
-
/**
|
|
98
|
-
* Returns true if the manifest's anonymousId should be rotated.
|
|
99
|
-
*
|
|
100
|
-
* Rotation is triggered when anonymousIdCreatedAt is older than 365 days.
|
|
101
|
-
* Returns false if the field is absent (id was never generated).
|
|
102
|
-
*/
|
|
103
|
-
export declare function shouldRotateAnonymousId(manifest: SkillManifest): boolean;
|
|
104
|
-
/**
|
|
105
|
-
* Rotate the anonymous id.
|
|
106
|
-
*
|
|
107
|
-
* Moves the current id to previousAnonymousId with a 7-day retirement window,
|
|
108
|
-
* generates a fresh id, and updates anonymousIdCreatedAt to now.
|
|
109
|
-
* Returns a new TelemetryManifest — does NOT write to disk.
|
|
110
|
-
* Callers must persist via saveManifest / updateManifestEntry.
|
|
111
|
-
*/
|
|
112
|
-
export declare function rotateAnonymousId(manifest: SkillManifest): TelemetryManifest;
|
|
113
|
-
/**
|
|
114
|
-
* Remove previousAnonymousId once its retirement window has passed.
|
|
115
|
-
*
|
|
116
|
-
* Should be called on every `skillsmith telemetry status` run and before
|
|
117
|
-
* each hook-script read. No-op if the window has not yet elapsed or if
|
|
118
|
-
* there is no previous id. Returns a new TelemetryManifest.
|
|
119
|
-
*/
|
|
120
|
-
export declare function sweepExpiredPreviousId(manifest: SkillManifest): TelemetryManifest;
|
|
121
|
-
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/utils/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAWH,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAA;CAC3C;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAA;IACnD,mGAAmG;IACnG,SAAS,CAAC,EAAE,iBAAiB,CAAA;CAC9B;AAMD;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,iBAAiB;IAChC,kEAAkE;IAClE,OAAO,EAAE,OAAO,CAAA;IAChB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,mFAAmF;IACnF,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,gFAAgF;IAChF,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,kEAAkE;IAClE,4BAA4B,CAAC,EAAE,MAAM,CAAA;IACrC,2CAA2C;IAC3C,KAAK,CAAC,EAAE,UAAU,GAAG,MAAM,CAAA;IAC3B,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAOD,eAAO,MAAM,aAAa,QAAwC,CAAA;AAMlE;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,aAAa,CAAC,CAO3D;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAKzE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,aAAa,GACnD,OAAO,CAAC,IAAI,CAAC,CAIf;AAUD;;;;;GAKG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAKxE;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,GAAG,iBAAiB,CAc5E;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,aAAa,GAAG,iBAAiB,CAOjF"}
|