@sprucelabs/spruce-cli 29.0.1 → 29.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/build/__tests__/behavioral/skill/RegisteringAGoSkill.test.d.ts +5 -0
  3. package/build/__tests__/behavioral/skill/RegisteringAGoSkill.test.js +41 -0
  4. package/build/__tests__/behavioral/skill/RegisteringAGoSkill.test.js.map +1 -0
  5. package/build/__tests__/behavioral/skill/UnregisteringASkill.test.d.ts +23 -0
  6. package/build/__tests__/behavioral/skill/UnregisteringASkill.test.js +143 -0
  7. package/build/__tests__/behavioral/skill/UnregisteringASkill.test.js.map +1 -0
  8. package/build/__tests__/support/EventFaker.d.ts +7 -2
  9. package/build/__tests__/support/EventFaker.js +22 -2
  10. package/build/__tests__/support/EventFaker.js.map +1 -1
  11. package/build/errors/SpruceError.js +1 -1
  12. package/build/errors/SpruceError.js.map +1 -1
  13. package/build/features/FeatureInstaller.d.ts +1 -1
  14. package/build/features/FeatureInstallerFactory.js +3 -0
  15. package/build/features/FeatureInstallerFactory.js.map +1 -1
  16. package/build/features/global/GlobalFeature.d.ts +21 -0
  17. package/build/features/global/GlobalFeature.js +21 -0
  18. package/build/features/global/GlobalFeature.js.map +1 -0
  19. package/build/features/global/actions/UnregisterSkillAction.d.ts +18 -0
  20. package/build/features/global/actions/UnregisterSkillAction.js +59 -0
  21. package/build/features/global/actions/UnregisterSkillAction.js.map +1 -0
  22. package/package.json +3 -3
  23. package/src/__tests__/behavioral/skill/RegisteringAGoSkill.test.ts +29 -0
  24. package/src/__tests__/behavioral/skill/UnregisteringASkill.test.ts +160 -0
  25. package/src/__tests__/support/EventFaker.ts +48 -4
  26. package/src/errors/SpruceError.ts +1 -1
  27. package/src/features/FeatureInstallerFactory.ts +3 -0
  28. package/src/features/global/GlobalFeature.ts +29 -0
  29. package/src/features/global/actions/UnregisterSkillAction.ts +67 -0
package/CHANGELOG.md CHANGED
@@ -3,6 +3,17 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [29.1.0](https://github.com/sprucelabsai-community/spruce-cli-workspace/compare/v29.0.1...v29.1.0) (2025-11-13)
7
+
8
+
9
+ ### Features
10
+
11
+ * unregister.skill command ([da2f73a](https://github.com/sprucelabsai-community/spruce-cli-workspace/commit/da2f73a))
12
+
13
+
14
+
15
+
16
+
6
17
  ## [29.0.1](https://github.com/sprucelabsai-community/spruce-cli-workspace/compare/v29.0.0...v29.0.1) (2025-11-02)
7
18
 
8
19
  **Note:** Version bump only for package @sprucelabs/spruce-cli
@@ -0,0 +1,5 @@
1
+ import AbstractCliTest from '../../../tests/AbstractCliTest';
2
+ export default class RegisteringAGoSkillTest extends AbstractCliTest {
3
+ protected static stub(): Promise<void>;
4
+ protected static canCreateRegisteringAGoSkill(): Promise<void>;
5
+ }
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const mercury_client_1 = require("@sprucelabs/mercury-client");
13
+ const test_utils_1 = require("@sprucelabs/test-utils");
14
+ const AbstractCliTest_1 = __importDefault(require("../../../tests/AbstractCliTest"));
15
+ class RegisteringAGoSkillTest extends AbstractCliTest_1.default {
16
+ static async stub() { }
17
+ static async canCreateRegisteringAGoSkill() {
18
+ mercury_client_1.MercuryClientFactory.setIsTestMode(true);
19
+ let wasHit = false;
20
+ await this.eventFaker.fakeRegisterSkill(() => {
21
+ wasHit = true;
22
+ });
23
+ await this.go.initGoProject();
24
+ await this.Action('skill', 'register', {
25
+ shouldAutoHandleDependencies: true,
26
+ }).execute({
27
+ nameReadable: 'My Go Skill',
28
+ nameKebab: 'my-go-skill',
29
+ description: 'A skill built with Go',
30
+ });
31
+ test_utils_1.assert.isTrue(wasHit, 'Register skill event was not hit');
32
+ }
33
+ }
34
+ exports.default = RegisteringAGoSkillTest;
35
+ __decorate([
36
+ test_utils_1.test.only()
37
+ ], RegisteringAGoSkillTest, "stub", null);
38
+ __decorate([
39
+ (0, test_utils_1.test)()
40
+ ], RegisteringAGoSkillTest, "canCreateRegisteringAGoSkill", null);
41
+ //# sourceMappingURL=RegisteringAGoSkill.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RegisteringAGoSkill.test.js","sourceRoot":"","sources":["../../../../src/__tests__/behavioral/skill/RegisteringAGoSkill.test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,+DAAiE;AACjE,uDAAqD;AACrD,qFAA4D;AAE5D,MAAqB,uBAAwB,SAAQ,yBAAe;IAEzC,AAAb,MAAM,CAAC,KAAK,CAAC,IAAI,KAAI,CAAC;IAGT,AAAb,MAAM,CAAC,KAAK,CAAC,4BAA4B;QAC/C,qCAAoB,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;QACxC,IAAI,MAAM,GAAG,KAAK,CAAA;QAClB,MAAM,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,GAAG,EAAE;YACzC,MAAM,GAAG,IAAI,CAAA;QACjB,CAAC,CAAC,CAAA;QAEF,MAAM,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAA;QAE7B,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE;YACnC,4BAA4B,EAAE,IAAI;SACrC,CAAC,CAAC,OAAO,CAAC;YACP,YAAY,EAAE,aAAa;YAC3B,SAAS,EAAE,aAAa;YACxB,WAAW,EAAE,uBAAuB;SACvC,CAAC,CAAA;QAEF,mBAAM,CAAC,MAAM,CAAC,MAAM,EAAE,kCAAkC,CAAC,CAAA;IAC7D,CAAC;CACJ;AAxBD,0CAwBC;AAtB0B;IADtB,iBAAI,CAAC,IAAI,EAAE;yCACoB;AAGT;IADtB,IAAA,iBAAI,GAAE;iEAmBN"}
@@ -0,0 +1,23 @@
1
+ import AbstractCliTest from '../../../tests/AbstractCliTest';
2
+ export default class UnregisteringASkillTest extends AbstractCliTest {
3
+ private static action;
4
+ private static lastListSkillsPayload;
5
+ private static fakedSkills;
6
+ private static executePromise;
7
+ private static lastUnregisterSkillTarget?;
8
+ protected static beforeEach(): Promise<void>;
9
+ protected static hasAction(): Promise<void>;
10
+ protected static firstThingListsSkills(): Promise<void>;
11
+ protected static presentsAnOptionForOnlySkillReturned(): Promise<void>;
12
+ protected static presentsOptionsForMultipleSkills(): Promise<void>;
13
+ protected static passesSelectedSkillToUnregister(idx: number): Promise<void>;
14
+ protected static doesNotUnRegisterIfNotConfirmed(): Promise<void>;
15
+ private static executeAndWaitForInput;
16
+ private static selectSkill;
17
+ private static assertProptsForAllSkills;
18
+ private static pressEnter;
19
+ private static generateExpectedSkillChoices;
20
+ private static pushFakedSkill;
21
+ private static waitUntilFinished;
22
+ private static execute;
23
+ }
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const mercury_client_1 = require("@sprucelabs/mercury-client");
13
+ const test_utils_1 = require("@sprucelabs/test-utils");
14
+ const AbstractCliTest_1 = __importDefault(require("../../../tests/AbstractCliTest"));
15
+ class UnregisteringASkillTest extends AbstractCliTest_1.default {
16
+ static action;
17
+ static lastListSkillsPayload;
18
+ static fakedSkills = [];
19
+ static executePromise;
20
+ static lastUnregisterSkillTarget;
21
+ static async beforeEach() {
22
+ await super.beforeEach();
23
+ mercury_client_1.MercuryClientFactory.setIsTestMode(true);
24
+ mercury_client_1.MercuryTestClient.setShouldRequireLocalListeners(true);
25
+ this.action = this.Action('global', 'unregisterSkill');
26
+ delete this.lastListSkillsPayload;
27
+ delete this.lastUnregisterSkillTarget;
28
+ this.fakedSkills = [];
29
+ await this.eventFaker.fakeListSkills(({ payload }) => {
30
+ this.lastListSkillsPayload = payload;
31
+ return this.fakedSkills;
32
+ });
33
+ await this.eventFaker.fakeUnregisterSkill(({ target }) => {
34
+ this.lastUnregisterSkillTarget = target;
35
+ });
36
+ }
37
+ static async hasAction() {
38
+ test_utils_1.assert.isFunction(this.action.execute, 'Action not found');
39
+ }
40
+ static async firstThingListsSkills() {
41
+ await this.execute();
42
+ await this.waitUntilFinished();
43
+ test_utils_1.assert.isEqualDeep(this.lastListSkillsPayload, {
44
+ shouldOnlyShowMine: true,
45
+ });
46
+ }
47
+ static async presentsAnOptionForOnlySkillReturned() {
48
+ this.pushFakedSkill();
49
+ await this.executeAndWaitForInput();
50
+ this.assertProptsForAllSkills();
51
+ await this.selectSkill(0);
52
+ await this.pressEnter();
53
+ }
54
+ static async presentsOptionsForMultipleSkills() {
55
+ this.pushFakedSkill();
56
+ this.pushFakedSkill();
57
+ this.pushFakedSkill();
58
+ await this.executeAndWaitForInput();
59
+ this.assertProptsForAllSkills();
60
+ await this.selectSkill(1);
61
+ await this.pressEnter();
62
+ }
63
+ static async passesSelectedSkillToUnregister(idx) {
64
+ this.pushFakedSkill();
65
+ this.pushFakedSkill();
66
+ await this.executeAndWaitForInput();
67
+ await this.selectSkill(idx);
68
+ await this.pressEnter();
69
+ await this.waitUntilFinished();
70
+ test_utils_1.assert.isEqualDeep(this.lastUnregisterSkillTarget, {
71
+ skillId: this.fakedSkills[idx].id,
72
+ }, 'Skill ID not passed to unregister skill');
73
+ }
74
+ static async doesNotUnRegisterIfNotConfirmed() {
75
+ this.pushFakedSkill();
76
+ await this.executeAndWaitForInput();
77
+ await this.selectSkill(0);
78
+ await this.ui.sendInput('n');
79
+ await this.waitUntilFinished();
80
+ test_utils_1.assert.isFalsy(this.lastUnregisterSkillTarget, 'Unregister skill was called unexpectedly');
81
+ }
82
+ static async executeAndWaitForInput() {
83
+ await this.execute();
84
+ await this.waitForInput();
85
+ }
86
+ static async selectSkill(idx) {
87
+ await this.ui.sendInput(this.fakedSkills[idx].id);
88
+ }
89
+ static assertProptsForAllSkills() {
90
+ const prompt = this.ui.getLastInvocation();
91
+ test_utils_1.assert.isEqualDeep(prompt.options, {
92
+ type: 'select',
93
+ isRequired: true,
94
+ options: {
95
+ choices: this.generateExpectedSkillChoices(),
96
+ },
97
+ });
98
+ }
99
+ static async pressEnter() {
100
+ await this.ui.sendInput('\n');
101
+ }
102
+ static generateExpectedSkillChoices() {
103
+ return this.fakedSkills.map((skill) => ({
104
+ value: skill.id,
105
+ label: `${skill.slug}: ${skill.name}`,
106
+ }));
107
+ }
108
+ static pushFakedSkill() {
109
+ this.fakedSkills.push({
110
+ id: (0, test_utils_1.generateId)(),
111
+ dateCreated: Date.now(),
112
+ slug: (0, test_utils_1.generateId)(),
113
+ name: (0, test_utils_1.generateId)(),
114
+ });
115
+ }
116
+ static async waitUntilFinished() {
117
+ await this.executePromise;
118
+ }
119
+ static async execute() {
120
+ this.executePromise = this.action.execute();
121
+ }
122
+ }
123
+ exports.default = UnregisteringASkillTest;
124
+ __decorate([
125
+ (0, test_utils_1.test)()
126
+ ], UnregisteringASkillTest, "hasAction", null);
127
+ __decorate([
128
+ (0, test_utils_1.test)()
129
+ ], UnregisteringASkillTest, "firstThingListsSkills", null);
130
+ __decorate([
131
+ (0, test_utils_1.test)()
132
+ ], UnregisteringASkillTest, "presentsAnOptionForOnlySkillReturned", null);
133
+ __decorate([
134
+ (0, test_utils_1.test)()
135
+ ], UnregisteringASkillTest, "presentsOptionsForMultipleSkills", null);
136
+ __decorate([
137
+ (0, test_utils_1.test)('can unregister first skill', 0),
138
+ (0, test_utils_1.test)('can unregister second skill', 1)
139
+ ], UnregisteringASkillTest, "passesSelectedSkillToUnregister", null);
140
+ __decorate([
141
+ (0, test_utils_1.test)()
142
+ ], UnregisteringASkillTest, "doesNotUnRegisterIfNotConfirmed", null);
143
+ //# sourceMappingURL=UnregisteringASkill.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UnregisteringASkill.test.js","sourceRoot":"","sources":["../../../../src/__tests__/behavioral/skill/UnregisteringASkill.test.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,21 @@
1
1
  import { SpruceSchemas } from '@sprucelabs/mercury-types';
2
- import { Organization } from '@sprucelabs/spruce-core-schemas';
2
+ import { Organization, Skill } from '@sprucelabs/spruce-core-schemas';
3
3
  import { ListPermContractsTargetAndPayload } from '../../features/permission/stores/PermissionStore';
4
4
  export default class EventFaker {
5
+ fakeUnregisterSkill(cb?: (targetAndPayload: UnregisterSkillTargetAndPayload) => void): Promise<void>;
6
+ fakeRegisterSkill(cb?: (targetAndPayload: RegisterSkillTargetAndPayload) => void | Skill): Promise<void>;
5
7
  fakeSyncPermissionContracts(): Promise<void>;
6
8
  fakeRegisterEvents(cb?: () => void): Promise<void>;
7
9
  fakeGetEventContracts(): Promise<void>;
8
10
  fakeCreateOrganization(cb?: (targetAndPayload: CreateOrganizationTargetAndPayload) => void | Organization): Promise<void>;
9
11
  generateOrganizationValues(): Organization;
10
- fakeListSkills(cb?: () => void | ListSkill[]): Promise<void>;
12
+ fakeListSkills(cb?: (targetAndPayload: ListSkillsTargetAndPayload) => void | ListSkill[]): Promise<void>;
11
13
  fakeListPermissionContracts(cb?: (targetAndPayload: ListPermContractsTargetAndPayload) => void | SpruceSchemas.Mercury.v2020_12_25.ListPermissionContractsResponsePayload['permissionContracts']): Promise<void>;
12
14
  fakeRequestPin(): Promise<void>;
13
15
  fakeConfirmPin(): Promise<void>;
14
16
  }
15
17
  export type ListSkill = SpruceSchemas.Mercury.v2020_12_25.ListSkillsSkill;
16
18
  export type CreateOrganizationTargetAndPayload = SpruceSchemas.Mercury.v2020_12_25.CreateOrganizationEmitTargetAndPayload;
19
+ export type RegisterSkillTargetAndPayload = SpruceSchemas.Mercury.v2020_12_25.RegisterSkillEmitTargetAndPayload;
20
+ export type ListSkillsTargetAndPayload = SpruceSchemas.Mercury.v2020_12_25.ListSkillsEmitTargetAndPayload;
21
+ export type UnregisterSkillTargetAndPayload = SpruceSchemas.Mercury.v2020_12_25.UnregisterSkillEmitTargetAndPayload;
@@ -3,6 +3,26 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const spruce_test_fixtures_1 = require("@sprucelabs/spruce-test-fixtures");
4
4
  const test_utils_1 = require("@sprucelabs/test-utils");
5
5
  class EventFaker {
6
+ async fakeUnregisterSkill(cb) {
7
+ await spruce_test_fixtures_1.eventFaker.on('unregister-skill::v2020_12_25', (targetAndPayload) => {
8
+ cb?.(targetAndPayload);
9
+ return {};
10
+ });
11
+ }
12
+ async fakeRegisterSkill(cb) {
13
+ await spruce_test_fixtures_1.eventFaker.on('register-skill::v2020_12_25', (targetAndPayload) => {
14
+ return {
15
+ skill: cb?.(targetAndPayload) ?? {
16
+ id: (0, test_utils_1.generateId)(),
17
+ name: (0, test_utils_1.generateId)(),
18
+ slug: (0, test_utils_1.generateId)(),
19
+ apiKey: (0, test_utils_1.generateId)(),
20
+ dateCreated: Date.now(),
21
+ creators: [],
22
+ },
23
+ };
24
+ });
25
+ }
6
26
  async fakeSyncPermissionContracts() {
7
27
  await spruce_test_fixtures_1.eventFaker.on('sync-permission-contracts::v2020_12_25', () => {
8
28
  return {
@@ -47,9 +67,9 @@ class EventFaker {
47
67
  };
48
68
  }
49
69
  async fakeListSkills(cb) {
50
- await spruce_test_fixtures_1.eventFaker.on('list-skills::v2020_12_25', () => {
70
+ await spruce_test_fixtures_1.eventFaker.on('list-skills::v2020_12_25', (targetAndPayload) => {
51
71
  return {
52
- skills: cb?.() ?? [],
72
+ skills: cb?.(targetAndPayload) ?? [],
53
73
  };
54
74
  });
55
75
  }
@@ -1 +1 @@
1
- {"version":3,"file":"EventFaker.js","sourceRoot":"","sources":["../../../src/__tests__/support/EventFaker.ts"],"names":[],"mappings":";;AAEA,2EAA6D;AAC7D,uDAAmD;AAGnD,MAAqB,UAAU;IACpB,KAAK,CAAC,2BAA2B;QACpC,MAAM,iCAAU,CAAC,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAC/D,OAAO;gBACH,eAAe,EAAE,EAAE;aACtB,CAAA;QACL,CAAC,CAAC,CAAA;IACN,CAAC;IACM,KAAK,CAAC,kBAAkB,CAAC,EAAe;QAC3C,MAAM,iCAAU,CAAC,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACrD,EAAE,EAAE,EAAE,CAAA;YACN,OAAO;gBACH,KAAK,EAAE,EAAE;aACZ,CAAA;QACL,CAAC,CAAC,CAAA;IACN,CAAC;IACM,KAAK,CAAC,qBAAqB;QAC9B,MAAM,iCAAU,CAAC,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YACzD,OAAO;gBACH,SAAS,EAAE;oBACP;wBACI,EAAE,EAAE,IAAA,uBAAU,GAAE;wBAChB,eAAe,EAAE,EAAE;qBACtB;iBACJ;aACJ,CAAA;QACL,CAAC,CAAC,CAAA;IACN,CAAC;IACM,KAAK,CAAC,sBAAsB,CAC/B,EAEwB;QAExB,MAAM,iCAAU,CAAC,EAAE,CACf,kCAAkC,EAClC,CAAC,gBAAgB,EAAE,EAAE;YACjB,OAAO;gBACH,YAAY,EACR,EAAE,EAAE,CAAC,gBAAgB,CAAC;oBACtB,IAAI,CAAC,0BAA0B,EAAE;aACxC,CAAA;QACL,CAAC,CACJ,CAAA;IACL,CAAC;IAEM,0BAA0B;QAC7B,OAAO;YACH,EAAE,EAAE,IAAA,uBAAU,GAAE;YAChB,IAAI,EAAE,IAAA,uBAAU,GAAE;YAClB,IAAI,EAAE,IAAA,uBAAU,GAAE;YAClB,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;SAC1B,CAAA;IACL,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,EAA6B;QACrD,MAAM,iCAAU,CAAC,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YACjD,OAAO;gBACH,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE;aACvB,CAAA;QACL,CAAC,CAAC,CAAA;IACN,CAAC;IAEM,KAAK,CAAC,2BAA2B,CACpC,EAIqG;QAErG,MAAM,iCAAU,CAAC,EAAE,CACf,wCAAwC,EACxC,CAAC,gBAAgB,EAAE,EAAE;YACjB,OAAO;gBACH,mBAAmB,EAAE,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE;aACpD,CAAA;QACL,CAAC,CACJ,CAAA;IACL,CAAC;IAEM,KAAK,CAAC,cAAc;QACvB,MAAM,iCAAU,CAAC,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YACjD,OAAO;gBACH,SAAS,EAAE,IAAA,uBAAU,GAAE;aAC1B,CAAA;QACL,CAAC,CAAC,CAAA;IACN,CAAC;IAEM,KAAK,CAAC,cAAc;QACvB,MAAM,iCAAU,CAAC,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YACjD,OAAO;gBACH,KAAK,EAAE,IAAA,uBAAU,GAAE;gBACnB,MAAM,EAAE;oBACJ,EAAE,EAAE,IAAA,uBAAU,GAAE;oBAChB,UAAU,EAAE,IAAA,uBAAU,GAAE;oBACxB,WAAW,EAAE,CAAC;iBACjB;aACJ,CAAA;QACL,CAAC,CAAC,CAAA;IACN,CAAC;CACJ;AAnGD,6BAmGC"}
1
+ {"version":3,"file":"EventFaker.js","sourceRoot":"","sources":["../../../src/__tests__/support/EventFaker.ts"],"names":[],"mappings":"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"}
@@ -127,7 +127,7 @@ class SpruceError extends error_1.default {
127
127
  message = 'The directory you are in is not a skill!';
128
128
  break;
129
129
  case 'SKILL_NOT_REGISTERED':
130
- message = `Dang! I can't continue until you register your skill! Run \`spruce login\` and then \`spruce register.skill\` to get the ball rolling!`;
130
+ message = `Dang! I can't continue until you register your skill! Run \`spruce login\` and then \`spruce register\` to get the ball rolling!`;
131
131
  break;
132
132
  case 'NO_ORGANIZATIONS_FOUND':
133
133
  message =
@@ -1 +1 @@
1
- {"version":3,"file":"SpruceError.js","sourceRoot":"","sources":["../../src/errors/SpruceError.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SpruceError.js","sourceRoot":"","sources":["../../src/errors/SpruceError.ts"],"names":[],"mappings":"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"}
@@ -39,7 +39,7 @@ export declare class FeatureInstallerImpl implements ServiceProvider, FeatureIns
39
39
  Service<S extends Service>(type: S, cwd?: string): ServiceMap[S];
40
40
  getOptionsForFeature(code: FeatureCode): import("@sprucelabs/schema").Schema | import("@sprucelabs/mercury-types").SpruceSchemas.SpruceCli.v2020_07_22.SkillFeatureSchema | import("@sprucelabs/mercury-types").SpruceSchemas.SpruceCli.v2020_07_22.NodeFeatureOptionsSchema | undefined;
41
41
  getAllCodes(): FeatureCode[];
42
- getInstalledFeatures(): Promise<(import("./schema/SchemaFeature").default | import("./test/TestFeature").default | import("./skill/SkillFeature").default<import("@sprucelabs/mercury-types").SpruceSchemas.SpruceCli.v2020_07_22.SkillFeatureSchema> | import("./error/ErrorFeature").default | import("./node/NodeFeature").default<import("@sprucelabs/mercury-types").SpruceSchemas.SpruceCli.v2020_07_22.NodeFeatureOptionsSchema> | import("./dependencies/DependencyFeature").default | import("./agent/AgentFeature").default | import("./cache/CacheFeature").default | import("./conversation/ConversationFeature").default | import("./deploy/DeployFeature").default | import("./event/EventFeature").default | import("./eventContract/EventContractFeature").default | import("./log/LogFeature").default | import("./onboard/OnboardFeature").default | import("./organization/OrganizationFeature").default | import("./permission/PermissionFeature").default | import("./person/PersonFeature").default | import("./polish/PolishFeature").default | import("./sandbox/SandboxFeature").default | import("./store/StoreFeature").default | import("./view/ViewFeature").default | import("./vscode/VsCodeFeature").default | import("./watch/WatchFeature").default)[]>;
42
+ getInstalledFeatures(): Promise<(import("./schema/SchemaFeature").default | import("./test/TestFeature").default | import("./skill/SkillFeature").default<import("@sprucelabs/mercury-types").SpruceSchemas.SpruceCli.v2020_07_22.SkillFeatureSchema> | import("./error/ErrorFeature").default | import("./node/NodeFeature").default<import("@sprucelabs/mercury-types").SpruceSchemas.SpruceCli.v2020_07_22.NodeFeatureOptionsSchema> | import("./dependencies/DependencyFeature").default | import("./agent/AgentFeature").default | import("./cache/CacheFeature").default | import("./conversation/ConversationFeature").default | import("./deploy/DeployFeature").default | import("./event/EventFeature").default | import("./eventContract/EventContractFeature").default | import("./global/GlobalFeature").default | import("./log/LogFeature").default | import("./onboard/OnboardFeature").default | import("./organization/OrganizationFeature").default | import("./permission/PermissionFeature").default | import("./person/PersonFeature").default | import("./polish/PolishFeature").default | import("./sandbox/SandboxFeature").default | import("./store/StoreFeature").default | import("./view/ViewFeature").default | import("./vscode/VsCodeFeature").default | import("./watch/WatchFeature").default)[]>;
43
43
  }
44
44
  export default interface FeatureInstaller {
45
45
  isInstalled(code: FeatureCode): Promise<boolean>;
@@ -13,6 +13,7 @@ const ErrorFeature_1 = __importDefault(require("./error/ErrorFeature"));
13
13
  const EventFeature_1 = __importDefault(require("./event/EventFeature"));
14
14
  const EventContractFeature_1 = __importDefault(require("./eventContract/EventContractFeature"));
15
15
  const FeatureInstaller_1 = require("./FeatureInstaller");
16
+ const GlobalFeature_1 = __importDefault(require("./global/GlobalFeature"));
16
17
  const LogFeature_1 = __importDefault(require("./log/LogFeature"));
17
18
  const NodeFeature_1 = __importDefault(require("./node/NodeFeature"));
18
19
  const OnboardFeature_1 = __importDefault(require("./onboard/OnboardFeature"));
@@ -53,6 +54,7 @@ class FeatureInstallerFactory {
53
54
  PolishFeature_1.default,
54
55
  PermissionFeature_1.default,
55
56
  AgentFeature_1.default,
57
+ GlobalFeature_1.default,
56
58
  ];
57
59
  static featureCodes = [
58
60
  'error',
@@ -78,6 +80,7 @@ class FeatureInstallerFactory {
78
80
  'polish',
79
81
  'permission',
80
82
  'agent',
83
+ 'global',
81
84
  ];
82
85
  static WithAllFeatures(options) {
83
86
  const { cwd, serviceFactory, storeFactory, ui, emitter, actionExecuter, } = options;
@@ -1 +1 @@
1
- {"version":3,"file":"FeatureInstallerFactory.js","sourceRoot":"","sources":["../../src/features/FeatureInstallerFactory.ts"],"names":[],"mappings":";;;;;AAAA,mEAAwD;AAQxD,wEAA+C;AAC/C,wEAA+C;AAC/C,6FAAoE;AACpE,yFAAgE;AAChE,2EAAkD;AAClD,wEAA+C;AAC/C,wEAA+C;AAC/C,gGAAuE;AACvE,yDAA2E;AAE3E,kEAAyC;AACzC,qEAA4C;AAC5C,8EAAqD;AACrD,6FAAoE;AACpE,uFAA8D;AAC9D,2EAAkD;AAClD,2EAAkD;AAClD,8EAAqD;AACrD,2EAAkD;AAClD,wEAA+C;AAC/C,wEAA+C;AAC/C,qEAA4C;AAC5C,qEAA4C;AAC5C,2EAAkD;AAClD,wEAA+C;AAE/C,MAAqB,uBAAuB;IAChC,MAAM,CAAU,QAAQ,GAAU;QACtC,sBAAY;QACZ,uBAAa;QACb,sBAAY;QACZ,qBAAW;QACX,uBAAa;QACb,sBAAY;QACZ,sBAAY;QACZ,qBAAW;QACX,wBAAc;QACd,uBAAa;QACb,6BAAmB;QACnB,6BAAmB;QACnB,8BAAoB;QACpB,uBAAa;QACb,wBAAc;QACd,sBAAY;QACZ,qBAAW;QACX,sBAAY;QACZ,oBAAU;QACV,2BAAiB;QACjB,uBAAa;QACb,2BAAiB;QACjB,sBAAY;KACf,CAAA;IAEM,MAAM,CAAU,YAAY,GAAkB;QACjD,OAAO;QACP,QAAQ;QACR,OAAO;QACP,MAAM;QACN,QAAQ;QACR,OAAO;QACP,OAAO;QACP,MAAM;QACN,SAAS;QACT,QAAQ;QACR,cAAc;QACd,cAAc;QACd,eAAe;QACf,QAAQ;QACR,SAAS;QACT,OAAO;QACP,MAAM;QACN,OAAO;QACP,KAAK;QACL,YAAY;QACZ,QAAQ;QACR,YAAY;QACZ,OAAO;KACV,CAAA;IAEM,MAAM,CAAC,eAAe,CACzB,OAAwC;QAExC,MAAM,EACF,GAAG,EACH,cAAc,EACd,YAAY,EACZ,EAAE,EACF,OAAO,EACP,cAAc,GACjB,GAAG,OAAO,CAAA;QAEX,MAAM,gBAAgB,GAClB,OAAO,CAAC,gBAAgB;YACxB,IAAI,uCAAoB,CAAC,GAAG,EAAE,cAAc,CAAC,CAAA;QAEjD,MAAM,cAAc,GAAmB;YACnC,GAAG;YACH,cAAc;YACd,SAAS,EAAT,4BAAS;YACT,YAAY;YACZ,gBAAgB;YAChB,EAAE;YACF,OAAO;YACP,cAAc;YACd,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;SAC7C,CAAA;QAED,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC9B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,cAAc,CAAC,CAAA;YAC3C,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QACtD,CAAC,CAAC,CAAA;QAEF,OAAO,gBAAgB,CAAA;IAC3B,CAAC;IAEM,MAAM,CAAC,UAAU,CAAwB,IAAO,EAAE,OAAY;QACjE,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAC7C,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,sBAAsB,CAAC,CAAA;QAChE,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,OAAO,CAAA;IAClC,CAAC;;AAhGL,0CAiGC"}
1
+ {"version":3,"file":"FeatureInstallerFactory.js","sourceRoot":"","sources":["../../src/features/FeatureInstallerFactory.ts"],"names":[],"mappings":";;;;;AAAA,mEAAwD;AAQxD,wEAA+C;AAC/C,wEAA+C;AAC/C,6FAAoE;AACpE,yFAAgE;AAChE,2EAAkD;AAClD,wEAA+C;AAC/C,wEAA+C;AAC/C,gGAAuE;AACvE,yDAA2E;AAE3E,2EAAkD;AAClD,kEAAyC;AACzC,qEAA4C;AAC5C,8EAAqD;AACrD,6FAAoE;AACpE,uFAA8D;AAC9D,2EAAkD;AAClD,2EAAkD;AAClD,8EAAqD;AACrD,2EAAkD;AAClD,wEAA+C;AAC/C,wEAA+C;AAC/C,qEAA4C;AAC5C,qEAA4C;AAC5C,2EAAkD;AAClD,wEAA+C;AAE/C,MAAqB,uBAAuB;IAChC,MAAM,CAAU,QAAQ,GAAU;QACtC,sBAAY;QACZ,uBAAa;QACb,sBAAY;QACZ,qBAAW;QACX,uBAAa;QACb,sBAAY;QACZ,sBAAY;QACZ,qBAAW;QACX,wBAAc;QACd,uBAAa;QACb,6BAAmB;QACnB,6BAAmB;QACnB,8BAAoB;QACpB,uBAAa;QACb,wBAAc;QACd,sBAAY;QACZ,qBAAW;QACX,sBAAY;QACZ,oBAAU;QACV,2BAAiB;QACjB,uBAAa;QACb,2BAAiB;QACjB,sBAAY;QACZ,uBAAa;KAChB,CAAA;IAEM,MAAM,CAAU,YAAY,GAAkB;QACjD,OAAO;QACP,QAAQ;QACR,OAAO;QACP,MAAM;QACN,QAAQ;QACR,OAAO;QACP,OAAO;QACP,MAAM;QACN,SAAS;QACT,QAAQ;QACR,cAAc;QACd,cAAc;QACd,eAAe;QACf,QAAQ;QACR,SAAS;QACT,OAAO;QACP,MAAM;QACN,OAAO;QACP,KAAK;QACL,YAAY;QACZ,QAAQ;QACR,YAAY;QACZ,OAAO;QACP,QAAQ;KACX,CAAA;IAEM,MAAM,CAAC,eAAe,CACzB,OAAwC;QAExC,MAAM,EACF,GAAG,EACH,cAAc,EACd,YAAY,EACZ,EAAE,EACF,OAAO,EACP,cAAc,GACjB,GAAG,OAAO,CAAA;QAEX,MAAM,gBAAgB,GAClB,OAAO,CAAC,gBAAgB;YACxB,IAAI,uCAAoB,CAAC,GAAG,EAAE,cAAc,CAAC,CAAA;QAEjD,MAAM,cAAc,GAAmB;YACnC,GAAG;YACH,cAAc;YACd,SAAS,EAAT,4BAAS;YACT,YAAY;YACZ,gBAAgB;YAChB,EAAE;YACF,OAAO;YACP,cAAc;YACd,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;SAC7C,CAAA;QAED,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC9B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,cAAc,CAAC,CAAA;YAC3C,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QACtD,CAAC,CAAC,CAAA;QAEF,OAAO,gBAAgB,CAAA;IAC3B,CAAC;IAEM,MAAM,CAAC,UAAU,CAAwB,IAAO,EAAE,OAAY;QACjE,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAC7C,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,sBAAsB,CAAC,CAAA;QAChE,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,OAAO,CAAA;IAClC,CAAC;;AAlGL,0CAmGC"}
@@ -0,0 +1,21 @@
1
+ import { NpmPackage } from '@sprucelabs/spruce-skill-utils';
2
+ import AbstractFeature, { FeatureDependency } from '../AbstractFeature';
3
+ import { FeatureCode } from '../features.types';
4
+ export default class GlobalFeature extends AbstractFeature {
5
+ code: FeatureCode;
6
+ nameReadable: string;
7
+ description: string;
8
+ dependencies: FeatureDependency[];
9
+ _packageDependencies: NpmPackage[];
10
+ actionsDir: string;
11
+ scripts: {};
12
+ isInstalled(): Promise<boolean>;
13
+ }
14
+ declare module '../../features/features.types' {
15
+ interface FeatureMap {
16
+ global: GlobalFeature;
17
+ }
18
+ interface FeatureOptionsMap {
19
+ global: undefined;
20
+ }
21
+ }
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const spruce_skill_utils_1 = require("@sprucelabs/spruce-skill-utils");
7
+ const AbstractFeature_1 = __importDefault(require("../AbstractFeature"));
8
+ class GlobalFeature extends AbstractFeature_1.default {
9
+ code = 'global';
10
+ nameReadable = 'Global';
11
+ description = 'Place for all global actions that affect your Spruce account (outside your profile).';
12
+ dependencies = [];
13
+ _packageDependencies = [];
14
+ actionsDir = spruce_skill_utils_1.diskUtil.resolvePath(__dirname, 'actions');
15
+ scripts = {};
16
+ async isInstalled() {
17
+ return true;
18
+ }
19
+ }
20
+ exports.default = GlobalFeature;
21
+ //# sourceMappingURL=GlobalFeature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GlobalFeature.js","sourceRoot":"","sources":["../../../src/features/global/GlobalFeature.ts"],"names":[],"mappings":";;;;;AAAA,uEAAqE;AACrE,yEAAuE;AAGvE,MAAqB,aAAc,SAAQ,yBAAe;IAC/C,IAAI,GAAgB,QAAQ,CAAA;IAC5B,YAAY,GAAG,QAAQ,CAAA;IACvB,WAAW,GACd,sFAAsF,CAAA;IACnF,YAAY,GAAwB,EAAE,CAAA;IACtC,oBAAoB,GAAiB,EAAE,CAAA;IAEvC,UAAU,GAAG,6BAAQ,CAAC,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;IACvD,OAAO,GAAG,EAAE,CAAA;IAEZ,KAAK,CAAC,WAAW;QACpB,OAAO,IAAI,CAAA;IACf,CAAC;CACJ;AAdD,gCAcC"}
@@ -0,0 +1,18 @@
1
+ import AbstractAction from '../../AbstractAction';
2
+ import { ActionOptions, FeatureActionResponse } from '../../features.types';
3
+ declare const optionsSchema: {
4
+ id: string;
5
+ description: string;
6
+ fields: {};
7
+ };
8
+ type OptionsSchema = typeof optionsSchema;
9
+ export default class UnregisterSkillAction extends AbstractAction<OptionsSchema> {
10
+ optionsSchema: OptionsSchema;
11
+ commandAliases: string[];
12
+ invocationMessage: string;
13
+ private skills;
14
+ constructor(options: ActionOptions);
15
+ execute(): Promise<FeatureActionResponse>;
16
+ private skillToChoices;
17
+ }
18
+ export {};
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const schema_1 = require("@sprucelabs/schema");
7
+ const SpruceError_1 = __importDefault(require("../../../errors/SpruceError"));
8
+ const AbstractAction_1 = __importDefault(require("../../AbstractAction"));
9
+ const optionsSchema = (0, schema_1.buildSchema)({
10
+ id: 'unregisterSkill',
11
+ description: 'Unregister a skill from your account.',
12
+ fields: {},
13
+ });
14
+ class UnregisterSkillAction extends AbstractAction_1.default {
15
+ optionsSchema = optionsSchema;
16
+ commandAliases = ['unregister.skill'];
17
+ invocationMessage = 'Unregistering skill... 🔧';
18
+ skills;
19
+ constructor(options) {
20
+ super(options);
21
+ this.skills = this.Store('skill');
22
+ }
23
+ async execute() {
24
+ const response = {};
25
+ const skills = await this.skills.fetchMySkills();
26
+ if (skills.length > 0) {
27
+ const skillId = await this.ui.prompt({
28
+ type: 'select',
29
+ isRequired: true,
30
+ options: {
31
+ choices: skills.map((skill) => this.skillToChoices(skill)),
32
+ },
33
+ });
34
+ const match = skills.find((s) => s.id === skillId);
35
+ const confirm = await this.ui.confirm(`Are you sure you want to unregister the skill "${match?.name}"?`);
36
+ if (confirm) {
37
+ await this.skills.unregisterSkill(skillId);
38
+ response.summaryLines = [`Unregistered ${match?.name}`];
39
+ }
40
+ else {
41
+ response.summaryLines = ['Unregister cancelled.'];
42
+ }
43
+ }
44
+ else {
45
+ response.errors = [
46
+ new SpruceError_1.default({ code: 'NO_SKILLS_REGISTERED' }),
47
+ ];
48
+ }
49
+ return response;
50
+ }
51
+ skillToChoices(skill) {
52
+ return {
53
+ value: skill.id,
54
+ label: `${skill.slug}: ${skill.name}`,
55
+ };
56
+ }
57
+ }
58
+ exports.default = UnregisterSkillAction;
59
+ //# sourceMappingURL=UnregisterSkillAction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UnregisterSkillAction.js","sourceRoot":"","sources":["../../../../src/features/global/actions/UnregisterSkillAction.ts"],"names":[],"mappings":";;;;;AAAA,+CAAgD;AAEhD,8EAAqD;AACrD,0EAAiD;AAIjD,MAAM,aAAa,GAAG,IAAA,oBAAW,EAAC;IAC9B,EAAE,EAAE,iBAAiB;IACrB,WAAW,EAAE,uCAAuC;IACpD,MAAM,EAAE,EAAE;CACb,CAAC,CAAA;AAIF,MAAqB,qBAAsB,SAAQ,wBAA6B;IACrE,aAAa,GAAkB,aAAa,CAAA;IAC5C,cAAc,GAAG,CAAC,kBAAkB,CAAC,CAAA;IACrC,iBAAiB,GAAG,2BAA2B,CAAA;IAC9C,MAAM,CAAY;IAE1B,YAAmB,OAAsB;QACrC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACrC,CAAC;IAEM,KAAK,CAAC,OAAO;QAChB,MAAM,QAAQ,GAA0B,EAAE,CAAA;QAE1C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAA;QAChD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC;gBACjC,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE;oBACL,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;iBAC7D;aACJ,CAAC,CAAA;YAEF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAA;YAElD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CACjC,kDAAkD,KAAK,EAAE,IAAI,IAAI,CACpE,CAAA;YAED,IAAI,OAAO,EAAE,CAAC;gBACV,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;gBAC1C,QAAQ,CAAC,YAAY,GAAG,CAAC,gBAAgB,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;YAC3D,CAAC;iBAAM,CAAC;gBACJ,QAAQ,CAAC,YAAY,GAAG,CAAC,uBAAuB,CAAC,CAAA;YACrD,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,QAAQ,CAAC,MAAM,GAAG;gBACd,IAAI,qBAAW,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC;aACpD,CAAA;QACL,CAAC;QAED,OAAO,QAAQ,CAAA;IACnB,CAAC;IAEO,cAAc,CAAC,KAAgB;QACnC,OAAO;YACH,KAAK,EAAE,KAAK,CAAC,EAAE;YACf,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE;SACxC,CAAA;IACL,CAAC;CACJ;AAnDD,wCAmDC"}
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
7
- "version": "29.0.1",
7
+ "version": "29.1.0",
8
8
  "skill": {
9
9
  "namespace": "spruce-cli",
10
10
  "upgradeIgnoreList": [
@@ -85,7 +85,7 @@
85
85
  "@sprucelabs/spruce-core-schemas": "^41.3.41",
86
86
  "@sprucelabs/spruce-event-utils": "^41.0.160",
87
87
  "@sprucelabs/spruce-skill-utils": "^32.1.16",
88
- "@sprucelabs/spruce-templates": "^29.0.1",
88
+ "@sprucelabs/spruce-templates": "^29.1.0",
89
89
  "@typescript-eslint/eslint-plugin": "^8.46.2",
90
90
  "@typescript-eslint/parser": "^8.46.2",
91
91
  "cfonts": "^3.3.1",
@@ -570,5 +570,5 @@
570
570
  "conventional-changelog-sprucelabs"
571
571
  ]
572
572
  },
573
- "gitHead": "356fd4d0649e4e5f6d5dbee4474ca6a1671ec740"
573
+ "gitHead": "e113fa698f7bbcfb68fe2c42391dc7894bb2fcee"
574
574
  }
@@ -0,0 +1,29 @@
1
+ import { MercuryClientFactory } from '@sprucelabs/mercury-client'
2
+ import { test, assert } from '@sprucelabs/test-utils'
3
+ import AbstractCliTest from '../../../tests/AbstractCliTest'
4
+
5
+ export default class RegisteringAGoSkillTest extends AbstractCliTest {
6
+ @test.only()
7
+ protected static async stub() {}
8
+
9
+ @test()
10
+ protected static async canCreateRegisteringAGoSkill() {
11
+ MercuryClientFactory.setIsTestMode(true)
12
+ let wasHit = false
13
+ await this.eventFaker.fakeRegisterSkill(() => {
14
+ wasHit = true
15
+ })
16
+
17
+ await this.go.initGoProject()
18
+
19
+ await this.Action('skill', 'register', {
20
+ shouldAutoHandleDependencies: true,
21
+ }).execute({
22
+ nameReadable: 'My Go Skill',
23
+ nameKebab: 'my-go-skill',
24
+ description: 'A skill built with Go',
25
+ })
26
+
27
+ assert.isTrue(wasHit, 'Register skill event was not hit')
28
+ }
29
+ }
@@ -0,0 +1,160 @@
1
+ import {
2
+ MercuryClientFactory,
3
+ MercuryTestClient,
4
+ } from '@sprucelabs/mercury-client'
5
+ import { test, assert, generateId } from '@sprucelabs/test-utils'
6
+ import { FeatureActionResponse } from '../../../features/features.types'
7
+ import UnregisterSkillAction from '../../../features/global/actions/UnregisterSkillAction'
8
+ import AbstractCliTest from '../../../tests/AbstractCliTest'
9
+ import {
10
+ ListSkill,
11
+ ListSkillsTargetAndPayload,
12
+ UnregisterSkillTargetAndPayload,
13
+ } from '../../support/EventFaker'
14
+
15
+ export default class UnregisteringASkillTest extends AbstractCliTest {
16
+ private static action: UnregisterSkillAction
17
+ private static lastListSkillsPayload: ListSkillsTargetAndPayload['payload']
18
+ private static fakedSkills: ListSkill[] = []
19
+ private static executePromise: Promise<FeatureActionResponse>
20
+ private static lastUnregisterSkillTarget?: UnregisterSkillTargetAndPayload['target']
21
+
22
+ protected static async beforeEach(): Promise<void> {
23
+ await super.beforeEach()
24
+ MercuryClientFactory.setIsTestMode(true)
25
+ MercuryTestClient.setShouldRequireLocalListeners(true)
26
+ this.action = this.Action('global', 'unregisterSkill')
27
+
28
+ delete this.lastListSkillsPayload
29
+ delete this.lastUnregisterSkillTarget
30
+
31
+ this.fakedSkills = []
32
+
33
+ await this.eventFaker.fakeListSkills(({ payload }) => {
34
+ this.lastListSkillsPayload = payload
35
+ return this.fakedSkills
36
+ })
37
+
38
+ await this.eventFaker.fakeUnregisterSkill(({ target }) => {
39
+ this.lastUnregisterSkillTarget = target
40
+ })
41
+ }
42
+
43
+ @test()
44
+ protected static async hasAction() {
45
+ assert.isFunction(this.action.execute, 'Action not found')
46
+ }
47
+
48
+ @test()
49
+ protected static async firstThingListsSkills() {
50
+ await this.execute()
51
+ await this.waitUntilFinished()
52
+
53
+ assert.isEqualDeep(this.lastListSkillsPayload, {
54
+ shouldOnlyShowMine: true,
55
+ })
56
+ }
57
+
58
+ @test()
59
+ protected static async presentsAnOptionForOnlySkillReturned() {
60
+ this.pushFakedSkill()
61
+
62
+ await this.executeAndWaitForInput()
63
+ this.assertProptsForAllSkills()
64
+ await this.selectSkill(0)
65
+ await this.pressEnter()
66
+ }
67
+
68
+ @test()
69
+ protected static async presentsOptionsForMultipleSkills() {
70
+ this.pushFakedSkill()
71
+ this.pushFakedSkill()
72
+ this.pushFakedSkill()
73
+
74
+ await this.executeAndWaitForInput()
75
+ this.assertProptsForAllSkills()
76
+
77
+ await this.selectSkill(1)
78
+ await this.pressEnter()
79
+ }
80
+
81
+ @test('can unregister first skill', 0)
82
+ @test('can unregister second skill', 1)
83
+ protected static async passesSelectedSkillToUnregister(idx: number) {
84
+ this.pushFakedSkill()
85
+ this.pushFakedSkill()
86
+ await this.executeAndWaitForInput()
87
+ await this.selectSkill(idx)
88
+ await this.pressEnter()
89
+ await this.waitUntilFinished()
90
+
91
+ assert.isEqualDeep(
92
+ this.lastUnregisterSkillTarget,
93
+ {
94
+ skillId: this.fakedSkills[idx].id,
95
+ },
96
+ 'Skill ID not passed to unregister skill'
97
+ )
98
+ }
99
+
100
+ @test()
101
+ protected static async doesNotUnRegisterIfNotConfirmed() {
102
+ this.pushFakedSkill()
103
+ await this.executeAndWaitForInput()
104
+ await this.selectSkill(0)
105
+ await this.ui.sendInput('n')
106
+ await this.waitUntilFinished()
107
+ assert.isFalsy(
108
+ this.lastUnregisterSkillTarget,
109
+ 'Unregister skill was called unexpectedly'
110
+ )
111
+ }
112
+
113
+ private static async executeAndWaitForInput() {
114
+ await this.execute()
115
+ await this.waitForInput()
116
+ }
117
+
118
+ private static async selectSkill(idx: number) {
119
+ await this.ui.sendInput(this.fakedSkills[idx].id)
120
+ }
121
+
122
+ private static assertProptsForAllSkills() {
123
+ const prompt = this.ui.getLastInvocation()
124
+ assert.isEqualDeep(prompt.options, {
125
+ type: 'select',
126
+ isRequired: true,
127
+ options: {
128
+ choices: this.generateExpectedSkillChoices(),
129
+ },
130
+ })
131
+ }
132
+
133
+ private static async pressEnter() {
134
+ await this.ui.sendInput('\n')
135
+ }
136
+
137
+ private static generateExpectedSkillChoices() {
138
+ return this.fakedSkills.map((skill) => ({
139
+ value: skill.id,
140
+ label: `${skill.slug}: ${skill.name}`,
141
+ }))
142
+ }
143
+
144
+ private static pushFakedSkill() {
145
+ this.fakedSkills.push({
146
+ id: generateId(),
147
+ dateCreated: Date.now(),
148
+ slug: generateId(),
149
+ name: generateId(),
150
+ })
151
+ }
152
+
153
+ private static async waitUntilFinished() {
154
+ await this.executePromise
155
+ }
156
+
157
+ private static async execute() {
158
+ this.executePromise = this.action.execute()
159
+ }
160
+ }
@@ -1,10 +1,41 @@
1
1
  import { SpruceSchemas } from '@sprucelabs/mercury-types'
2
- import { Organization } from '@sprucelabs/spruce-core-schemas'
2
+ import { Organization, Skill } from '@sprucelabs/spruce-core-schemas'
3
3
  import { eventFaker } from '@sprucelabs/spruce-test-fixtures'
4
4
  import { generateId } from '@sprucelabs/test-utils'
5
5
  import { ListPermContractsTargetAndPayload } from '../../features/permission/stores/PermissionStore'
6
6
 
7
7
  export default class EventFaker {
8
+ public async fakeUnregisterSkill(
9
+ cb?: (targetAndPayload: UnregisterSkillTargetAndPayload) => void
10
+ ) {
11
+ await eventFaker.on(
12
+ 'unregister-skill::v2020_12_25',
13
+ (targetAndPayload) => {
14
+ cb?.(targetAndPayload)
15
+ return {}
16
+ }
17
+ )
18
+ }
19
+ public async fakeRegisterSkill(
20
+ cb?: (targetAndPayload: RegisterSkillTargetAndPayload) => void | Skill
21
+ ) {
22
+ await eventFaker.on(
23
+ 'register-skill::v2020_12_25',
24
+ (targetAndPayload) => {
25
+ return {
26
+ skill: cb?.(targetAndPayload) ?? {
27
+ id: generateId(),
28
+ name: generateId(),
29
+ slug: generateId(),
30
+ apiKey: generateId(),
31
+ dateCreated: Date.now(),
32
+ creators: [],
33
+ },
34
+ }
35
+ }
36
+ )
37
+ }
38
+
8
39
  public async fakeSyncPermissionContracts() {
9
40
  await eventFaker.on('sync-permission-contracts::v2020_12_25', () => {
10
41
  return {
@@ -58,10 +89,14 @@ export default class EventFaker {
58
89
  }
59
90
  }
60
91
 
61
- public async fakeListSkills(cb?: () => void | ListSkill[]) {
62
- await eventFaker.on('list-skills::v2020_12_25', () => {
92
+ public async fakeListSkills(
93
+ cb?: (
94
+ targetAndPayload: ListSkillsTargetAndPayload
95
+ ) => void | ListSkill[]
96
+ ) {
97
+ await eventFaker.on('list-skills::v2020_12_25', (targetAndPayload) => {
63
98
  return {
64
- skills: cb?.() ?? [],
99
+ skills: cb?.(targetAndPayload) ?? [],
65
100
  }
66
101
  })
67
102
  }
@@ -108,3 +143,12 @@ export default class EventFaker {
108
143
  export type ListSkill = SpruceSchemas.Mercury.v2020_12_25.ListSkillsSkill
109
144
  export type CreateOrganizationTargetAndPayload =
110
145
  SpruceSchemas.Mercury.v2020_12_25.CreateOrganizationEmitTargetAndPayload
146
+
147
+ export type RegisterSkillTargetAndPayload =
148
+ SpruceSchemas.Mercury.v2020_12_25.RegisterSkillEmitTargetAndPayload
149
+
150
+ export type ListSkillsTargetAndPayload =
151
+ SpruceSchemas.Mercury.v2020_12_25.ListSkillsEmitTargetAndPayload
152
+
153
+ export type UnregisterSkillTargetAndPayload =
154
+ SpruceSchemas.Mercury.v2020_12_25.UnregisterSkillEmitTargetAndPayload
@@ -174,7 +174,7 @@ export default class SpruceError extends AbstractSpruceError<ErrorOptions> {
174
174
  break
175
175
 
176
176
  case 'SKILL_NOT_REGISTERED':
177
- message = `Dang! I can't continue until you register your skill! Run \`spruce login\` and then \`spruce register.skill\` to get the ball rolling!`
177
+ message = `Dang! I can't continue until you register your skill! Run \`spruce login\` and then \`spruce register\` to get the ball rolling!`
178
178
  break
179
179
 
180
180
  case 'NO_ORGANIZATIONS_FOUND':
@@ -16,6 +16,7 @@ import EventFeature from './event/EventFeature'
16
16
  import EventContractFeature from './eventContract/EventContractFeature'
17
17
  import FeatureInstaller, { FeatureInstallerImpl } from './FeatureInstaller'
18
18
  import { FeatureCode } from './features.types'
19
+ import GlobalFeature from './global/GlobalFeature'
19
20
  import LogFeature from './log/LogFeature'
20
21
  import NodeFeature from './node/NodeFeature'
21
22
  import OnboardFeature from './onboard/OnboardFeature'
@@ -57,6 +58,7 @@ export default class FeatureInstallerFactory {
57
58
  PolishFeature,
58
59
  PermissionFeature,
59
60
  AgentFeature,
61
+ GlobalFeature,
60
62
  ]
61
63
 
62
64
  public static readonly featureCodes: FeatureCode[] = [
@@ -83,6 +85,7 @@ export default class FeatureInstallerFactory {
83
85
  'polish',
84
86
  'permission',
85
87
  'agent',
88
+ 'global',
86
89
  ]
87
90
 
88
91
  public static WithAllFeatures(
@@ -0,0 +1,29 @@
1
+ import { diskUtil, NpmPackage } from '@sprucelabs/spruce-skill-utils'
2
+ import AbstractFeature, { FeatureDependency } from '../AbstractFeature'
3
+ import { FeatureCode } from '../features.types'
4
+
5
+ export default class GlobalFeature extends AbstractFeature {
6
+ public code: FeatureCode = 'global'
7
+ public nameReadable = 'Global'
8
+ public description =
9
+ 'Place for all global actions that affect your Spruce account (outside your profile).'
10
+ public dependencies: FeatureDependency[] = []
11
+ public _packageDependencies: NpmPackage[] = []
12
+
13
+ public actionsDir = diskUtil.resolvePath(__dirname, 'actions')
14
+ public scripts = {}
15
+
16
+ public async isInstalled(): Promise<boolean> {
17
+ return true
18
+ }
19
+ }
20
+
21
+ declare module '../../features/features.types' {
22
+ interface FeatureMap {
23
+ global: GlobalFeature
24
+ }
25
+
26
+ interface FeatureOptionsMap {
27
+ global: undefined
28
+ }
29
+ }
@@ -0,0 +1,67 @@
1
+ import { buildSchema } from '@sprucelabs/schema'
2
+ import { ListSkill } from '../../../__tests__/support/EventFaker'
3
+ import SpruceError from '../../../errors/SpruceError'
4
+ import AbstractAction from '../../AbstractAction'
5
+ import { ActionOptions, FeatureActionResponse } from '../../features.types'
6
+ import { SkillStore } from '../../skill/stores/SkillStore'
7
+
8
+ const optionsSchema = buildSchema({
9
+ id: 'unregisterSkill',
10
+ description: 'Unregister a skill from your account.',
11
+ fields: {},
12
+ })
13
+
14
+ type OptionsSchema = typeof optionsSchema
15
+
16
+ export default class UnregisterSkillAction extends AbstractAction<OptionsSchema> {
17
+ public optionsSchema: OptionsSchema = optionsSchema
18
+ public commandAliases = ['unregister.skill']
19
+ public invocationMessage = 'Unregistering skill... 🔧'
20
+ private skills: SkillStore
21
+
22
+ public constructor(options: ActionOptions) {
23
+ super(options)
24
+ this.skills = this.Store('skill')
25
+ }
26
+
27
+ public async execute(): Promise<FeatureActionResponse> {
28
+ const response: FeatureActionResponse = {}
29
+
30
+ const skills = await this.skills.fetchMySkills()
31
+ if (skills.length > 0) {
32
+ const skillId = await this.ui.prompt({
33
+ type: 'select',
34
+ isRequired: true,
35
+ options: {
36
+ choices: skills.map((skill) => this.skillToChoices(skill)),
37
+ },
38
+ })
39
+
40
+ const match = skills.find((s) => s.id === skillId)
41
+
42
+ const confirm = await this.ui.confirm(
43
+ `Are you sure you want to unregister the skill "${match?.name}"?`
44
+ )
45
+
46
+ if (confirm) {
47
+ await this.skills.unregisterSkill(skillId)
48
+ response.summaryLines = [`Unregistered ${match?.name}`]
49
+ } else {
50
+ response.summaryLines = ['Unregister cancelled.']
51
+ }
52
+ } else {
53
+ response.errors = [
54
+ new SpruceError({ code: 'NO_SKILLS_REGISTERED' }),
55
+ ]
56
+ }
57
+
58
+ return response
59
+ }
60
+
61
+ private skillToChoices(skill: ListSkill): { value: string; label: string } {
62
+ return {
63
+ value: skill.id,
64
+ label: `${skill.slug}: ${skill.name}`,
65
+ }
66
+ }
67
+ }