@sprucelabs/spruce-cli 28.2.2 → 29.0.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 (234) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/build/.spruce/errors/errors.types.d.ts +23 -2
  3. package/build/.spruce/errors/options.types.d.ts +4 -1
  4. package/build/.spruce/errors/spruceCli/directoryNotGoModule.schema.d.ts +3 -0
  5. package/build/.spruce/errors/spruceCli/directoryNotGoModule.schema.js +20 -0
  6. package/build/.spruce/errors/spruceCli/directoryNotGoModule.schema.js.map +1 -0
  7. package/build/.spruce/schemas/schemas.types.d.ts +2 -2
  8. package/build/.spruce/schemas/spruceCli/v2020_07_22/onboardOptions.schema.js +1 -1
  9. package/build/.spruce/schemas/spruceCli/v2020_07_22/onboardOptions.schema.js.map +1 -1
  10. package/build/__tests__/behavioral/OverridingCommandsInPackageJson.test.d.ts +7 -2
  11. package/build/__tests__/behavioral/OverridingCommandsInPackageJson.test.js +36 -13
  12. package/build/__tests__/behavioral/OverridingCommandsInPackageJson.test.js.map +1 -1
  13. package/build/__tests__/behavioral/features/InstallFeaturesInGo.test.d.ts +5 -0
  14. package/build/__tests__/behavioral/features/InstallFeaturesInGo.test.js +32 -0
  15. package/build/__tests__/behavioral/features/InstallFeaturesInGo.test.js.map +1 -0
  16. package/build/__tests__/behavioral/organization/CreatingAnOrg.test.d.ts +5 -0
  17. package/build/__tests__/behavioral/organization/CreatingAnOrg.test.js +21 -13
  18. package/build/__tests__/behavioral/organization/CreatingAnOrg.test.js.map +1 -1
  19. package/build/__tests__/behavioral/schemas/KeepingSchemasInSync.test.d.ts +1 -1
  20. package/build/__tests__/behavioral/schemas/KeepingSchemasInSync.test.js +7 -7
  21. package/build/__tests__/behavioral/schemas/KeepingSchemasInSync.test.js.map +1 -1
  22. package/build/__tests__/behavioral/schemas/SyncingCoreSchemasInGo.test.d.ts +39 -0
  23. package/build/__tests__/behavioral/schemas/SyncingCoreSchemasInGo.test.js +289 -0
  24. package/build/__tests__/behavioral/schemas/SyncingCoreSchemasInGo.test.js.map +1 -0
  25. package/build/__tests__/behavioral/schemas/SyncingSchemasInChildDirInGo.test.d.ts +7 -0
  26. package/build/__tests__/behavioral/schemas/SyncingSchemasInChildDirInGo.test.js +46 -0
  27. package/build/__tests__/behavioral/schemas/SyncingSchemasInChildDirInGo.test.js.map +1 -0
  28. package/build/__tests__/behavioral/schemas/SyncingSchemasInGo.test.d.ts +5 -0
  29. package/build/__tests__/behavioral/schemas/SyncingSchemasInGo.test.js +31 -0
  30. package/build/__tests__/behavioral/schemas/SyncingSchemasInGo.test.js.map +1 -0
  31. package/build/__tests__/behavioral/tests/SelectingAnAbstractTestClass.test.js +1 -1
  32. package/build/__tests__/behavioral/tests/SelectingAnAbstractTestClass.test.js.map +1 -1
  33. package/build/__tests__/behavioral/upgrading/UpdatingDependencies2.test.js +10 -1
  34. package/build/__tests__/behavioral/upgrading/UpdatingDependencies2.test.js.map +1 -1
  35. package/build/__tests__/implementation/SkillStore.test.d.ts +5 -0
  36. package/build/__tests__/implementation/SkillStore.test.js +37 -0
  37. package/build/__tests__/implementation/SkillStore.test.js.map +1 -1
  38. package/build/__tests__/support/EventFaker.d.ts +4 -0
  39. package/build/__tests__/support/EventFaker.js +16 -0
  40. package/build/__tests__/support/EventFaker.js.map +1 -1
  41. package/build/cli/Cli.js +12 -9
  42. package/build/cli/Cli.js.map +1 -1
  43. package/build/errors/SpruceError.js +3 -0
  44. package/build/errors/SpruceError.js.map +1 -1
  45. package/build/errors/directoryNotGoModule.builder.d.ts +12 -0
  46. package/build/errors/directoryNotGoModule.builder.js +15 -0
  47. package/build/errors/directoryNotGoModule.builder.js.map +1 -0
  48. package/build/features/AbstractAction.d.ts +1 -0
  49. package/build/features/AbstractAction.js +5 -1
  50. package/build/features/AbstractAction.js.map +1 -1
  51. package/build/features/AbstractFeature.d.ts +8 -1
  52. package/build/features/AbstractFeature.js +12 -1
  53. package/build/features/AbstractFeature.js.map +1 -1
  54. package/build/features/ActionFactory.js +1 -2
  55. package/build/features/ActionFactory.js.map +1 -1
  56. package/build/features/ActionQuestionAsker.js +0 -1
  57. package/build/features/ActionQuestionAsker.js.map +1 -1
  58. package/build/features/FeatureInstaller.d.ts +1 -0
  59. package/build/features/FeatureInstaller.js +21 -7
  60. package/build/features/FeatureInstaller.js.map +1 -1
  61. package/build/features/FeatureInstallerFactory.d.ts +1 -0
  62. package/build/features/FeatureInstallerFactory.js +7 -0
  63. package/build/features/FeatureInstallerFactory.js.map +1 -1
  64. package/build/features/OverrideActionDecorator.js +1 -1
  65. package/build/features/OverrideActionDecorator.js.map +1 -1
  66. package/build/features/VersionResolver.js +1 -1
  67. package/build/features/VersionResolver.js.map +1 -1
  68. package/build/features/agent/AgentFeature.d.ts +1 -1
  69. package/build/features/agent/AgentFeature.js +1 -1
  70. package/build/features/agent/AgentFeature.js.map +1 -1
  71. package/build/features/conversation/ConversationFeature.d.ts +1 -1
  72. package/build/features/conversation/ConversationFeature.js +1 -1
  73. package/build/features/conversation/ConversationFeature.js.map +1 -1
  74. package/build/features/dependencies/DependencyFeature.d.ts +0 -1
  75. package/build/features/dependencies/DependencyFeature.js +0 -1
  76. package/build/features/dependencies/DependencyFeature.js.map +1 -1
  77. package/build/features/deploy/DeployFeature.d.ts +1 -1
  78. package/build/features/deploy/DeployFeature.js +1 -1
  79. package/build/features/deploy/DeployFeature.js.map +1 -1
  80. package/build/features/error/ErrorFeature.d.ts +1 -1
  81. package/build/features/error/ErrorFeature.js +1 -1
  82. package/build/features/error/ErrorFeature.js.map +1 -1
  83. package/build/features/event/EventFeature.d.ts +1 -1
  84. package/build/features/event/EventFeature.js +1 -1
  85. package/build/features/event/EventFeature.js.map +1 -1
  86. package/build/features/eventContract/EventContractFeature.d.ts +1 -3
  87. package/build/features/eventContract/EventContractFeature.js +0 -2
  88. package/build/features/eventContract/EventContractFeature.js.map +1 -1
  89. package/build/features/node/NodeFeature.d.ts +1 -1
  90. package/build/features/node/NodeFeature.js +1 -1
  91. package/build/features/node/NodeFeature.js.map +1 -1
  92. package/build/features/onboard/OnboardFeature.d.ts +1 -3
  93. package/build/features/onboard/OnboardFeature.js +0 -2
  94. package/build/features/onboard/OnboardFeature.js.map +1 -1
  95. package/build/features/organization/OrganizationFeature.d.ts +0 -1
  96. package/build/features/organization/OrganizationFeature.js +0 -1
  97. package/build/features/organization/OrganizationFeature.js.map +1 -1
  98. package/build/features/permission/PermissionFeature.d.ts +2 -3
  99. package/build/features/permission/PermissionFeature.js +1 -2
  100. package/build/features/permission/PermissionFeature.js.map +1 -1
  101. package/build/features/person/PersonFeature.d.ts +1 -3
  102. package/build/features/person/PersonFeature.js +0 -2
  103. package/build/features/person/PersonFeature.js.map +1 -1
  104. package/build/features/polish/PolishFeature.d.ts +1 -1
  105. package/build/features/polish/PolishFeature.js +1 -1
  106. package/build/features/polish/PolishFeature.js.map +1 -1
  107. package/build/features/sandbox/SandboxFeature.d.ts +0 -1
  108. package/build/features/sandbox/SandboxFeature.js +0 -1
  109. package/build/features/sandbox/SandboxFeature.js.map +1 -1
  110. package/build/features/schema/SchemaFeature.d.ts +2 -3
  111. package/build/features/schema/SchemaFeature.js +6 -1
  112. package/build/features/schema/SchemaFeature.js.map +1 -1
  113. package/build/features/schema/actions/SyncAction.d.ts +5 -2
  114. package/build/features/schema/actions/SyncAction.js +50 -16
  115. package/build/features/schema/actions/SyncAction.js.map +1 -1
  116. package/build/features/schema/utilities/schemaDisk.utility.d.ts +7 -0
  117. package/build/features/schema/utilities/schemaDisk.utility.js +22 -4
  118. package/build/features/schema/utilities/schemaDisk.utility.js.map +1 -1
  119. package/build/features/schema/utilities/schemaGenerator.utility.d.ts +1 -0
  120. package/build/features/schema/utilities/schemaGenerator.utility.js +18 -10
  121. package/build/features/schema/utilities/schemaGenerator.utility.js.map +1 -1
  122. package/build/features/schema/writers/SchemaWriter.d.ts +9 -9
  123. package/build/features/schema/writers/SchemaWriter.js +38 -17
  124. package/build/features/schema/writers/SchemaWriter.js.map +1 -1
  125. package/build/features/skill/SkillFeature.d.ts +1 -1
  126. package/build/features/skill/SkillFeature.js +1 -1
  127. package/build/features/skill/SkillFeature.js.map +1 -1
  128. package/build/features/skill/stores/SkillStore.d.ts +4 -0
  129. package/build/features/skill/stores/SkillStore.js +37 -3
  130. package/build/features/skill/stores/SkillStore.js.map +1 -1
  131. package/build/features/store/StoreFeature.d.ts +1 -1
  132. package/build/features/store/StoreFeature.js +1 -1
  133. package/build/features/store/StoreFeature.js.map +1 -1
  134. package/build/features/test/TestFeature.d.ts +1 -1
  135. package/build/features/test/TestFeature.js +1 -1
  136. package/build/features/test/TestFeature.js.map +1 -1
  137. package/build/features/test/TestReporter.js +1 -1
  138. package/build/features/test/TestReporter.js.map +1 -1
  139. package/build/features/view/ViewFeature.d.ts +1 -1
  140. package/build/features/view/ViewFeature.js +1 -1
  141. package/build/features/view/ViewFeature.js.map +1 -1
  142. package/build/migration/EsLint9Migrator.d.ts +1 -0
  143. package/build/packageManager/NodePackageManager.d.ts +14 -0
  144. package/build/packageManager/NodePackageManager.js +88 -0
  145. package/build/packageManager/NodePackageManager.js.map +1 -0
  146. package/build/packageManager/packageManager.types.d.ts +16 -0
  147. package/build/packageManager/packageManager.types.js +3 -0
  148. package/build/packageManager/packageManager.types.js.map +1 -0
  149. package/build/schemas/v2020_07_22/onboardOptions.builder.js +1 -1
  150. package/build/schemas/v2020_07_22/onboardOptions.builder.js.map +1 -1
  151. package/build/services/GoPackageManager.d.ts +10 -0
  152. package/build/services/GoPackageManager.js +39 -0
  153. package/build/services/GoPackageManager.js.map +1 -0
  154. package/build/services/PkgService.d.ts +3 -7
  155. package/build/services/PkgService.js +13 -68
  156. package/build/services/PkgService.js.map +1 -1
  157. package/build/templateItemBuilders/SchemaTemplateItemBuilder.js.map +1 -1
  158. package/build/tests/AbstractCliTest.d.ts +5 -1
  159. package/build/tests/AbstractCliTest.js +15 -3
  160. package/build/tests/AbstractCliTest.js.map +1 -1
  161. package/build/tests/fixtures/FeatureFixture.js +4 -1
  162. package/build/tests/fixtures/FeatureFixture.js.map +1 -1
  163. package/build/tests/fixtures/GoFixture.d.ts +12 -0
  164. package/build/tests/fixtures/GoFixture.js +39 -0
  165. package/build/tests/fixtures/GoFixture.js.map +1 -0
  166. package/build/tests/staticToInstanceMigration/StaticToInstanceMigrator.d.ts +1 -0
  167. package/build/widgets/terminalKit/TkTextWidget.js +1 -1
  168. package/build/widgets/terminalKit/TkTextWidget.js.map +1 -1
  169. package/build/writers/AbstractWriter.js +7 -6
  170. package/build/writers/AbstractWriter.js.map +1 -1
  171. package/package.json +29 -29
  172. package/src/.spruce/errors/errors.types.ts +32 -2
  173. package/src/.spruce/errors/options.types.ts +4 -1
  174. package/src/.spruce/errors/spruceCli/directoryNotGoModule.schema.ts +23 -0
  175. package/src/.spruce/schemas/schemas.types.ts +2 -2
  176. package/src/.spruce/schemas/spruceCli/v2020_07_22/onboardOptions.schema.ts +1 -1
  177. package/src/__tests__/behavioral/OverridingCommandsInPackageJson.test.ts +60 -13
  178. package/src/__tests__/behavioral/features/InstallFeaturesInGo.test.ts +17 -0
  179. package/src/__tests__/behavioral/organization/CreatingAnOrg.test.ts +29 -22
  180. package/src/__tests__/behavioral/schemas/KeepingSchemasInSync.test.ts +6 -9
  181. package/src/__tests__/behavioral/schemas/SyncingCoreSchemasInGo.test.ts +376 -0
  182. package/src/__tests__/behavioral/schemas/SyncingSchemasInChildDirInGo.test.ts +46 -0
  183. package/src/__tests__/behavioral/schemas/SyncingSchemasInGo.test.ts +23 -0
  184. package/src/__tests__/behavioral/tests/SelectingAnAbstractTestClass.test.ts +1 -1
  185. package/src/__tests__/behavioral/upgrading/UpdatingDependencies2.test.ts +15 -2
  186. package/src/__tests__/implementation/SkillStore.test.ts +44 -1
  187. package/src/__tests__/support/EventFaker.ts +29 -0
  188. package/src/cli/Cli.ts +20 -12
  189. package/src/errors/SpruceError.ts +4 -0
  190. package/src/errors/directoryNotGoModule.builder.ts +13 -0
  191. package/src/features/AbstractAction.ts +6 -4
  192. package/src/features/AbstractFeature.ts +20 -1
  193. package/src/features/ActionFactory.ts +2 -2
  194. package/src/features/ActionQuestionAsker.ts +0 -1
  195. package/src/features/FeatureInstaller.ts +30 -6
  196. package/src/features/FeatureInstallerFactory.ts +9 -0
  197. package/src/features/OverrideActionDecorator.ts +1 -1
  198. package/src/features/VersionResolver.ts +2 -1
  199. package/src/features/agent/AgentFeature.ts +1 -1
  200. package/src/features/conversation/ConversationFeature.ts +1 -1
  201. package/src/features/dependencies/DependencyFeature.ts +0 -1
  202. package/src/features/deploy/DeployFeature.ts +1 -1
  203. package/src/features/error/ErrorFeature.ts +1 -1
  204. package/src/features/event/EventFeature.ts +1 -1
  205. package/src/features/eventContract/EventContractFeature.ts +1 -3
  206. package/src/features/node/NodeFeature.ts +1 -1
  207. package/src/features/onboard/OnboardFeature.ts +1 -7
  208. package/src/features/organization/OrganizationFeature.ts +0 -1
  209. package/src/features/permission/PermissionFeature.ts +1 -3
  210. package/src/features/person/PersonFeature.ts +1 -4
  211. package/src/features/polish/PolishFeature.ts +1 -1
  212. package/src/features/sandbox/SandboxFeature.ts +0 -1
  213. package/src/features/schema/SchemaFeature.ts +8 -2
  214. package/src/features/schema/actions/SyncAction.ts +68 -26
  215. package/src/features/schema/utilities/schemaDisk.utility.ts +43 -11
  216. package/src/features/schema/utilities/schemaGenerator.utility.ts +33 -13
  217. package/src/features/schema/writers/SchemaWriter.ts +71 -25
  218. package/src/features/skill/SkillFeature.ts +1 -1
  219. package/src/features/skill/stores/SkillStore.ts +47 -5
  220. package/src/features/store/StoreFeature.ts +1 -1
  221. package/src/features/test/TestFeature.ts +1 -1
  222. package/src/features/test/TestReporter.ts +1 -1
  223. package/src/features/view/ViewFeature.ts +1 -1
  224. package/src/packageManager/NodePackageManager.ts +115 -0
  225. package/src/packageManager/packageManager.types.ts +21 -0
  226. package/src/schemas/v2020_07_22/onboardOptions.builder.ts +1 -1
  227. package/src/services/GoPackageManager.ts +45 -0
  228. package/src/services/PkgService.ts +17 -92
  229. package/src/templateItemBuilders/SchemaTemplateItemBuilder.ts +6 -6
  230. package/src/tests/AbstractCliTest.ts +19 -5
  231. package/src/tests/fixtures/FeatureFixture.ts +3 -1
  232. package/src/tests/fixtures/GoFixture.ts +39 -0
  233. package/src/widgets/terminalKit/TkTextWidget.ts +1 -1
  234. package/src/writers/AbstractWriter.ts +15 -6
@@ -1,6 +1,8 @@
1
1
  import { test, assert } from '@sprucelabs/test-utils'
2
2
  import { random, uniq } from 'lodash'
3
+ import FeatureInstallerFactory from '../../../features/FeatureInstallerFactory'
3
4
  import UpdateDependenciesAction from '../../../features/node/actions/UpdateDependenciesAction'
5
+ import SkillFeature from '../../../features/skill/SkillFeature'
4
6
  import CommandServiceImpl from '../../../services/CommandService'
5
7
  import AbstractCliTest from '../../../tests/AbstractCliTest'
6
8
  import { NpmPackage } from '../../../types/cli.types'
@@ -10,6 +12,7 @@ export default class UpdateDependencies2Test extends AbstractCliTest {
10
12
 
11
13
  protected static async beforeEach() {
12
14
  await super.beforeEach()
15
+ FeatureInstallerFactory.setFeature('skill', SpySkillFeature)
13
16
  this.action = this.Action('node', 'updateDependencies')
14
17
  }
15
18
 
@@ -19,8 +22,12 @@ export default class UpdateDependencies2Test extends AbstractCliTest {
19
22
 
20
23
  this.Service('pkg').set({ path: 'dependencies.axios', value: '0.0.1' })
21
24
 
22
- const skill = this.featureInstaller.getFeature('skill')
23
- skill.packageDependencies.push({
25
+ debugger
26
+ const skill = this.featureInstaller.getFeature(
27
+ 'skill'
28
+ ) as SpySkillFeature
29
+
30
+ skill.addPackageDependency({
24
31
  name: 'axios',
25
32
  version: '0.21.3',
26
33
  })
@@ -141,3 +148,9 @@ export default class UpdateDependencies2Test extends AbstractCliTest {
141
148
  return name
142
149
  }
143
150
  }
151
+
152
+ class SpySkillFeature extends SkillFeature {
153
+ public addPackageDependency(dependency: NpmPackage) {
154
+ this._packageDependencies.push(dependency)
155
+ }
156
+ }
@@ -1,4 +1,5 @@
1
- import { test, assert } from '@sprucelabs/test-utils'
1
+ import { diskUtil, namesUtil, randomUtil } from '@sprucelabs/spruce-skill-utils'
2
+ import { test, assert, generateId } from '@sprucelabs/test-utils'
2
3
  import { errorAssert } from '@sprucelabs/test-utils'
3
4
  import SkillStoreImpl from '../../features/skill/stores/SkillStore'
4
5
  import AbstractCliTest from '../../tests/AbstractCliTest'
@@ -115,6 +116,48 @@ export default class SkillStoreTest extends AbstractCliTest {
115
116
  assert.isEqual(namespace, slug)
116
117
  }
117
118
 
119
+ @test()
120
+ protected static async returnsExpectedModuleInGoProject() {
121
+ const name = await this.initRandomGoProject()
122
+ await this.assertCurrentNamespaceEquals(name)
123
+ }
124
+
125
+ @test()
126
+ protected static async canFindGoModuleInSubdirectory() {
127
+ const name = await this.initRandomGoProject()
128
+ const newCwd = this.resolvePath(this.cwd, generateId())
129
+ diskUtil.createDir(newCwd)
130
+ this.setCwd(newCwd)
131
+ this.store = this.SkillStore()
132
+ await this.assertCurrentNamespaceEquals(name)
133
+ }
134
+
135
+ @test()
136
+ protected static async throwsNotInGoModuleErrorIfNotInGoProject() {
137
+ const err = await assert.doesThrowAsync(() =>
138
+ this.store.getGoModuleName()
139
+ )
140
+ errorAssert.assertError(err, 'DIRECTORY_NOT_GO_MODULE', {
141
+ cwd: this.cwd,
142
+ })
143
+ }
144
+
145
+ private static async assertCurrentNamespaceEquals(name: string) {
146
+ const actual = await this.store.loadCurrentSkillsNamespace()
147
+
148
+ assert.isEqual(
149
+ actual,
150
+ namesUtil.toPascal(name),
151
+ 'Expected namespace to match go module name'
152
+ )
153
+ }
154
+
155
+ private static async initRandomGoProject() {
156
+ const name = randomUtil.rand(['my-skill', 'superSkill', 'AwesomeSkill'])
157
+ await this.go.initGoProject(name)
158
+ return name
159
+ }
160
+
118
161
  private static SkillStore(): SkillStoreImpl {
119
162
  return this.Store('skill', {})
120
163
  }
@@ -1,9 +1,36 @@
1
1
  import { SpruceSchemas } from '@sprucelabs/mercury-types'
2
+ import { Organization } from '@sprucelabs/spruce-core-schemas'
2
3
  import { eventFaker } from '@sprucelabs/spruce-test-fixtures'
3
4
  import { generateId } from '@sprucelabs/test-utils'
4
5
  import { ListPermContractsTargetAndPayload } from '../../features/permission/stores/PermissionStore'
5
6
 
6
7
  export default class EventFaker {
8
+ public async fakeCreateOrganization(
9
+ cb?: (
10
+ targetAndPayload: CreateOrganizationTargetAndPayload
11
+ ) => void | Organization
12
+ ) {
13
+ await eventFaker.on(
14
+ 'create-organization::v2020_12_25',
15
+ (targetAndPayload) => {
16
+ return {
17
+ organization:
18
+ cb?.(targetAndPayload) ??
19
+ this.generateOrganizationValues(),
20
+ }
21
+ }
22
+ )
23
+ }
24
+
25
+ public generateOrganizationValues(): Organization {
26
+ return {
27
+ id: generateId(),
28
+ name: generateId(),
29
+ slug: generateId(),
30
+ dateCreated: Date.now(),
31
+ }
32
+ }
33
+
7
34
  public async fakeListSkills(cb?: () => void | ListSkill[]) {
8
35
  await eventFaker.on('list-skills::v2020_12_25', () => {
9
36
  return {
@@ -52,3 +79,5 @@ export default class EventFaker {
52
79
  }
53
80
 
54
81
  export type ListSkill = SpruceSchemas.Mercury.v2020_12_25.ListSkillsSkill
82
+ export type CreateOrganizationTargetAndPayload =
83
+ SpruceSchemas.Mercury.v2020_12_25.CreateOrganizationEmitTargetAndPayload
package/src/cli/Cli.ts CHANGED
@@ -7,6 +7,7 @@ import { SpruceSchemas } from '@sprucelabs/mercury-types'
7
7
  import {
8
8
  HealthCheckResults,
9
9
  HEALTH_DIVIDER,
10
+ SettingsService,
10
11
  } from '@sprucelabs/spruce-skill-utils'
11
12
  import { templates } from '@sprucelabs/spruce-templates'
12
13
  import { DEFAULT_HOST } from '../constants'
@@ -183,19 +184,19 @@ export default class Cli implements CliInterface {
183
184
  new TerminalInterface(cwd)) as GraphicsInterface
184
185
  let featureInstaller: FeatureInstaller | undefined
185
186
 
187
+ const settings = services.Service(cwd, 'settings')
188
+
186
189
  const writerFactory = new WriterFactory({
187
190
  templates,
188
191
  ui,
189
- settings: services.Service(cwd, 'settings'),
192
+ settings,
190
193
  linter: services.Service(cwd, 'lint'),
191
194
  })
192
195
 
193
196
  const pkg = services.Service(cwd, 'pkg')
194
197
 
195
- const optionOverrides = this.loadOptionOverrides(pkg)
196
- const blockedCommands = this.loadCommandBlocks(
197
- services.Service(cwd, 'pkg')
198
- )
198
+ const optionOverrides = this.loadOptionOverrides(pkg, settings)
199
+ const blockedCommands = this.loadCommandBlocks(pkg)
199
200
 
200
201
  try {
201
202
  const s = pkg.getSkillNamespace()
@@ -287,17 +288,24 @@ export default class Cli implements CliInterface {
287
288
  return blocks
288
289
  }
289
290
 
290
- private static loadOptionOverrides(pkg: PkgService): OptionOverrides {
291
+ private static loadOptionOverrides(
292
+ pkg: PkgService,
293
+ settings: SettingsService
294
+ ): OptionOverrides {
291
295
  const mapped: OptionOverrides = {}
296
+ let overrides: Record<string, string> = {}
292
297
 
293
298
  if (pkg.doesExist()) {
294
- const overrides = pkg.get('skill.commandOverrides')
295
-
296
- Object.keys(overrides ?? {}).forEach((command) => {
297
- const options = argParserUtil.parse(overrides[command])
298
- mapped[command] = options
299
- })
299
+ overrides = pkg.get('skill.commandOverrides')
300
300
  }
301
+
302
+ overrides = { ...settings.get('commandOverrides'), ...overrides }
303
+
304
+ Object.keys(overrides ?? {}).forEach((command) => {
305
+ const options = argParserUtil.parse(overrides[command])
306
+ mapped[command] = options
307
+ })
308
+
301
309
  return mapped
302
310
  }
303
311
 
@@ -281,6 +281,10 @@ export default class SpruceError extends AbstractSpruceError<ErrorOptions> {
281
281
  message = `You already registerd an AI Agent at ${options.promptPath}. If you want to register a new one, delete that file first.`
282
282
  break
283
283
 
284
+ case 'DIRECTORY_NOT_GO_MODULE':
285
+ message = 'A Directory not go module just happened!'
286
+ break
287
+
284
288
  default:
285
289
  message = super.friendlyMessage()
286
290
  }
@@ -0,0 +1,13 @@
1
+ import { buildErrorSchema } from '@sprucelabs/schema'
2
+
3
+ export default buildErrorSchema({
4
+ id: 'directoryNotGoModule',
5
+ name: 'Directory not go module',
6
+ fields: {
7
+ cwd: {
8
+ type: 'text',
9
+ label: 'Current Working Directory',
10
+ isRequired: true,
11
+ },
12
+ },
13
+ })
@@ -1,4 +1,5 @@
1
1
  import { Schema, SchemaValues, SchemaPartialValues } from '@sprucelabs/schema'
2
+ import { diskUtil } from '@sprucelabs/spruce-skill-utils'
2
3
  import { Templates } from '@sprucelabs/spruce-templates'
3
4
  import { GlobalEmitter } from '../GlobalEmitter'
4
5
  import ServiceFactory, {
@@ -111,14 +112,15 @@ export default abstract class AbstractAction<S extends Schema = Schema>
111
112
  return validateAndNormalizer.validateAndNormalize(schema, options)
112
113
  }
113
114
 
115
+ protected getProjectLanguage() {
116
+ return diskUtil.detectProjectLanguage(this.cwd)
117
+ }
118
+
114
119
  protected async resolveVersion(
115
120
  userSuppliedVersion: string | null | undefined,
116
121
  resolvedDestination: string
117
122
  ) {
118
- const versions = VersionResolver.Resolver(
119
- this.ui,
120
- this.serviceFactory.Service(this.cwd, 'pkg')
121
- )
123
+ const versions = VersionResolver.Resolver(this.ui, this.Service('pkg'))
122
124
  const version = await versions.resolveVersion(
123
125
  resolvedDestination,
124
126
  userSuppliedVersion
@@ -1,6 +1,7 @@
1
1
  import pathUtil from 'path'
2
2
  import globby from '@sprucelabs/globby'
3
3
  import { Schema, SchemaValues } from '@sprucelabs/schema'
4
+ import { diskUtil } from '@sprucelabs/spruce-skill-utils'
4
5
  import { Templates } from '@sprucelabs/spruce-templates'
5
6
  import { GlobalEmitter } from '../GlobalEmitter'
6
7
  import ServiceFactory, {
@@ -34,7 +35,14 @@ export default abstract class AbstractFeature<
34
35
  {
35
36
  public abstract description: string
36
37
  public readonly dependencies: FeatureDependency[] = []
37
- public readonly packageDependencies: NpmPackage[] = []
38
+ protected _packageDependencies: PackageDependency[] = []
39
+ public get packageDependencies() {
40
+ const resolved = this._packageDependencies.filter((dep) => {
41
+ const goDep = dep as GoPackage
42
+ return !goDep.type || goDep.type === this.getProjectLanguage()
43
+ })
44
+ return resolved
45
+ }
38
46
  public readonly optionsSchema?: S
39
47
  public readonly fileDescriptions: FileDescription[] = []
40
48
 
@@ -114,6 +122,10 @@ export default abstract class AbstractFeature<
114
122
  return this.features.getFeature(code)
115
123
  }
116
124
 
125
+ public getProjectLanguage() {
126
+ return diskUtil.detectProjectLanguage(this.cwd)
127
+ }
128
+
117
129
  public async getAvailableActionCodes(): Promise<string[]> {
118
130
  if (!this.actionsDir) {
119
131
  return []
@@ -176,3 +188,10 @@ export interface FeatureOptions {
176
188
  apiClientFactory: ApiClientFactory
177
189
  actionExecuter: ActionExecuter
178
190
  }
191
+
192
+ export type PackageDependency = NpmPackage | GoPackage
193
+
194
+ export interface GoPackage {
195
+ type: 'go'
196
+ name: string
197
+ }
@@ -43,7 +43,8 @@ export default class ActionFactory {
43
43
  )
44
44
  }
45
45
 
46
- let Class: new (options: ActionOptions) => FeatureAction | undefined
46
+ let Class: (new (options: ActionOptions) => FeatureAction) | undefined =
47
+ undefined
47
48
  let originalError: Error | undefined
48
49
 
49
50
  const key = ActionFactory.overrideKey(featureCode, actionCode)
@@ -61,7 +62,6 @@ export default class ActionFactory {
61
62
  }
62
63
  }
63
64
 
64
- //@ts-ignore
65
65
  if (!Class) {
66
66
  throw new SpruceError({
67
67
  code: 'GENERIC',
@@ -54,7 +54,6 @@ export default class ActionQuestionAskerImpl<
54
54
  while (notInstalled.length > 0) {
55
55
  const toInstall = notInstalled.shift()
56
56
  if (!toInstall) {
57
- // for typescript
58
57
  throw new Error('Dependent feature error')
59
58
  }
60
59
 
@@ -9,7 +9,10 @@ import ServiceFactory, {
9
9
  ServiceMap,
10
10
  } from '../services/ServiceFactory'
11
11
  import { InternalUpdateHandler, NpmPackage } from '../types/cli.types'
12
- import AbstractFeature, { FeatureDependency } from './AbstractFeature'
12
+ import AbstractFeature, {
13
+ FeatureDependency,
14
+ GoPackage,
15
+ } from './AbstractFeature'
13
16
  import {
14
17
  InstallFeatureOptions,
15
18
  FeatureInstallResponse,
@@ -107,11 +110,14 @@ export class FeatureInstallerImpl implements ServiceProvider, FeatureInstaller {
107
110
 
108
111
  public getFeatureDependencies<C extends FeatureCode>(
109
112
  featureCode: C
110
- // trackedFeatures: FeatureDependency[] = []
111
113
  ): FeatureDependency[] {
114
+ if (this.isInGoProject()) {
115
+ return []
116
+ }
117
+
112
118
  let deps = this.getFeatureDependenciesIncludingSelf(
113
119
  { code: featureCode, isRequired: true },
114
- [] // trackedFeatures
120
+ []
115
121
  ).filter((f) => f.code !== featureCode)
116
122
 
117
123
  deps = this.sortFeatures(deps)
@@ -119,6 +125,10 @@ export class FeatureInstallerImpl implements ServiceProvider, FeatureInstaller {
119
125
  return deps
120
126
  }
121
127
 
128
+ private isInGoProject() {
129
+ return diskUtil.detectProjectLanguage(this.cwd) === 'go'
130
+ }
131
+
122
132
  private getFeatureDependenciesIncludingSelf(
123
133
  featureDependency: FeatureDependency,
124
134
  trackedFeatures: FeatureDependency[] = []
@@ -415,13 +425,27 @@ export class FeatureInstallerImpl implements ServiceProvider, FeatureInstaller {
415
425
 
416
426
  didUpdateHandler?.(`Checking node dependency: ${pkg.name}`)
417
427
 
418
- if (
419
- pkg.isDev &&
428
+ const goPkg = pkg as GoPackage
429
+ const nodePkg = pkg as NpmPackage
430
+ const isGoPackage = goPkg.type === 'go'
431
+
432
+ const shouldConsider =
433
+ (isGoPackage && this.isInGoProject()) ||
434
+ (!isGoPackage && !this.isInGoProject())
435
+
436
+ if (!shouldConsider) {
437
+ return
438
+ }
439
+
440
+ if (isGoPackage) {
441
+ this.packagesToInstall.push(packageName)
442
+ } else if (
443
+ nodePkg.isDev &&
420
444
  this.devPackagesToInstall.indexOf(packageName) === -1
421
445
  ) {
422
446
  this.devPackagesToInstall.push(packageName)
423
447
  } else if (
424
- !pkg.isDev &&
448
+ !nodePkg.isDev &&
425
449
  this.packagesToInstall.indexOf(packageName) === -1
426
450
  ) {
427
451
  this.packagesToInstall.push(packageName)
@@ -120,6 +120,15 @@ export default class FeatureInstallerFactory {
120
120
 
121
121
  return featureInstaller
122
122
  }
123
+
124
+ public static setFeature<C extends FeatureCode>(code: C, feature: any) {
125
+ const index = this.featureCodes.indexOf(code)
126
+ if (index === -1) {
127
+ throw new Error(`Feature code "${code}" is not recognized.`)
128
+ }
129
+
130
+ this.features[index] = feature
131
+ }
123
132
  }
124
133
 
125
134
  interface InstallerWithAllFeaturesOptions {
@@ -140,7 +140,7 @@ export default class OverrideActionDecorator implements FeatureAction {
140
140
  const overrides = this.optionOverrides?.[commandStr]
141
141
  if (overrides) {
142
142
  this.ui?.renderLine(
143
- `Overrides found in package.json of ${namespace}.`
143
+ `Overrides found in ${this.parent.getProjectLanguage() === 'go' ? '.spruce/settings.json' : 'package.json'} of ${namespace}.`
144
144
  )
145
145
  this.ui?.renderObject(overrides)
146
146
  options = {
@@ -54,9 +54,9 @@ export default class VersionResolver {
54
54
  fallbackVersion: string
55
55
  ) {
56
56
  const versions = this.loadVersions(resolvedDestination)
57
- const choices = this.buildChoices(versions)
58
57
 
59
58
  if (versions.length > 0) {
59
+ const choices = this.buildChoices(versions)
60
60
  return await this.ui.prompt({
61
61
  type: 'select',
62
62
  label: 'Version',
@@ -67,6 +67,7 @@ export default class VersionResolver {
67
67
  },
68
68
  })
69
69
  }
70
+
70
71
  return fallbackVersion
71
72
  }
72
73
 
@@ -11,7 +11,7 @@ export default class AgentFeature extends AbstractFeature {
11
11
  public dependencies: FeatureDependency[] = [
12
12
  { code: 'event', isRequired: true },
13
13
  ]
14
- public packageDependencies = [
14
+ public _packageDependencies = [
15
15
  {
16
16
  name: '@sprucelabs/spruce-agent-plugin',
17
17
  },
@@ -15,7 +15,7 @@ export default class ConversationFeature extends AbstractFeature {
15
15
  public dependencies: FeatureDependency[] = [
16
16
  { code: 'event', isRequired: true },
17
17
  ]
18
- public packageDependencies: NpmPackage[] = [
18
+ public _packageDependencies: NpmPackage[] = [
19
19
  {
20
20
  name: '@sprucelabs/spruce-conversation-plugin@latest',
21
21
  isDev: false,
@@ -13,7 +13,6 @@ export default class DependencyFeature extends AbstractFeature {
13
13
  isRequired: true,
14
14
  },
15
15
  ]
16
- public packageDependencies = []
17
16
 
18
17
  public async isInstalled() {
19
18
  return this.features.isInstalled('skill')
@@ -15,7 +15,7 @@ export default class DeployFeature extends AbstractFeature {
15
15
  isRequired: true,
16
16
  },
17
17
  ]
18
- public packageDependencies = [
18
+ public _packageDependencies = [
19
19
  { name: '@sprucelabs/spruce-deploy-plugin@latest', isDev: false },
20
20
  ]
21
21
 
@@ -17,7 +17,7 @@ export default class ErrorFeature extends AbstractFeature {
17
17
  { code: 'schema', isRequired: true },
18
18
  { code: 'node', isRequired: true },
19
19
  ]
20
- public packageDependencies: NpmPackage[] = [
20
+ public _packageDependencies: NpmPackage[] = [
21
21
  {
22
22
  name: '@sprucelabs/error@latest',
23
23
  },
@@ -20,7 +20,7 @@ export default class EventFeature extends AbstractFeature {
20
20
  { code: 'schema', isRequired: true },
21
21
  { code: 'permission', isRequired: true },
22
22
  ]
23
- public packageDependencies = [
23
+ public _packageDependencies = [
24
24
  {
25
25
  name: '@sprucelabs/mercury-client',
26
26
  },
@@ -1,6 +1,6 @@
1
1
  import { diskUtil } from '@sprucelabs/spruce-skill-utils'
2
2
  import { FileDescription } from '../../types/cli.types'
3
- import AbstractFeature, { FeatureDependency } from '../AbstractFeature'
3
+ import AbstractFeature from '../AbstractFeature'
4
4
  import { FeatureCode } from '../features.types'
5
5
 
6
6
  export default class EventContractFeature extends AbstractFeature {
@@ -8,8 +8,6 @@ export default class EventContractFeature extends AbstractFeature {
8
8
  public nameReadable = 'Event Contract'
9
9
  public description =
10
10
  'Pull core Mercury events down and write to single, portable, dependency-free, strongly typed contract.'
11
- public dependencies: FeatureDependency[] = []
12
- public packageDependencies = []
13
11
 
14
12
  public actionsDir = diskUtil.resolvePath(__dirname, 'actions')
15
13
  public readonly fileDescriptions: FileDescription[] = []
@@ -22,7 +22,7 @@ export default class NodeFeature<
22
22
  public description = ''
23
23
  public dependencies: FeatureDependency[] = []
24
24
  public optionsSchema = nodeFeatureOptionsSchema as S
25
- public packageDependencies = [...universalDevDependencies]
25
+ public _packageDependencies = [...universalDevDependencies]
26
26
 
27
27
  public scripts = {
28
28
  ...universalScripts,
@@ -1,9 +1,6 @@
1
1
  import { diskUtil } from '@sprucelabs/spruce-skill-utils'
2
2
  import createTestOptionsSchema from '#spruce/schemas/spruceCli/v2020_07_22/createTestOptions.schema'
3
- import AbstractFeature, {
4
- FeatureDependency,
5
- FeatureOptions,
6
- } from '../AbstractFeature'
3
+ import AbstractFeature, { FeatureOptions } from '../AbstractFeature'
7
4
  import featuresUtil from '../feature.utilities'
8
5
  import { FeatureCode } from '../features.types'
9
6
  import ScriptLoader from './ScriptLoader'
@@ -13,9 +10,6 @@ export default class OnboardFeature extends AbstractFeature {
13
10
  public code: FeatureCode = 'onboard'
14
11
  public nameReadable = 'Onboard'
15
12
  public description = 'Get building your first skill already!'
16
- public dependencies: FeatureDependency[] = []
17
- public packageDependencies = []
18
-
19
13
  public actionsDir = diskUtil.resolvePath(__dirname, 'actions')
20
14
 
21
15
  private onboardingStore?: OnboardingStore
@@ -16,7 +16,6 @@ export default class OrganizationFeature extends AbstractFeature {
16
16
  isRequired: true,
17
17
  },
18
18
  ]
19
- public packageDependencies = []
20
19
 
21
20
  public actionsDir = diskUtil.resolvePath(__dirname, 'actions')
22
21
  }
@@ -1,7 +1,6 @@
1
1
  import { PermissionContractMap } from '@sprucelabs/mercury-types'
2
2
  import { diskUtil, NpmPackage } from '@sprucelabs/spruce-skill-utils'
3
3
  import AbstractFeature, {
4
- FeatureDependency,
5
4
  FeatureOptions,
6
5
  InstallResults,
7
6
  } from '../AbstractFeature'
@@ -12,9 +11,8 @@ export default class PermissionFeature extends AbstractFeature {
12
11
  public code: FeatureCode = 'permission'
13
12
  public nameReadable = 'permission'
14
13
  public description = 'Manage permissions for your skill'
15
- public dependencies: FeatureDependency[] = []
16
14
  public actionsDir = diskUtil.resolvePath(__dirname, 'actions')
17
- public packageDependencies: NpmPackage[] = [
15
+ public _packageDependencies: NpmPackage[] = [
18
16
  {
19
17
  name: '@sprucelabs/spruce-permission-plugin@latest',
20
18
  },
@@ -1,14 +1,11 @@
1
1
  import { diskUtil } from '@sprucelabs/spruce-skill-utils'
2
- import AbstractFeature, { FeatureDependency } from '../AbstractFeature'
2
+ import AbstractFeature from '../AbstractFeature'
3
3
  import { FeatureCode } from '../features.types'
4
4
 
5
5
  export default class PersonFeature extends AbstractFeature {
6
6
  public code: FeatureCode = 'person'
7
7
  public nameReadable = 'Person'
8
8
  public description = 'Log in, log out, etc.'
9
- public dependencies: FeatureDependency[] = []
10
- public packageDependencies = []
11
-
12
9
  public actionsDir = diskUtil.resolvePath(__dirname, 'actions')
13
10
 
14
11
  public isInstalled = async () => {
@@ -13,7 +13,7 @@ export default class PolishFeature extends AbstractFeature {
13
13
  isRequired: false,
14
14
  },
15
15
  ]
16
- public packageDependencies: NpmPackage[] = [
16
+ public _packageDependencies: NpmPackage[] = [
17
17
  {
18
18
  name: '@sprucelabs/heartwood-polish',
19
19
  isDev: true,
@@ -14,7 +14,6 @@ export default class SandboxFeature extends AbstractFeature {
14
14
  isRequired: true,
15
15
  },
16
16
  ]
17
- public packageDependencies = []
18
17
  public actionsDir = diskUtil.resolvePath(__dirname, 'actions')
19
18
 
20
19
  public constructor(options: ActionOptions) {
@@ -1,9 +1,9 @@
1
1
  import { diskUtil } from '@sprucelabs/spruce-skill-utils'
2
- import { NpmPackage } from '../../types/cli.types'
3
2
  import AbstractFeature, {
4
3
  FeatureDependency,
5
4
  FeatureOptions,
6
5
  InstallResults,
6
+ PackageDependency,
7
7
  } from '../AbstractFeature'
8
8
  import { FeatureCode } from '../features.types'
9
9
 
@@ -14,7 +14,7 @@ export default class SchemaFeature extends AbstractFeature {
14
14
  { code: 'skill', isRequired: false },
15
15
  { code: 'node', isRequired: true },
16
16
  ]
17
- public packageDependencies: NpmPackage[] = [
17
+ public _packageDependencies: PackageDependency[] = [
18
18
  {
19
19
  name: '@sprucelabs/schema@latest',
20
20
  },
@@ -25,6 +25,10 @@ export default class SchemaFeature extends AbstractFeature {
25
25
  {
26
26
  name: '@sprucelabs/spruce-skill-utils',
27
27
  },
28
+ {
29
+ type: 'go',
30
+ name: 'github.com/sprucelabsai-community/spruce-schema/v32/pkg/fields',
31
+ },
28
32
  ]
29
33
 
30
34
  public code: FeatureCode = 'schema'
@@ -94,6 +98,8 @@ export default class SchemaFeature extends AbstractFeature {
94
98
  return {}
95
99
  }
96
100
 
101
+ this.Service('settings').markAsInstalled(this.code)
102
+
97
103
  const files = await this.writePlugin()
98
104
 
99
105
  return {