@sprucelabs/spruce-cli 28.2.3 → 29.0.1

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 (232) 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/__tests__/behavioral/OverridingCommandsInPackageJson.test.d.ts +7 -2
  8. package/build/__tests__/behavioral/OverridingCommandsInPackageJson.test.js +36 -13
  9. package/build/__tests__/behavioral/OverridingCommandsInPackageJson.test.js.map +1 -1
  10. package/build/__tests__/behavioral/events/DifferentEventOptions.test.d.ts +16 -0
  11. package/build/__tests__/behavioral/events/DifferentEventOptions.test.js +105 -0
  12. package/build/__tests__/behavioral/events/DifferentEventOptions.test.js.map +1 -0
  13. package/build/__tests__/behavioral/events/KeepingEventsInSync.test.js.map +1 -1
  14. package/build/__tests__/behavioral/features/InstallFeaturesInGo.test.d.ts +5 -0
  15. package/build/__tests__/behavioral/features/InstallFeaturesInGo.test.js +32 -0
  16. package/build/__tests__/behavioral/features/InstallFeaturesInGo.test.js.map +1 -0
  17. package/build/__tests__/behavioral/organization/CreatingAnOrg.test.d.ts +5 -0
  18. package/build/__tests__/behavioral/organization/CreatingAnOrg.test.js +21 -13
  19. package/build/__tests__/behavioral/organization/CreatingAnOrg.test.js.map +1 -1
  20. package/build/__tests__/behavioral/schemas/KeepingSchemasInSync.test.d.ts +1 -1
  21. package/build/__tests__/behavioral/schemas/KeepingSchemasInSync.test.js +7 -7
  22. package/build/__tests__/behavioral/schemas/KeepingSchemasInSync.test.js.map +1 -1
  23. package/build/__tests__/behavioral/schemas/SyncingCoreSchemasInGo.test.d.ts +39 -0
  24. package/build/__tests__/behavioral/schemas/SyncingCoreSchemasInGo.test.js +289 -0
  25. package/build/__tests__/behavioral/schemas/SyncingCoreSchemasInGo.test.js.map +1 -0
  26. package/build/__tests__/behavioral/schemas/SyncingSchemasInChildDirInGo.test.d.ts +7 -0
  27. package/build/__tests__/behavioral/schemas/SyncingSchemasInChildDirInGo.test.js +46 -0
  28. package/build/__tests__/behavioral/schemas/SyncingSchemasInChildDirInGo.test.js.map +1 -0
  29. package/build/__tests__/behavioral/schemas/SyncingSchemasInGo.test.d.ts +5 -0
  30. package/build/__tests__/behavioral/schemas/SyncingSchemasInGo.test.js +31 -0
  31. package/build/__tests__/behavioral/schemas/SyncingSchemasInGo.test.js.map +1 -0
  32. package/build/__tests__/behavioral/tests/SelectingAnAbstractTestClass.test.js +1 -1
  33. package/build/__tests__/behavioral/tests/SelectingAnAbstractTestClass.test.js.map +1 -1
  34. package/build/__tests__/behavioral/upgrading/UpdatingDependencies2.test.js +10 -1
  35. package/build/__tests__/behavioral/upgrading/UpdatingDependencies2.test.js.map +1 -1
  36. package/build/__tests__/implementation/SkillStore.test.d.ts +5 -0
  37. package/build/__tests__/implementation/SkillStore.test.js +37 -0
  38. package/build/__tests__/implementation/SkillStore.test.js.map +1 -1
  39. package/build/__tests__/support/EventFaker.d.ts +7 -0
  40. package/build/__tests__/support/EventFaker.js +43 -0
  41. package/build/__tests__/support/EventFaker.js.map +1 -1
  42. package/build/cli/Cli.js +12 -9
  43. package/build/cli/Cli.js.map +1 -1
  44. package/build/errors/SpruceError.js +3 -0
  45. package/build/errors/SpruceError.js.map +1 -1
  46. package/build/errors/directoryNotGoModule.builder.d.ts +12 -0
  47. package/build/errors/directoryNotGoModule.builder.js +15 -0
  48. package/build/errors/directoryNotGoModule.builder.js.map +1 -0
  49. package/build/features/AbstractAction.d.ts +1 -0
  50. package/build/features/AbstractAction.js +5 -1
  51. package/build/features/AbstractAction.js.map +1 -1
  52. package/build/features/AbstractFeature.d.ts +8 -1
  53. package/build/features/AbstractFeature.js +12 -1
  54. package/build/features/AbstractFeature.js.map +1 -1
  55. package/build/features/ActionFactory.js +1 -2
  56. package/build/features/ActionFactory.js.map +1 -1
  57. package/build/features/ActionQuestionAsker.js +0 -1
  58. package/build/features/ActionQuestionAsker.js.map +1 -1
  59. package/build/features/FeatureInstaller.d.ts +1 -0
  60. package/build/features/FeatureInstaller.js +21 -7
  61. package/build/features/FeatureInstaller.js.map +1 -1
  62. package/build/features/FeatureInstallerFactory.d.ts +1 -0
  63. package/build/features/FeatureInstallerFactory.js +7 -0
  64. package/build/features/FeatureInstallerFactory.js.map +1 -1
  65. package/build/features/OverrideActionDecorator.js +1 -1
  66. package/build/features/OverrideActionDecorator.js.map +1 -1
  67. package/build/features/VersionResolver.js +1 -1
  68. package/build/features/VersionResolver.js.map +1 -1
  69. package/build/features/agent/AgentFeature.d.ts +1 -1
  70. package/build/features/agent/AgentFeature.js +1 -1
  71. package/build/features/agent/AgentFeature.js.map +1 -1
  72. package/build/features/conversation/ConversationFeature.d.ts +1 -1
  73. package/build/features/conversation/ConversationFeature.js +1 -1
  74. package/build/features/conversation/ConversationFeature.js.map +1 -1
  75. package/build/features/dependencies/DependencyFeature.d.ts +0 -1
  76. package/build/features/dependencies/DependencyFeature.js +0 -1
  77. package/build/features/dependencies/DependencyFeature.js.map +1 -1
  78. package/build/features/deploy/DeployFeature.d.ts +1 -1
  79. package/build/features/deploy/DeployFeature.js +1 -1
  80. package/build/features/deploy/DeployFeature.js.map +1 -1
  81. package/build/features/error/ErrorFeature.d.ts +1 -1
  82. package/build/features/error/ErrorFeature.js +1 -1
  83. package/build/features/error/ErrorFeature.js.map +1 -1
  84. package/build/features/event/EventFeature.d.ts +1 -1
  85. package/build/features/event/EventFeature.js +1 -1
  86. package/build/features/event/EventFeature.js.map +1 -1
  87. package/build/features/eventContract/EventContractFeature.d.ts +1 -3
  88. package/build/features/eventContract/EventContractFeature.js +0 -2
  89. package/build/features/eventContract/EventContractFeature.js.map +1 -1
  90. package/build/features/node/NodeFeature.d.ts +1 -1
  91. package/build/features/node/NodeFeature.js +1 -1
  92. package/build/features/node/NodeFeature.js.map +1 -1
  93. package/build/features/onboard/OnboardFeature.d.ts +1 -3
  94. package/build/features/onboard/OnboardFeature.js +0 -2
  95. package/build/features/onboard/OnboardFeature.js.map +1 -1
  96. package/build/features/organization/OrganizationFeature.d.ts +0 -1
  97. package/build/features/organization/OrganizationFeature.js +0 -1
  98. package/build/features/organization/OrganizationFeature.js.map +1 -1
  99. package/build/features/permission/PermissionFeature.d.ts +2 -3
  100. package/build/features/permission/PermissionFeature.js +1 -2
  101. package/build/features/permission/PermissionFeature.js.map +1 -1
  102. package/build/features/person/PersonFeature.d.ts +1 -3
  103. package/build/features/person/PersonFeature.js +0 -2
  104. package/build/features/person/PersonFeature.js.map +1 -1
  105. package/build/features/polish/PolishFeature.d.ts +1 -1
  106. package/build/features/polish/PolishFeature.js +1 -1
  107. package/build/features/polish/PolishFeature.js.map +1 -1
  108. package/build/features/sandbox/SandboxFeature.d.ts +0 -1
  109. package/build/features/sandbox/SandboxFeature.js +0 -1
  110. package/build/features/sandbox/SandboxFeature.js.map +1 -1
  111. package/build/features/schema/SchemaFeature.d.ts +2 -3
  112. package/build/features/schema/SchemaFeature.js +6 -1
  113. package/build/features/schema/SchemaFeature.js.map +1 -1
  114. package/build/features/schema/actions/SyncAction.d.ts +5 -2
  115. package/build/features/schema/actions/SyncAction.js +50 -16
  116. package/build/features/schema/actions/SyncAction.js.map +1 -1
  117. package/build/features/schema/utilities/schemaDisk.utility.d.ts +7 -0
  118. package/build/features/schema/utilities/schemaDisk.utility.js +22 -4
  119. package/build/features/schema/utilities/schemaDisk.utility.js.map +1 -1
  120. package/build/features/schema/utilities/schemaGenerator.utility.d.ts +1 -0
  121. package/build/features/schema/utilities/schemaGenerator.utility.js +18 -10
  122. package/build/features/schema/utilities/schemaGenerator.utility.js.map +1 -1
  123. package/build/features/schema/writers/SchemaWriter.d.ts +9 -9
  124. package/build/features/schema/writers/SchemaWriter.js +38 -17
  125. package/build/features/schema/writers/SchemaWriter.js.map +1 -1
  126. package/build/features/skill/SkillFeature.d.ts +1 -1
  127. package/build/features/skill/SkillFeature.js +1 -1
  128. package/build/features/skill/SkillFeature.js.map +1 -1
  129. package/build/features/skill/stores/SkillStore.d.ts +5 -0
  130. package/build/features/skill/stores/SkillStore.js +40 -3
  131. package/build/features/skill/stores/SkillStore.js.map +1 -1
  132. package/build/features/store/StoreFeature.d.ts +1 -1
  133. package/build/features/store/StoreFeature.js +1 -1
  134. package/build/features/store/StoreFeature.js.map +1 -1
  135. package/build/features/test/TestFeature.d.ts +1 -1
  136. package/build/features/test/TestFeature.js +1 -1
  137. package/build/features/test/TestFeature.js.map +1 -1
  138. package/build/features/test/TestReporter.js +1 -1
  139. package/build/features/test/TestReporter.js.map +1 -1
  140. package/build/features/view/ViewFeature.d.ts +1 -1
  141. package/build/features/view/ViewFeature.js +1 -1
  142. package/build/features/view/ViewFeature.js.map +1 -1
  143. package/build/migration/EsLint9Migrator.d.ts +1 -0
  144. package/build/packageManager/NodePackageManager.d.ts +14 -0
  145. package/build/packageManager/NodePackageManager.js +88 -0
  146. package/build/packageManager/NodePackageManager.js.map +1 -0
  147. package/build/packageManager/packageManager.types.d.ts +16 -0
  148. package/build/packageManager/packageManager.types.js +3 -0
  149. package/build/packageManager/packageManager.types.js.map +1 -0
  150. package/build/services/GoPackageManager.d.ts +10 -0
  151. package/build/services/GoPackageManager.js +39 -0
  152. package/build/services/GoPackageManager.js.map +1 -0
  153. package/build/services/PkgService.d.ts +3 -7
  154. package/build/services/PkgService.js +13 -68
  155. package/build/services/PkgService.js.map +1 -1
  156. package/build/templateItemBuilders/SchemaTemplateItemBuilder.js.map +1 -1
  157. package/build/tests/AbstractCliTest.d.ts +5 -1
  158. package/build/tests/AbstractCliTest.js +15 -3
  159. package/build/tests/AbstractCliTest.js.map +1 -1
  160. package/build/tests/fixtures/FeatureFixture.js +4 -1
  161. package/build/tests/fixtures/FeatureFixture.js.map +1 -1
  162. package/build/tests/fixtures/GoFixture.d.ts +12 -0
  163. package/build/tests/fixtures/GoFixture.js +39 -0
  164. package/build/tests/fixtures/GoFixture.js.map +1 -0
  165. package/build/tests/staticToInstanceMigration/StaticToInstanceMigrator.d.ts +1 -0
  166. package/build/widgets/terminalKit/TkTextWidget.js +3 -2
  167. package/build/widgets/terminalKit/TkTextWidget.js.map +1 -1
  168. package/build/writers/AbstractWriter.js +7 -6
  169. package/build/writers/AbstractWriter.js.map +1 -1
  170. package/package.json +30 -30
  171. package/src/.spruce/errors/errors.types.ts +32 -2
  172. package/src/.spruce/errors/options.types.ts +4 -1
  173. package/src/.spruce/errors/spruceCli/directoryNotGoModule.schema.ts +23 -0
  174. package/src/__tests__/behavioral/OverridingCommandsInPackageJson.test.ts +60 -13
  175. package/src/__tests__/behavioral/events/DifferentEventOptions.test.ts +134 -0
  176. package/src/__tests__/behavioral/events/KeepingEventsInSync.test.ts +0 -1
  177. package/src/__tests__/behavioral/features/InstallFeaturesInGo.test.ts +17 -0
  178. package/src/__tests__/behavioral/organization/CreatingAnOrg.test.ts +29 -22
  179. package/src/__tests__/behavioral/schemas/KeepingSchemasInSync.test.ts +6 -9
  180. package/src/__tests__/behavioral/schemas/SyncingCoreSchemasInGo.test.ts +376 -0
  181. package/src/__tests__/behavioral/schemas/SyncingSchemasInChildDirInGo.test.ts +46 -0
  182. package/src/__tests__/behavioral/schemas/SyncingSchemasInGo.test.ts +23 -0
  183. package/src/__tests__/behavioral/tests/SelectingAnAbstractTestClass.test.ts +1 -1
  184. package/src/__tests__/behavioral/upgrading/UpdatingDependencies2.test.ts +15 -2
  185. package/src/__tests__/implementation/SkillStore.test.ts +44 -1
  186. package/src/__tests__/support/EventFaker.ts +56 -0
  187. package/src/cli/Cli.ts +20 -12
  188. package/src/errors/SpruceError.ts +4 -0
  189. package/src/errors/directoryNotGoModule.builder.ts +13 -0
  190. package/src/features/AbstractAction.ts +6 -4
  191. package/src/features/AbstractFeature.ts +20 -1
  192. package/src/features/ActionFactory.ts +2 -2
  193. package/src/features/ActionQuestionAsker.ts +0 -1
  194. package/src/features/FeatureInstaller.ts +30 -6
  195. package/src/features/FeatureInstallerFactory.ts +9 -0
  196. package/src/features/OverrideActionDecorator.ts +1 -1
  197. package/src/features/VersionResolver.ts +2 -1
  198. package/src/features/agent/AgentFeature.ts +1 -1
  199. package/src/features/conversation/ConversationFeature.ts +1 -1
  200. package/src/features/dependencies/DependencyFeature.ts +0 -1
  201. package/src/features/deploy/DeployFeature.ts +1 -1
  202. package/src/features/error/ErrorFeature.ts +1 -1
  203. package/src/features/event/EventFeature.ts +1 -1
  204. package/src/features/eventContract/EventContractFeature.ts +1 -3
  205. package/src/features/node/NodeFeature.ts +1 -1
  206. package/src/features/onboard/OnboardFeature.ts +1 -7
  207. package/src/features/organization/OrganizationFeature.ts +0 -1
  208. package/src/features/permission/PermissionFeature.ts +1 -3
  209. package/src/features/person/PersonFeature.ts +1 -4
  210. package/src/features/polish/PolishFeature.ts +1 -1
  211. package/src/features/sandbox/SandboxFeature.ts +0 -1
  212. package/src/features/schema/SchemaFeature.ts +8 -2
  213. package/src/features/schema/actions/SyncAction.ts +68 -26
  214. package/src/features/schema/utilities/schemaDisk.utility.ts +43 -11
  215. package/src/features/schema/utilities/schemaGenerator.utility.ts +33 -13
  216. package/src/features/schema/writers/SchemaWriter.ts +71 -25
  217. package/src/features/skill/SkillFeature.ts +1 -1
  218. package/src/features/skill/stores/SkillStore.ts +51 -5
  219. package/src/features/store/StoreFeature.ts +1 -1
  220. package/src/features/test/TestFeature.ts +1 -1
  221. package/src/features/test/TestReporter.ts +1 -1
  222. package/src/features/view/ViewFeature.ts +1 -1
  223. package/src/packageManager/NodePackageManager.ts +115 -0
  224. package/src/packageManager/packageManager.types.ts +21 -0
  225. package/src/services/GoPackageManager.ts +45 -0
  226. package/src/services/PkgService.ts +17 -92
  227. package/src/templateItemBuilders/SchemaTemplateItemBuilder.ts +6 -6
  228. package/src/tests/AbstractCliTest.ts +19 -5
  229. package/src/tests/fixtures/FeatureFixture.ts +3 -1
  230. package/src/tests/fixtures/GoFixture.ts +39 -0
  231. package/src/widgets/terminalKit/TkTextWidget.ts +3 -2
  232. package/src/writers/AbstractWriter.ts +15 -6
@@ -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 {
@@ -14,9 +14,6 @@ import { FeatureActionResponse } from '../../features.types'
14
14
  import schemaDiskUtil from '../utilities/schemaDisk.utility'
15
15
  import ValueTypeBuilder from '../ValueTypeBuilder'
16
16
 
17
- type OptionsSchema =
18
- SpruceSchemas.SpruceCli.v2020_07_22.SyncSchemasOptionsSchema
19
- type Options = SpruceSchemas.SpruceCli.v2020_07_22.SyncSchemasOptions
20
17
  export default class SyncAction extends AbstractAction<OptionsSchema> {
21
18
  public optionsSchema = syncSchemasActionSchema
22
19
  public commandAliases = ['sync.schemas']
@@ -24,12 +21,10 @@ export default class SyncAction extends AbstractAction<OptionsSchema> {
24
21
 
25
22
  private readonly schemaWriter = this.Writer('schema')
26
23
  private readonly schemaStore = this.Store('schema')
24
+ private readonly skillStore = this.Store('skill')
27
25
 
28
26
  public async execute(options: Options): Promise<FeatureActionResponse> {
29
27
  const normalizedOptions = this.validateAndNormalizeOptions(options)
30
- const isInCoreSchemasModule =
31
- this.Service('pkg').get('name') ===
32
- '@sprucelabs/spruce-core-schemas'
33
28
 
34
29
  let {
35
30
  schemaTypesDestinationDirOrFile,
@@ -39,7 +34,7 @@ export default class SyncAction extends AbstractAction<OptionsSchema> {
39
34
  shouldEnableVersioning,
40
35
  globalSchemaNamespace,
41
36
  shouldFetchRemoteSchemas,
42
- shouldGenerateCoreSchemaTypes = isInCoreSchemasModule,
37
+ shouldGenerateCoreSchemaTypes,
43
38
  shouldFetchLocalSchemas,
44
39
  generateFieldTypes,
45
40
  generateStandaloneTypesFile,
@@ -54,8 +49,7 @@ export default class SyncAction extends AbstractAction<OptionsSchema> {
54
49
 
55
50
  this.ui.startLoading('Loading details about your skill... 🧐')
56
51
 
57
- let localNamespace =
58
- await this.Store('skill').loadCurrentSkillsNamespace()
52
+ let localNamespace = await this.skillStore.loadCurrentSkillsNamespace()
59
53
  let shouldImportCoreSchemas = true
60
54
 
61
55
  if (shouldGenerateCoreSchemaTypes) {
@@ -79,6 +73,7 @@ export default class SyncAction extends AbstractAction<OptionsSchema> {
79
73
  generateStandaloneTypesFile,
80
74
  schemaTypesDestinationDirOrFile,
81
75
  fieldTypesDestinationDir,
76
+ language: this.getProjectLanguage(),
82
77
  })
83
78
 
84
79
  this.ui.startLoading('Generating field types...')
@@ -125,7 +120,6 @@ export default class SyncAction extends AbstractAction<OptionsSchema> {
125
120
 
126
121
  if (deleteOrphanedSchemas) {
127
122
  this.ui.startLoading('Identifying orphaned schemas...')
128
-
129
123
  await schemaDiskUtil.deleteOrphanedSchemas(
130
124
  resolvedSchemaTypesDestinationDirOrFile,
131
125
  schemaTemplateItems
@@ -140,20 +134,30 @@ export default class SyncAction extends AbstractAction<OptionsSchema> {
140
134
  let valueTypes: ValueTypes | undefined
141
135
 
142
136
  try {
143
- valueTypes = await this.generateValueTypes({
144
- resolvedDestination: resolvedFieldTypesDestination,
145
- fieldTemplateItems,
146
- schemaTemplateItems,
147
- globalSchemaNamespace: globalSchemaNamespace ?? undefined,
148
- })
137
+ valueTypes = this.isInGoProject()
138
+ ? undefined
139
+ : await this.generateValueTypes({
140
+ resolvedDestination: resolvedFieldTypesDestination,
141
+ fieldTemplateItems,
142
+ schemaTemplateItems,
143
+ globalSchemaNamespace:
144
+ globalSchemaNamespace ?? undefined,
145
+ })
149
146
  } catch (err: any) {
150
147
  schemaErrors.push(err)
151
148
  }
152
149
 
153
- if (valueTypes) {
150
+ if (valueTypes || this.isInGoProject()) {
154
151
  try {
155
152
  this.ui.startLoading('Determining what changed... ⚡️')
156
153
 
154
+ let goModuleNameAndPath: string | undefined = undefined
155
+ if (this.isInGoProject()) {
156
+ goModuleNameAndPath = this.skillStore.getGoModuleName({
157
+ shouldIncludePathFromCwd: true,
158
+ })
159
+ }
160
+
157
161
  typeResults = await this.schemaWriter.writeSchemasAndTypes(
158
162
  resolvedSchemaTypesDestination,
159
163
  {
@@ -162,11 +166,13 @@ export default class SyncAction extends AbstractAction<OptionsSchema> {
162
166
  schemaTemplateItems,
163
167
  shouldImportCoreSchemas,
164
168
  valueTypes,
169
+ goModuleNameAndPath,
170
+ language: this.getProjectLanguage(),
165
171
  globalSchemaNamespace:
166
172
  globalSchemaNamespace ?? undefined,
167
- typesTemplate: generateStandaloneTypesFile
168
- ? 'schema/core.schemas.types.ts.hbs'
169
- : undefined,
173
+ typesTemplate: this.resolveTypesTemplate(
174
+ generateStandaloneTypesFile
175
+ ),
170
176
  }
171
177
  )
172
178
  } catch (err: any) {
@@ -176,7 +182,10 @@ export default class SyncAction extends AbstractAction<OptionsSchema> {
176
182
  }
177
183
 
178
184
  const p = resolvedSchemaTypesDestination
179
- diskUtil.deleteEmptyDirs(diskUtil.isDir(p) ? p : pathUtil.dirname(p))
185
+ const dir = diskUtil.isDir(p) ? p : pathUtil.dirname(p)
186
+ if (diskUtil.doesDirExist(dir)) {
187
+ diskUtil.deleteEmptyDirs(dir)
188
+ }
180
189
 
181
190
  this.ui.stopLoading()
182
191
 
@@ -192,6 +201,18 @@ export default class SyncAction extends AbstractAction<OptionsSchema> {
192
201
  })
193
202
  }
194
203
 
204
+ private resolveTypesTemplate(
205
+ generateStandaloneTypesFile: boolean
206
+ ): string | undefined {
207
+ if (this.isInGoProject()) {
208
+ return 'schema/schemas.go.hbs'
209
+ }
210
+
211
+ return generateStandaloneTypesFile
212
+ ? 'schema/core.schemas.types.ts.hbs'
213
+ : undefined
214
+ }
215
+
195
216
  private async optionallyInstallRemoteModules(
196
217
  schemaTemplateItems: SchemaTemplateItem[],
197
218
  forceInstall?: boolean
@@ -202,6 +223,10 @@ export default class SyncAction extends AbstractAction<OptionsSchema> {
202
223
  .filter((i) => !!i)
203
224
  ) as string[]
204
225
 
226
+ if (this.isInGoProject()) {
227
+ return
228
+ }
229
+
205
230
  const notInstalled: string[] = []
206
231
 
207
232
  const pkg = this.Service('pkg')
@@ -287,11 +312,12 @@ export default class SyncAction extends AbstractAction<OptionsSchema> {
287
312
  },
288
313
  })
289
314
 
290
- const hashSpruceDestination =
291
- resolvedSchemaTypesDestinationDirOrFile.replace(
292
- diskUtil.resolveHashSprucePath(this.cwd),
293
- '#spruce'
294
- )
315
+ const hashSpruceDestination = this.isInGoProject()
316
+ ? this.cwd
317
+ : resolvedSchemaTypesDestinationDirOrFile.replace(
318
+ diskUtil.resolveHashSprucePath(this.cwd),
319
+ '#spruce'
320
+ )
295
321
 
296
322
  let total = 0
297
323
  let totalNamespaces = 0
@@ -317,11 +343,23 @@ export default class SyncAction extends AbstractAction<OptionsSchema> {
317
343
  return { schemaTemplateItems, schemaErrors }
318
344
  }
319
345
 
346
+ private isInGoProject() {
347
+ return this.getProjectLanguage() === 'go'
348
+ }
349
+
320
350
  private async generateFieldTemplateItems(options: {
321
351
  addonsLookupDir: string
322
352
  shouldGenerateFieldTypes: boolean
323
353
  resolvedFieldTypesDestination: string
324
354
  }) {
355
+ if (this.isInGoProject()) {
356
+ return {
357
+ generateFieldFiles: [],
358
+ fieldTemplateItems: [],
359
+ fieldErrors: [],
360
+ }
361
+ }
362
+
325
363
  const {
326
364
  addonsLookupDir,
327
365
  shouldGenerateFieldTypes: generateFieldTypes,
@@ -358,3 +396,7 @@ export default class SyncAction extends AbstractAction<OptionsSchema> {
358
396
  return builder.generateValueTypes(options)
359
397
  }
360
398
  }
399
+
400
+ type OptionsSchema =
401
+ SpruceSchemas.SpruceCli.v2020_07_22.SyncSchemasOptionsSchema
402
+ type Options = SpruceSchemas.SpruceCli.v2020_07_22.SyncSchemasOptions