@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.
- package/CHANGELOG.md +24 -0
- package/build/.spruce/errors/errors.types.d.ts +23 -2
- package/build/.spruce/errors/options.types.d.ts +4 -1
- package/build/.spruce/errors/spruceCli/directoryNotGoModule.schema.d.ts +3 -0
- package/build/.spruce/errors/spruceCli/directoryNotGoModule.schema.js +20 -0
- package/build/.spruce/errors/spruceCli/directoryNotGoModule.schema.js.map +1 -0
- package/build/.spruce/schemas/schemas.types.d.ts +2 -2
- package/build/.spruce/schemas/spruceCli/v2020_07_22/onboardOptions.schema.js +1 -1
- package/build/.spruce/schemas/spruceCli/v2020_07_22/onboardOptions.schema.js.map +1 -1
- package/build/__tests__/behavioral/OverridingCommandsInPackageJson.test.d.ts +7 -2
- package/build/__tests__/behavioral/OverridingCommandsInPackageJson.test.js +36 -13
- package/build/__tests__/behavioral/OverridingCommandsInPackageJson.test.js.map +1 -1
- package/build/__tests__/behavioral/features/InstallFeaturesInGo.test.d.ts +5 -0
- package/build/__tests__/behavioral/features/InstallFeaturesInGo.test.js +32 -0
- package/build/__tests__/behavioral/features/InstallFeaturesInGo.test.js.map +1 -0
- package/build/__tests__/behavioral/organization/CreatingAnOrg.test.d.ts +5 -0
- package/build/__tests__/behavioral/organization/CreatingAnOrg.test.js +21 -13
- package/build/__tests__/behavioral/organization/CreatingAnOrg.test.js.map +1 -1
- package/build/__tests__/behavioral/schemas/KeepingSchemasInSync.test.d.ts +1 -1
- package/build/__tests__/behavioral/schemas/KeepingSchemasInSync.test.js +7 -7
- package/build/__tests__/behavioral/schemas/KeepingSchemasInSync.test.js.map +1 -1
- package/build/__tests__/behavioral/schemas/SyncingCoreSchemasInGo.test.d.ts +39 -0
- package/build/__tests__/behavioral/schemas/SyncingCoreSchemasInGo.test.js +289 -0
- package/build/__tests__/behavioral/schemas/SyncingCoreSchemasInGo.test.js.map +1 -0
- package/build/__tests__/behavioral/schemas/SyncingSchemasInChildDirInGo.test.d.ts +7 -0
- package/build/__tests__/behavioral/schemas/SyncingSchemasInChildDirInGo.test.js +46 -0
- package/build/__tests__/behavioral/schemas/SyncingSchemasInChildDirInGo.test.js.map +1 -0
- package/build/__tests__/behavioral/schemas/SyncingSchemasInGo.test.d.ts +5 -0
- package/build/__tests__/behavioral/schemas/SyncingSchemasInGo.test.js +31 -0
- package/build/__tests__/behavioral/schemas/SyncingSchemasInGo.test.js.map +1 -0
- package/build/__tests__/behavioral/tests/SelectingAnAbstractTestClass.test.js +1 -1
- package/build/__tests__/behavioral/tests/SelectingAnAbstractTestClass.test.js.map +1 -1
- package/build/__tests__/behavioral/upgrading/UpdatingDependencies2.test.js +10 -1
- package/build/__tests__/behavioral/upgrading/UpdatingDependencies2.test.js.map +1 -1
- package/build/__tests__/implementation/SkillStore.test.d.ts +5 -0
- package/build/__tests__/implementation/SkillStore.test.js +37 -0
- package/build/__tests__/implementation/SkillStore.test.js.map +1 -1
- package/build/__tests__/support/EventFaker.d.ts +4 -0
- package/build/__tests__/support/EventFaker.js +16 -0
- package/build/__tests__/support/EventFaker.js.map +1 -1
- package/build/cli/Cli.js +12 -9
- package/build/cli/Cli.js.map +1 -1
- package/build/errors/SpruceError.js +3 -0
- package/build/errors/SpruceError.js.map +1 -1
- package/build/errors/directoryNotGoModule.builder.d.ts +12 -0
- package/build/errors/directoryNotGoModule.builder.js +15 -0
- package/build/errors/directoryNotGoModule.builder.js.map +1 -0
- package/build/features/AbstractAction.d.ts +1 -0
- package/build/features/AbstractAction.js +5 -1
- package/build/features/AbstractAction.js.map +1 -1
- package/build/features/AbstractFeature.d.ts +8 -1
- package/build/features/AbstractFeature.js +12 -1
- package/build/features/AbstractFeature.js.map +1 -1
- package/build/features/ActionFactory.js +1 -2
- package/build/features/ActionFactory.js.map +1 -1
- package/build/features/ActionQuestionAsker.js +0 -1
- package/build/features/ActionQuestionAsker.js.map +1 -1
- package/build/features/FeatureInstaller.d.ts +1 -0
- package/build/features/FeatureInstaller.js +21 -7
- package/build/features/FeatureInstaller.js.map +1 -1
- package/build/features/FeatureInstallerFactory.d.ts +1 -0
- package/build/features/FeatureInstallerFactory.js +7 -0
- package/build/features/FeatureInstallerFactory.js.map +1 -1
- package/build/features/OverrideActionDecorator.js +1 -1
- package/build/features/OverrideActionDecorator.js.map +1 -1
- package/build/features/VersionResolver.js +1 -1
- package/build/features/VersionResolver.js.map +1 -1
- package/build/features/agent/AgentFeature.d.ts +1 -1
- package/build/features/agent/AgentFeature.js +1 -1
- package/build/features/agent/AgentFeature.js.map +1 -1
- package/build/features/conversation/ConversationFeature.d.ts +1 -1
- package/build/features/conversation/ConversationFeature.js +1 -1
- package/build/features/conversation/ConversationFeature.js.map +1 -1
- package/build/features/dependencies/DependencyFeature.d.ts +0 -1
- package/build/features/dependencies/DependencyFeature.js +0 -1
- package/build/features/dependencies/DependencyFeature.js.map +1 -1
- package/build/features/deploy/DeployFeature.d.ts +1 -1
- package/build/features/deploy/DeployFeature.js +1 -1
- package/build/features/deploy/DeployFeature.js.map +1 -1
- package/build/features/error/ErrorFeature.d.ts +1 -1
- package/build/features/error/ErrorFeature.js +1 -1
- package/build/features/error/ErrorFeature.js.map +1 -1
- package/build/features/event/EventFeature.d.ts +1 -1
- package/build/features/event/EventFeature.js +1 -1
- package/build/features/event/EventFeature.js.map +1 -1
- package/build/features/eventContract/EventContractFeature.d.ts +1 -3
- package/build/features/eventContract/EventContractFeature.js +0 -2
- package/build/features/eventContract/EventContractFeature.js.map +1 -1
- package/build/features/node/NodeFeature.d.ts +1 -1
- package/build/features/node/NodeFeature.js +1 -1
- package/build/features/node/NodeFeature.js.map +1 -1
- package/build/features/onboard/OnboardFeature.d.ts +1 -3
- package/build/features/onboard/OnboardFeature.js +0 -2
- package/build/features/onboard/OnboardFeature.js.map +1 -1
- package/build/features/organization/OrganizationFeature.d.ts +0 -1
- package/build/features/organization/OrganizationFeature.js +0 -1
- package/build/features/organization/OrganizationFeature.js.map +1 -1
- package/build/features/permission/PermissionFeature.d.ts +2 -3
- package/build/features/permission/PermissionFeature.js +1 -2
- package/build/features/permission/PermissionFeature.js.map +1 -1
- package/build/features/person/PersonFeature.d.ts +1 -3
- package/build/features/person/PersonFeature.js +0 -2
- package/build/features/person/PersonFeature.js.map +1 -1
- package/build/features/polish/PolishFeature.d.ts +1 -1
- package/build/features/polish/PolishFeature.js +1 -1
- package/build/features/polish/PolishFeature.js.map +1 -1
- package/build/features/sandbox/SandboxFeature.d.ts +0 -1
- package/build/features/sandbox/SandboxFeature.js +0 -1
- package/build/features/sandbox/SandboxFeature.js.map +1 -1
- package/build/features/schema/SchemaFeature.d.ts +2 -3
- package/build/features/schema/SchemaFeature.js +6 -1
- package/build/features/schema/SchemaFeature.js.map +1 -1
- package/build/features/schema/actions/SyncAction.d.ts +5 -2
- package/build/features/schema/actions/SyncAction.js +50 -16
- package/build/features/schema/actions/SyncAction.js.map +1 -1
- package/build/features/schema/utilities/schemaDisk.utility.d.ts +7 -0
- package/build/features/schema/utilities/schemaDisk.utility.js +22 -4
- package/build/features/schema/utilities/schemaDisk.utility.js.map +1 -1
- package/build/features/schema/utilities/schemaGenerator.utility.d.ts +1 -0
- package/build/features/schema/utilities/schemaGenerator.utility.js +18 -10
- package/build/features/schema/utilities/schemaGenerator.utility.js.map +1 -1
- package/build/features/schema/writers/SchemaWriter.d.ts +9 -9
- package/build/features/schema/writers/SchemaWriter.js +38 -17
- package/build/features/schema/writers/SchemaWriter.js.map +1 -1
- package/build/features/skill/SkillFeature.d.ts +1 -1
- package/build/features/skill/SkillFeature.js +1 -1
- package/build/features/skill/SkillFeature.js.map +1 -1
- package/build/features/skill/stores/SkillStore.d.ts +4 -0
- package/build/features/skill/stores/SkillStore.js +37 -3
- package/build/features/skill/stores/SkillStore.js.map +1 -1
- package/build/features/store/StoreFeature.d.ts +1 -1
- package/build/features/store/StoreFeature.js +1 -1
- package/build/features/store/StoreFeature.js.map +1 -1
- package/build/features/test/TestFeature.d.ts +1 -1
- package/build/features/test/TestFeature.js +1 -1
- package/build/features/test/TestFeature.js.map +1 -1
- package/build/features/test/TestReporter.js +1 -1
- package/build/features/test/TestReporter.js.map +1 -1
- package/build/features/view/ViewFeature.d.ts +1 -1
- package/build/features/view/ViewFeature.js +1 -1
- package/build/features/view/ViewFeature.js.map +1 -1
- package/build/migration/EsLint9Migrator.d.ts +1 -0
- package/build/packageManager/NodePackageManager.d.ts +14 -0
- package/build/packageManager/NodePackageManager.js +88 -0
- package/build/packageManager/NodePackageManager.js.map +1 -0
- package/build/packageManager/packageManager.types.d.ts +16 -0
- package/build/packageManager/packageManager.types.js +3 -0
- package/build/packageManager/packageManager.types.js.map +1 -0
- package/build/schemas/v2020_07_22/onboardOptions.builder.js +1 -1
- package/build/schemas/v2020_07_22/onboardOptions.builder.js.map +1 -1
- package/build/services/GoPackageManager.d.ts +10 -0
- package/build/services/GoPackageManager.js +39 -0
- package/build/services/GoPackageManager.js.map +1 -0
- package/build/services/PkgService.d.ts +3 -7
- package/build/services/PkgService.js +13 -68
- package/build/services/PkgService.js.map +1 -1
- package/build/templateItemBuilders/SchemaTemplateItemBuilder.js.map +1 -1
- package/build/tests/AbstractCliTest.d.ts +5 -1
- package/build/tests/AbstractCliTest.js +15 -3
- package/build/tests/AbstractCliTest.js.map +1 -1
- package/build/tests/fixtures/FeatureFixture.js +4 -1
- package/build/tests/fixtures/FeatureFixture.js.map +1 -1
- package/build/tests/fixtures/GoFixture.d.ts +12 -0
- package/build/tests/fixtures/GoFixture.js +39 -0
- package/build/tests/fixtures/GoFixture.js.map +1 -0
- package/build/tests/staticToInstanceMigration/StaticToInstanceMigrator.d.ts +1 -0
- package/build/widgets/terminalKit/TkTextWidget.js +1 -1
- package/build/widgets/terminalKit/TkTextWidget.js.map +1 -1
- package/build/writers/AbstractWriter.js +7 -6
- package/build/writers/AbstractWriter.js.map +1 -1
- package/package.json +29 -29
- package/src/.spruce/errors/errors.types.ts +32 -2
- package/src/.spruce/errors/options.types.ts +4 -1
- package/src/.spruce/errors/spruceCli/directoryNotGoModule.schema.ts +23 -0
- package/src/.spruce/schemas/schemas.types.ts +2 -2
- package/src/.spruce/schemas/spruceCli/v2020_07_22/onboardOptions.schema.ts +1 -1
- package/src/__tests__/behavioral/OverridingCommandsInPackageJson.test.ts +60 -13
- package/src/__tests__/behavioral/features/InstallFeaturesInGo.test.ts +17 -0
- package/src/__tests__/behavioral/organization/CreatingAnOrg.test.ts +29 -22
- package/src/__tests__/behavioral/schemas/KeepingSchemasInSync.test.ts +6 -9
- package/src/__tests__/behavioral/schemas/SyncingCoreSchemasInGo.test.ts +376 -0
- package/src/__tests__/behavioral/schemas/SyncingSchemasInChildDirInGo.test.ts +46 -0
- package/src/__tests__/behavioral/schemas/SyncingSchemasInGo.test.ts +23 -0
- package/src/__tests__/behavioral/tests/SelectingAnAbstractTestClass.test.ts +1 -1
- package/src/__tests__/behavioral/upgrading/UpdatingDependencies2.test.ts +15 -2
- package/src/__tests__/implementation/SkillStore.test.ts +44 -1
- package/src/__tests__/support/EventFaker.ts +29 -0
- package/src/cli/Cli.ts +20 -12
- package/src/errors/SpruceError.ts +4 -0
- package/src/errors/directoryNotGoModule.builder.ts +13 -0
- package/src/features/AbstractAction.ts +6 -4
- package/src/features/AbstractFeature.ts +20 -1
- package/src/features/ActionFactory.ts +2 -2
- package/src/features/ActionQuestionAsker.ts +0 -1
- package/src/features/FeatureInstaller.ts +30 -6
- package/src/features/FeatureInstallerFactory.ts +9 -0
- package/src/features/OverrideActionDecorator.ts +1 -1
- package/src/features/VersionResolver.ts +2 -1
- package/src/features/agent/AgentFeature.ts +1 -1
- package/src/features/conversation/ConversationFeature.ts +1 -1
- package/src/features/dependencies/DependencyFeature.ts +0 -1
- package/src/features/deploy/DeployFeature.ts +1 -1
- package/src/features/error/ErrorFeature.ts +1 -1
- package/src/features/event/EventFeature.ts +1 -1
- package/src/features/eventContract/EventContractFeature.ts +1 -3
- package/src/features/node/NodeFeature.ts +1 -1
- package/src/features/onboard/OnboardFeature.ts +1 -7
- package/src/features/organization/OrganizationFeature.ts +0 -1
- package/src/features/permission/PermissionFeature.ts +1 -3
- package/src/features/person/PersonFeature.ts +1 -4
- package/src/features/polish/PolishFeature.ts +1 -1
- package/src/features/sandbox/SandboxFeature.ts +0 -1
- package/src/features/schema/SchemaFeature.ts +8 -2
- package/src/features/schema/actions/SyncAction.ts +68 -26
- package/src/features/schema/utilities/schemaDisk.utility.ts +43 -11
- package/src/features/schema/utilities/schemaGenerator.utility.ts +33 -13
- package/src/features/schema/writers/SchemaWriter.ts +71 -25
- package/src/features/skill/SkillFeature.ts +1 -1
- package/src/features/skill/stores/SkillStore.ts +47 -5
- package/src/features/store/StoreFeature.ts +1 -1
- package/src/features/test/TestFeature.ts +1 -1
- package/src/features/test/TestReporter.ts +1 -1
- package/src/features/view/ViewFeature.ts +1 -1
- package/src/packageManager/NodePackageManager.ts +115 -0
- package/src/packageManager/packageManager.types.ts +21 -0
- package/src/schemas/v2020_07_22/onboardOptions.builder.ts +1 -1
- package/src/services/GoPackageManager.ts +45 -0
- package/src/services/PkgService.ts +17 -92
- package/src/templateItemBuilders/SchemaTemplateItemBuilder.ts +6 -6
- package/src/tests/AbstractCliTest.ts +19 -5
- package/src/tests/fixtures/FeatureFixture.ts +3 -1
- package/src/tests/fixtures/GoFixture.ts +39 -0
- package/src/widgets/terminalKit/TkTextWidget.ts +1 -1
- 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
|
-
|
|
23
|
-
skill.
|
|
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 {
|
|
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
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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',
|
|
@@ -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, {
|
|
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
|
-
[]
|
|
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
|
-
|
|
419
|
-
|
|
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
|
-
!
|
|
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
|
|
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
|
|
18
|
+
public _packageDependencies: NpmPackage[] = [
|
|
19
19
|
{
|
|
20
20
|
name: '@sprucelabs/spruce-conversation-plugin@latest',
|
|
21
21
|
isDev: false,
|
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
@@ -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
|
|
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
|
|
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 () => {
|
|
@@ -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
|
|
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 {
|