@aws/nx-plugin 1.0.0-rc.45 → 1.0.0-rc.47
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/LICENSE-THIRD-PARTY +3 -60
- package/generators.json +9 -9
- package/package.json +7 -3
- package/src/agentcore-gateway/generator.js +12 -2
- package/src/agentcore-gateway/generator.js.map +1 -1
- package/src/infra/app/__snapshots__/generator.spec.ts.snap +25 -31
- package/src/infra/app/generator.js +9 -6
- package/src/infra/app/generator.js.map +1 -1
- package/src/license/config.js +1 -1
- package/src/license/config.js.map +1 -1
- package/src/mcp-server/schema.d.ts +1 -1
- package/src/mcp-server/tools/general-guidance.js +5 -6
- package/src/mcp-server/tools/general-guidance.js.map +1 -1
- package/src/preset/__snapshots__/generator.spec.ts.snap +38 -7
- package/src/preset/generator.d.ts +1 -1
- package/src/preset/generator.js +4 -2
- package/src/preset/generator.js.map +1 -1
- package/src/preset/schema.d.js.map +1 -1
- package/src/preset/schema.d.ts +1 -0
- package/src/preset/schema.json +5 -0
- package/src/py/agent/generator.js +2 -1
- package/src/py/agent/generator.js.map +1 -1
- package/src/py/mcp-server/generator.js +2 -1
- package/src/py/mcp-server/generator.js.map +1 -1
- package/src/py/project/generator.js +2 -1
- package/src/py/project/generator.js.map +1 -1
- package/src/py/rdb/__snapshots__/generator.spec.ts.snap +1 -0
- package/src/py/rdb/generator.js +7 -1
- package/src/py/rdb/generator.js.map +1 -1
- package/src/smithy/ts/api/generator.js +5 -2
- package/src/smithy/ts/api/generator.js.map +1 -1
- package/src/terraform/project/generator.js +4 -1
- package/src/terraform/project/generator.js.map +1 -1
- package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +6 -6
- package/src/trpc/backend/generator.js +7 -5
- package/src/trpc/backend/generator.js.map +1 -1
- package/src/trpc/react/generator.js +4 -4
- package/src/trpc/react/generator.js.map +1 -1
- package/src/ts/agent/__snapshots__/generator.spec.ts.snap +2 -2
- package/src/ts/agent/a2a-connection/generator.js +3 -2
- package/src/ts/agent/a2a-connection/generator.js.map +1 -1
- package/src/ts/agent/gateway-connection/generator.js +4 -3
- package/src/ts/agent/gateway-connection/generator.js.map +1 -1
- package/src/ts/agent/generator.js +8 -5
- package/src/ts/agent/generator.js.map +1 -1
- package/src/ts/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +1 -1
- package/src/ts/agent/mcp-connection/generator.js +4 -3
- package/src/ts/agent/mcp-connection/generator.js.map +1 -1
- package/src/ts/agent/react-connection/generator.js +10 -19
- package/src/ts/agent/react-connection/generator.js.map +1 -1
- package/src/ts/astro-docs/generator.js +12 -3
- package/src/ts/astro-docs/generator.js.map +1 -1
- package/src/ts/dcr-proxy/generator.js +5 -5
- package/src/ts/dcr-proxy/generator.js.map +1 -1
- package/src/ts/dynamodb/generator.js +5 -2
- package/src/ts/dynamodb/generator.js.map +1 -1
- package/src/ts/lambda-function/__snapshots__/generator.spec.ts.snap +4 -2
- package/src/ts/lambda-function/files/handler/__lambdaFunctionKebabCase__.ts.template +2 -1
- package/src/ts/lambda-function/generator.js +3 -2
- package/src/ts/lambda-function/generator.js.map +1 -1
- package/src/ts/lib/ts-project-utils.js +17 -10
- package/src/ts/lib/ts-project-utils.js.map +1 -1
- package/src/ts/lib/vitest.js +2 -1
- package/src/ts/lib/vitest.js.map +1 -1
- package/src/ts/mcp-server/generator.js +11 -11
- package/src/ts/mcp-server/generator.js.map +1 -1
- package/src/ts/nx-generator/generator.js +5 -0
- package/src/ts/nx-generator/generator.js.map +1 -1
- package/src/ts/nx-plugin/__snapshots__/generator.spec.ts.snap +5 -6
- package/src/ts/nx-plugin/files/mcp-server/resources/GENERAL_GUIDANCE.md.template +5 -6
- package/src/ts/nx-plugin/utils.js +2 -1
- package/src/ts/nx-plugin/utils.js.map +1 -1
- package/src/ts/rdb/agent-connection/generator.js +1 -2
- package/src/ts/rdb/agent-connection/generator.js.map +1 -1
- package/src/ts/rdb/generator.js +10 -6
- package/src/ts/rdb/generator.js.map +1 -1
- package/src/ts/rdb/mcp-server-connection/generator.js +1 -2
- package/src/ts/rdb/mcp-server-connection/generator.js.map +1 -1
- package/src/ts/rdb/smithy-connection/generator.js +1 -2
- package/src/ts/rdb/smithy-connection/generator.js.map +1 -1
- package/src/ts/rdb/trpc-connection/generator.js +1 -2
- package/src/ts/rdb/trpc-connection/generator.js.map +1 -1
- package/src/ts/react-website/agui/generator.js +5 -4
- package/src/ts/react-website/agui/generator.js.map +1 -1
- package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +219 -79
- package/src/ts/react-website/app/generator.js +34 -14
- package/src/ts/react-website/app/generator.js.map +1 -1
- package/src/ts/react-website/cognito-auth/__snapshots__/generator.spec.ts.snap +11 -6
- package/src/ts/react-website/cognito-auth/__snapshots__/generator.terraform.spec.ts.snap +12 -2
- package/src/ts/react-website/cognito-auth/generator.js +3 -2
- package/src/ts/react-website/cognito-auth/generator.js.map +1 -1
- package/src/ts/react-website/runtime-config/generator.js +2 -2
- package/src/ts/react-website/runtime-config/generator.js.map +1 -1
- package/src/ts/sync/generator.js +81 -3
- package/src/ts/sync/generator.js.map +1 -1
- package/src/utils/agent-connection/agent-connection.d.ts +1 -1
- package/src/utils/agent-connection/agent-connection.js +50 -1
- package/src/utils/agent-connection/agent-connection.js.map +1 -1
- package/src/utils/agent-core-constructs/agent-core-constructs.js +10 -1
- package/src/utils/agent-core-constructs/agent-core-constructs.js.map +1 -1
- package/src/utils/api-constructs/api-constructs.js +15 -1
- package/src/utils/api-constructs/api-constructs.js.map +1 -1
- package/src/utils/bundle/bundle.js +2 -1
- package/src/utils/bundle/bundle.js.map +1 -1
- package/src/utils/commands.d.ts +5 -3
- package/src/utils/commands.js +24 -3
- package/src/utils/commands.js.map +1 -1
- package/src/utils/config/index.d.ts +16 -0
- package/src/utils/config/index.js.map +1 -1
- package/src/utils/config/utils.d.ts +3 -2
- package/src/utils/config/utils.js +4 -3
- package/src/utils/config/utils.js.map +1 -1
- package/src/utils/connection/open-api/react.js +3 -2
- package/src/utils/connection/open-api/react.js.map +1 -1
- package/src/utils/containers.js +1 -1
- package/src/utils/containers.js.map +1 -1
- package/src/utils/dependencies.d.ts +18 -0
- package/src/utils/dependencies.js +206 -0
- package/src/utils/dependencies.js.map +1 -0
- package/src/utils/files/common/shadcn/readme/README.md.template +3 -3
- package/src/utils/files/shadcn/components.json.template +1 -1
- package/src/utils/format.d.ts +20 -1
- package/src/utils/format.js +83 -49
- package/src/utils/format.js.map +1 -1
- package/src/utils/fs.d.ts +1 -1
- package/src/utils/fs.js +1 -1
- package/src/utils/fs.js.map +1 -1
- package/src/utils/iac.js +1 -1
- package/src/utils/iac.js.map +1 -1
- package/src/utils/identity-constructs/files/cdk/core/user-identity.ts.template +11 -6
- package/src/utils/identity-constructs/identity-constructs.js +14 -3
- package/src/utils/identity-constructs/identity-constructs.js.map +1 -1
- package/src/utils/init.d.ts +7 -1
- package/src/utils/init.js +38 -17
- package/src/utils/init.js.map +1 -1
- package/src/utils/install.js +3 -1
- package/src/utils/install.js.map +1 -1
- package/src/utils/module-format.d.ts +5 -8
- package/src/utils/module-format.js +29 -12
- package/src/utils/module-format.js.map +1 -1
- package/src/utils/npm-scope.d.ts +0 -4
- package/src/utils/npm-scope.js +0 -5
- package/src/utils/npm-scope.js.map +1 -1
- package/src/utils/pnpm-workspace.d.ts +1 -12
- package/src/utils/pnpm-workspace.js +3 -30
- package/src/utils/pnpm-workspace.js.map +1 -1
- package/src/utils/project-package-json.d.ts +39 -0
- package/src/utils/project-package-json.js +119 -0
- package/src/utils/project-package-json.js.map +1 -0
- package/src/utils/shared-constructs.js +6 -5
- package/src/utils/shared-constructs.js.map +1 -1
- package/src/utils/shared-dynamodb-scripts.js +4 -2
- package/src/utils/shared-dynamodb-scripts.js.map +1 -1
- package/src/utils/shared-infra-scripts.js +5 -4
- package/src/utils/shared-infra-scripts.js.map +1 -1
- package/src/utils/shared-rdb-scripts.js +14 -1
- package/src/utils/shared-rdb-scripts.js.map +1 -1
- package/src/utils/shared-shadcn.js +11 -8
- package/src/utils/shared-shadcn.js.map +1 -1
- package/src/utils/test.js +8 -3
- package/src/utils/test.js.map +1 -1
- package/src/utils/versions.d.ts +4 -0
- package/src/utils/versions.js +8 -1
- package/src/utils/versions.js.map +1 -1
- package/src/utils/website-constructs/files/cdk/core/static-website.ts.template +3 -0
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
3
|
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
*/ import {
|
|
4
|
+
*/ import { generateFiles, joinPathFragments, OverwriteStrategy, updateProjectConfiguration } from "@nx/devkit";
|
|
5
5
|
import { readAgentCoreGatewayMetadata } from "../../../agentcore-gateway/generator.js";
|
|
6
6
|
import { AGENT_CONNECTION_PROJECT_DIR, addTypeScriptClientToAgent, addTypeScriptCoreClient, ensureTypeScriptAgentConnectionProject } from "../../../utils/agent-connection/agent-connection.js";
|
|
7
7
|
import { addDestructuredImport, addStarExport } from "../../../utils/ast.js";
|
|
8
|
+
import { addDependenciesToPackageJson } from "../../../utils/dependencies.js";
|
|
8
9
|
import { formatFilesInSubtree } from "../../../utils/format.js";
|
|
9
10
|
import { installDependencies } from "../../../utils/install.js";
|
|
10
11
|
import { addGeneratorMetricsIfApplicable } from "../../../utils/metrics.js";
|
|
@@ -62,7 +63,7 @@ export const tsAgentGatewayConnectionGenerator = async (tree, options)=>{
|
|
|
62
63
|
const clientVarName = gatewayClassName.charAt(0).toLowerCase() + gatewayClassName.slice(1);
|
|
63
64
|
await addDestructuredImport(tree, agentFilePath, [
|
|
64
65
|
clientClassName
|
|
65
|
-
],
|
|
66
|
+
], `@${npmScope}/agent-connection`);
|
|
66
67
|
await addTypeScriptClientToAgent(tree, agentFilePath, clientClassName, clientVarName);
|
|
67
68
|
}
|
|
68
69
|
// 4. Wire dev chain — agent's dev depends on gateway's
|
|
@@ -100,7 +101,7 @@ export const tsAgentGatewayConnectionGenerator = async (tree, options)=>{
|
|
|
100
101
|
'@aws-sdk/client-appconfigdata',
|
|
101
102
|
'aws4fetch',
|
|
102
103
|
'@aws-sdk/credential-providers'
|
|
103
|
-
]), {});
|
|
104
|
+
]), {}, joinPathFragments(sourceProject.root, 'package.json'));
|
|
104
105
|
await addGeneratorMetricsIfApplicable(tree, [
|
|
105
106
|
TS_AGENT_GATEWAY_CONNECTION_GENERATOR_INFO
|
|
106
107
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../packages/nx-plugin/src/ts/agent/gateway-connection/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n addDependenciesToPackageJson,\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { readAgentCoreGatewayMetadata } from '../../../agentcore-gateway/generator';\nimport {\n AGENT_CONNECTION_PROJECT_DIR,\n addTypeScriptClientToAgent,\n addTypeScriptCoreClient,\n ensureTypeScriptAgentConnectionProject,\n} from '../../../utils/agent-connection/agent-connection';\nimport { addDestructuredImport, addStarExport } from '../../../utils/ast';\nimport { formatFilesInSubtree } from '../../../utils/format';\nimport { installDependencies } from '../../../utils/install';\nimport { addGeneratorMetricsIfApplicable } from '../../../utils/metrics';\nimport { esmVars } from '../../../utils/module-format';\nimport { kebabCase } from '../../../utils/names';\nimport { getNpmScope } from '../../../utils/npm-scope';\nimport {\n addDependencyToTargetIfNotPresent,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../../utils/nx';\nimport { withVersions } from '../../../utils/versions';\nimport type { TsAgentGatewayConnectionGeneratorSchema } from './schema';\n\nexport const TS_AGENT_GATEWAY_CONNECTION_GENERATOR_INFO: NxGeneratorInfo =\n getGeneratorInfo(import.meta.filename);\n\nexport const tsAgentGatewayConnectionGenerator = async (\n tree: Tree,\n options: TsAgentGatewayConnectionGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const sourceProject = readProjectConfigurationUnqualified(\n tree,\n options.sourceProject,\n );\n const targetProject = readProjectConfigurationUnqualified(\n tree,\n options.targetProject,\n );\n\n const agentComponent = options.sourceComponent;\n if (!agentComponent) {\n throw new Error(\n 'sourceComponent must be provided for ts#agent -> agentcore-gateway connections',\n );\n }\n const gateway = readAgentCoreGatewayMetadata(targetProject);\n\n if (gateway.protocol !== 'mcp') {\n throw new Error(\n `Gateway '${gateway.name}' has protocol='${gateway.protocol}'. Only MCP-protocol gateways are supported.`,\n );\n }\n if (gateway.auth !== 'iam') {\n throw new Error(\n `Gateway '${gateway.name}' uses auth='${gateway.auth}'. Agent connections currently require the gateway to use IAM authentication.`,\n );\n }\n if (agentComponent.auth && agentComponent.auth !== 'iam') {\n throw new Error(\n `Agent '${agentComponent.name}' uses auth='${agentComponent.auth}'. Only IAM-authenticated agents can connect to IAM gateways.`,\n );\n }\n\n const gatewayClassName = gateway.rc;\n const gatewayKebabCase = kebabCase(gatewayClassName);\n // A gateway is its own standalone project, so it exposes plain serve / dev.\n const gatewayServeTargetName = 'serve';\n const gatewayDevTargetName = 'dev';\n\n const npmScope = getNpmScope(tree);\n\n // 1. Ensure the shared agent-connection project exists + has the gateway\n // core client template.\n await ensureTypeScriptAgentConnectionProject(tree);\n await addTypeScriptCoreClient(tree, 'gateway');\n\n // 2. Generate the per-connection <Gateway>Client into app/. Local mode\n // points at the gateway project's local gateway port.\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'agent-connection', 'app'),\n joinPathFragments(AGENT_CONNECTION_PROJECT_DIR, 'src', 'app'),\n {\n gatewayKebabCase,\n gatewayClassName,\n gatewayPort: gateway.port,\n ...esmVars(tree),\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // Re-export from the agent-connection index\n await addStarExport(\n tree,\n joinPathFragments(AGENT_CONNECTION_PROJECT_DIR, 'src', 'index.ts'),\n `./app/${gatewayKebabCase}-client-strands.js`,\n );\n\n // 3. AST-transform agent.ts to add the gateway client (an McpClient in\n // both deployed and local modes) to the agent's tools.\n const agentSourceDir = joinPathFragments(\n sourceProject.root,\n agentComponent.path ?? 'src',\n );\n const agentFilePath = joinPathFragments(agentSourceDir, 'agent.ts');\n\n if (tree.exists(agentFilePath)) {\n const clientClassName = `${gatewayClassName}ClientStrands`;\n const clientVarName =\n gatewayClassName.charAt(0).toLowerCase() + gatewayClassName.slice(1);\n\n await addDestructuredImport(\n tree,\n agentFilePath,\n [clientClassName],\n `:${npmScope}/agent-connection`,\n );\n await addTypeScriptClientToAgent(\n tree,\n agentFilePath,\n clientClassName,\n clientVarName,\n );\n }\n\n // 4. Wire dev chain — agent's dev depends on gateway's\n // aggregator target, which transitively starts each attached MCP server.\n const agentName = agentComponent.name ?? 'agent';\n const serveTargetName = `${agentName}-serve`;\n const devTargetName = `${agentName}-dev`;\n let projectConfigChanged = false;\n if (sourceProject.targets?.[serveTargetName]) {\n addDependencyToTargetIfNotPresent(sourceProject, serveTargetName, {\n projects: [targetProject.name],\n target: gatewayServeTargetName,\n });\n projectConfigChanged = true;\n }\n if (sourceProject.targets?.[devTargetName]) {\n addDependencyToTargetIfNotPresent(sourceProject, devTargetName, {\n projects: [targetProject.name],\n target: gatewayDevTargetName,\n });\n projectConfigChanged = true;\n }\n if (projectConfigChanged) {\n updateProjectConfiguration(tree, sourceProject.name, sourceProject);\n }\n\n // 5. Dependencies\n addDependenciesToPackageJson(\n tree,\n withVersions([\n '@modelcontextprotocol/sdk',\n '@strands-agents/sdk',\n '@aws-lambda-powertools/parameters',\n '@aws-sdk/client-appconfigdata',\n 'aws4fetch',\n '@aws-sdk/credential-providers',\n ]),\n {},\n );\n\n await addGeneratorMetricsIfApplicable(tree, [\n TS_AGENT_GATEWAY_CONNECTION_GENERATOR_INFO,\n ]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsAgentGatewayConnectionGenerator;\n"],"names":["addDependenciesToPackageJson","generateFiles","joinPathFragments","OverwriteStrategy","updateProjectConfiguration","readAgentCoreGatewayMetadata","AGENT_CONNECTION_PROJECT_DIR","addTypeScriptClientToAgent","addTypeScriptCoreClient","ensureTypeScriptAgentConnectionProject","addDestructuredImport","addStarExport","formatFilesInSubtree","installDependencies","addGeneratorMetricsIfApplicable","esmVars","kebabCase","getNpmScope","addDependencyToTargetIfNotPresent","getGeneratorInfo","readProjectConfigurationUnqualified","withVersions","TS_AGENT_GATEWAY_CONNECTION_GENERATOR_INFO","filename","tsAgentGatewayConnectionGenerator","tree","options","sourceProject","targetProject","agentComponent","sourceComponent","Error","gateway","protocol","name","auth","gatewayClassName","rc","gatewayKebabCase","gatewayServeTargetName","gatewayDevTargetName","npmScope","dirname","gatewayPort","port","overwriteStrategy","KeepExisting","agentSourceDir","root","path","agentFilePath","exists","clientClassName","clientVarName","charAt","toLowerCase","slice","agentName","serveTargetName","devTargetName","projectConfigChanged","targets","projects","target","preferInstallDependencies","languages"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../packages/nx-plugin/src/ts/agent/gateway-connection/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { readAgentCoreGatewayMetadata } from '../../../agentcore-gateway/generator';\nimport {\n AGENT_CONNECTION_PROJECT_DIR,\n addTypeScriptClientToAgent,\n addTypeScriptCoreClient,\n ensureTypeScriptAgentConnectionProject,\n} from '../../../utils/agent-connection/agent-connection';\nimport { addDestructuredImport, addStarExport } from '../../../utils/ast';\nimport { addDependenciesToPackageJson } from '../../../utils/dependencies';\nimport { formatFilesInSubtree } from '../../../utils/format';\nimport { installDependencies } from '../../../utils/install';\nimport { addGeneratorMetricsIfApplicable } from '../../../utils/metrics';\nimport { esmVars } from '../../../utils/module-format';\nimport { kebabCase } from '../../../utils/names';\nimport { getNpmScope } from '../../../utils/npm-scope';\nimport {\n addDependencyToTargetIfNotPresent,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../../utils/nx';\nimport { withVersions } from '../../../utils/versions';\nimport type { TsAgentGatewayConnectionGeneratorSchema } from './schema';\n\nexport const TS_AGENT_GATEWAY_CONNECTION_GENERATOR_INFO: NxGeneratorInfo =\n getGeneratorInfo(import.meta.filename);\n\nexport const tsAgentGatewayConnectionGenerator = async (\n tree: Tree,\n options: TsAgentGatewayConnectionGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const sourceProject = readProjectConfigurationUnqualified(\n tree,\n options.sourceProject,\n );\n const targetProject = readProjectConfigurationUnqualified(\n tree,\n options.targetProject,\n );\n\n const agentComponent = options.sourceComponent;\n if (!agentComponent) {\n throw new Error(\n 'sourceComponent must be provided for ts#agent -> agentcore-gateway connections',\n );\n }\n const gateway = readAgentCoreGatewayMetadata(targetProject);\n\n if (gateway.protocol !== 'mcp') {\n throw new Error(\n `Gateway '${gateway.name}' has protocol='${gateway.protocol}'. Only MCP-protocol gateways are supported.`,\n );\n }\n if (gateway.auth !== 'iam') {\n throw new Error(\n `Gateway '${gateway.name}' uses auth='${gateway.auth}'. Agent connections currently require the gateway to use IAM authentication.`,\n );\n }\n if (agentComponent.auth && agentComponent.auth !== 'iam') {\n throw new Error(\n `Agent '${agentComponent.name}' uses auth='${agentComponent.auth}'. Only IAM-authenticated agents can connect to IAM gateways.`,\n );\n }\n\n const gatewayClassName = gateway.rc;\n const gatewayKebabCase = kebabCase(gatewayClassName);\n // A gateway is its own standalone project, so it exposes plain serve / dev.\n const gatewayServeTargetName = 'serve';\n const gatewayDevTargetName = 'dev';\n\n const npmScope = getNpmScope(tree);\n\n // 1. Ensure the shared agent-connection project exists + has the gateway\n // core client template.\n await ensureTypeScriptAgentConnectionProject(tree);\n await addTypeScriptCoreClient(tree, 'gateway');\n\n // 2. Generate the per-connection <Gateway>Client into app/. Local mode\n // points at the gateway project's local gateway port.\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'agent-connection', 'app'),\n joinPathFragments(AGENT_CONNECTION_PROJECT_DIR, 'src', 'app'),\n {\n gatewayKebabCase,\n gatewayClassName,\n gatewayPort: gateway.port,\n ...esmVars(tree),\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // Re-export from the agent-connection index\n await addStarExport(\n tree,\n joinPathFragments(AGENT_CONNECTION_PROJECT_DIR, 'src', 'index.ts'),\n `./app/${gatewayKebabCase}-client-strands.js`,\n );\n\n // 3. AST-transform agent.ts to add the gateway client (an McpClient in\n // both deployed and local modes) to the agent's tools.\n const agentSourceDir = joinPathFragments(\n sourceProject.root,\n agentComponent.path ?? 'src',\n );\n const agentFilePath = joinPathFragments(agentSourceDir, 'agent.ts');\n\n if (tree.exists(agentFilePath)) {\n const clientClassName = `${gatewayClassName}ClientStrands`;\n const clientVarName =\n gatewayClassName.charAt(0).toLowerCase() + gatewayClassName.slice(1);\n\n await addDestructuredImport(\n tree,\n agentFilePath,\n [clientClassName],\n `@${npmScope}/agent-connection`,\n );\n await addTypeScriptClientToAgent(\n tree,\n agentFilePath,\n clientClassName,\n clientVarName,\n );\n }\n\n // 4. Wire dev chain — agent's dev depends on gateway's\n // aggregator target, which transitively starts each attached MCP server.\n const agentName = agentComponent.name ?? 'agent';\n const serveTargetName = `${agentName}-serve`;\n const devTargetName = `${agentName}-dev`;\n let projectConfigChanged = false;\n if (sourceProject.targets?.[serveTargetName]) {\n addDependencyToTargetIfNotPresent(sourceProject, serveTargetName, {\n projects: [targetProject.name],\n target: gatewayServeTargetName,\n });\n projectConfigChanged = true;\n }\n if (sourceProject.targets?.[devTargetName]) {\n addDependencyToTargetIfNotPresent(sourceProject, devTargetName, {\n projects: [targetProject.name],\n target: gatewayDevTargetName,\n });\n projectConfigChanged = true;\n }\n if (projectConfigChanged) {\n updateProjectConfiguration(tree, sourceProject.name, sourceProject);\n }\n\n // 5. Dependencies\n addDependenciesToPackageJson(\n tree,\n withVersions([\n '@modelcontextprotocol/sdk',\n '@strands-agents/sdk',\n '@aws-lambda-powertools/parameters',\n '@aws-sdk/client-appconfigdata',\n 'aws4fetch',\n '@aws-sdk/credential-providers',\n ]),\n {},\n joinPathFragments(sourceProject.root, 'package.json'),\n );\n\n await addGeneratorMetricsIfApplicable(tree, [\n TS_AGENT_GATEWAY_CONNECTION_GENERATOR_INFO,\n ]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsAgentGatewayConnectionGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateProjectConfiguration","readAgentCoreGatewayMetadata","AGENT_CONNECTION_PROJECT_DIR","addTypeScriptClientToAgent","addTypeScriptCoreClient","ensureTypeScriptAgentConnectionProject","addDestructuredImport","addStarExport","addDependenciesToPackageJson","formatFilesInSubtree","installDependencies","addGeneratorMetricsIfApplicable","esmVars","kebabCase","getNpmScope","addDependencyToTargetIfNotPresent","getGeneratorInfo","readProjectConfigurationUnqualified","withVersions","TS_AGENT_GATEWAY_CONNECTION_GENERATOR_INFO","filename","tsAgentGatewayConnectionGenerator","tree","options","sourceProject","targetProject","agentComponent","sourceComponent","Error","gateway","protocol","name","auth","gatewayClassName","rc","gatewayKebabCase","gatewayServeTargetName","gatewayDevTargetName","npmScope","dirname","gatewayPort","port","overwriteStrategy","KeepExisting","agentSourceDir","root","path","agentFilePath","exists","clientClassName","clientVarName","charAt","toLowerCase","slice","agentName","serveTargetName","devTargetName","projectConfigChanged","targets","projects","target","preferInstallDependencies","languages"],"mappings":"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"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
3
|
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
*/ import {
|
|
4
|
+
*/ import { generateFiles, joinPathFragments, OverwriteStrategy, updateProjectConfiguration } from "@nx/devkit";
|
|
5
5
|
import { addAgentChatScripts } from "../../utils/agent-chat/agent-chat.js";
|
|
6
6
|
import { addTypeScriptFrameworkBase, ensureTypeScriptAgentConnectionProject } from "../../utils/agent-connection/agent-connection.js";
|
|
7
7
|
import { addAgentInfra } from "../../utils/agent-core-constructs/agent-core-constructs.js";
|
|
8
8
|
import { addTypeScriptBundleTarget } from "../../utils/bundle/bundle.js";
|
|
9
9
|
import { resolveContainers } from "../../utils/containers.js";
|
|
10
|
+
import { addDependenciesToPackageJson } from "../../utils/dependencies.js";
|
|
10
11
|
import { addDockerScanTarget } from "../../utils/docker.js";
|
|
11
12
|
import { formatFilesInSubtree } from "../../utils/format.js";
|
|
12
13
|
import { FsCommands } from "../../utils/fs.js";
|
|
@@ -53,7 +54,7 @@ export const tsAgentGenerator = async (tree, options)=>{
|
|
|
53
54
|
name,
|
|
54
55
|
agentNameClassName,
|
|
55
56
|
distDir,
|
|
56
|
-
agentConnectionImport:
|
|
57
|
+
agentConnectionImport: `@${getNpmScope(tree)}/agent-connection`,
|
|
57
58
|
...esmVars(tree)
|
|
58
59
|
};
|
|
59
60
|
// Generate common files shared by both protocols
|
|
@@ -165,10 +166,9 @@ export const tsAgentGenerator = async (tree, options)=>{
|
|
|
165
166
|
'aws4fetch'
|
|
166
167
|
]
|
|
167
168
|
]), withVersions([
|
|
168
|
-
// The chat CLI runs standalone via tsx for every protocol, and resolves
|
|
169
|
-
// the deployed agent from AppConfig when `RUNTIME_CONFIG_APP_ID` is set.
|
|
170
|
-
'tsx',
|
|
171
169
|
'@types/node',
|
|
170
|
+
// The chat CLI runs standalone via tsx and resolves the deployed agent
|
|
171
|
+
// from AppConfig when `RUNTIME_CONFIG_APP_ID` is set.
|
|
172
172
|
'agent-chat-cli',
|
|
173
173
|
'@aws-lambda-powertools/parameters',
|
|
174
174
|
'@aws-sdk/client-appconfigdata',
|
|
@@ -187,6 +187,9 @@ export const tsAgentGenerator = async (tree, options)=>{
|
|
|
187
187
|
'@types/ws',
|
|
188
188
|
'@types/cors'
|
|
189
189
|
]
|
|
190
|
+
]), joinPathFragments(project.root, 'package.json'));
|
|
191
|
+
addDependenciesToPackageJson(tree, {}, withVersions([
|
|
192
|
+
'tsx'
|
|
190
193
|
]));
|
|
191
194
|
// A2A servers use port 9000 as per the Strands A2A SDK default and AgentCore A2A contract.
|
|
192
195
|
// HTTP and AG-UI agents use port 8081+ to avoid conflict with VS Code server on 8080.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/agent/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n addDependenciesToPackageJson,\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { addAgentChatScripts } from '../../utils/agent-chat/agent-chat';\nimport {\n addTypeScriptFrameworkBase,\n ensureTypeScriptAgentConnectionProject,\n} from '../../utils/agent-connection/agent-connection';\nimport { addAgentInfra } from '../../utils/agent-core-constructs/agent-core-constructs';\nimport { addTypeScriptBundleTarget } from '../../utils/bundle/bundle';\nimport { resolveContainers } from '../../utils/containers';\nimport { addDockerScanTarget } from '../../utils/docker';\nimport { formatFilesInSubtree } from '../../utils/format';\nimport { FsCommands } from '../../utils/fs';\nimport { resolveIac } from '../../utils/iac';\nimport { installDependencies } from '../../utils/install';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics';\nimport { esmVars } from '../../utils/module-format';\nimport { kebabCase, toClassName } from '../../utils/names';\nimport { getNpmScope } from '../../utils/npm-scope';\nimport {\n addComponentDevTarget,\n addComponentGeneratorMetadata,\n addDependencyToTargetIfNotPresent,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../utils/nx';\nimport { sortObjectKeys } from '../../utils/object';\nimport { assignPort } from '../../utils/port';\nimport { sharedConstructsGenerator } from '../../utils/shared-constructs';\nimport { BASE_IMAGES, TS_VERSIONS, withVersions } from '../../utils/versions';\nimport type { TsAgentGeneratorSchema } from './schema';\n\nexport const TS_AGENT_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const tsAgentGenerator = async (\n tree: Tree,\n options: TsAgentGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const project = readProjectConfigurationUnqualified(tree, options.project);\n\n if (!tree.exists(joinPathFragments(project.root, 'tsconfig.json'))) {\n throw new Error(\n `Unsupported project ${options.project}. Expected a TypeScript project (with a tsconfig.json)`,\n );\n }\n\n const defaultName = `${kebabCase(project.name.split('/').pop())}-agent`;\n const name = kebabCase(options.name || defaultName);\n const agentNameClassName = toClassName(name);\n const agentTargetPrefix = options.name ? name : 'agent';\n const targetSourceDirRelativeToProjectRoot = joinPathFragments(\n 'src',\n agentTargetPrefix,\n );\n const targetSourceDir = joinPathFragments(\n project.root,\n targetSourceDirRelativeToProjectRoot,\n );\n const relativeSourceDir = targetSourceDir.replace(project.root + '/', './');\n const distDir = joinPathFragments('dist', project.root);\n\n const infra = options.infra ?? 'agentcore';\n const protocol = options.protocol ?? 'http';\n\n if (infra === 'none' && options.auth && options.auth !== 'iam') {\n console.warn(\n 'Warning: auth is ignored when no infrastructure is configured (no infrastructure is generated)',\n );\n }\n\n const auth = options.auth ?? 'iam';\n\n // Ensure the shared agent-connection project exists so the server entry\n // point can import `runWithSessionId` and propagate the AgentCore session\n // ID to any downstream MCP / A2A clients a later connection generator\n // wires into this agent.\n await ensureTypeScriptAgentConnectionProject(tree);\n // The agent server imports the framework base helpers (session cache + model\n // error logging) regardless of whether a connection client is wired in.\n await addTypeScriptFrameworkBase(tree);\n\n const templateContext = {\n name,\n agentNameClassName,\n distDir,\n agentConnectionImport: `:${getNpmScope(tree)}/agent-connection`,\n ...esmVars(tree),\n };\n\n // Generate common files shared by both protocols\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'common'),\n targetSourceDir,\n templateContext,\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // Generate protocol-specific files\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', protocol.toLowerCase()),\n targetSourceDir,\n templateContext,\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n if (infra === 'agentcore') {\n const containers = await resolveContainers(tree, 'inherit');\n const dockerImageTag = `${getNpmScope(tree)}-${name}:latest`;\n\n // Add bundle target\n await addTypeScriptBundleTarget(tree, project, {\n targetFilePath: `${targetSourceDirRelativeToProjectRoot}/index.ts`,\n bundleOutputDir: joinPathFragments('agent', name),\n });\n\n // Add the Dockerfile\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'deploy'),\n targetSourceDir,\n {\n distDir,\n name,\n protocol,\n adotVersion:\n TS_VERSIONS['@aws/aws-distro-opentelemetry-node-autoinstrumentation'],\n jaegerVersion: TS_VERSIONS['@opentelemetry/propagator-jaeger'],\n nodeBaseImage: BASE_IMAGES.node,\n npmVersion: TS_VERSIONS.npm,\n ...esmVars(tree),\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n const dockerOutputDir = joinPathFragments(\n 'dist',\n project.root,\n 'bundle',\n 'agent',\n name,\n );\n const dockerTargetName = `${agentTargetPrefix}-docker`;\n\n const fs = new FsCommands(tree);\n project.targets[dockerTargetName] = {\n cache: true,\n outputs: [`{workspaceRoot}/${dockerOutputDir}/Dockerfile`],\n executor: 'nx:run-commands',\n options: {\n commands: [\n fs.cp(\n `${targetSourceDir}/Dockerfile`,\n `${dockerOutputDir}/Dockerfile`,\n ),\n `${containers} build --platform linux/arm64 -t ${dockerImageTag} ${dockerOutputDir}`,\n ],\n parallel: false,\n },\n dependsOn: ['bundle'],\n };\n\n addDependencyToTargetIfNotPresent(project, 'docker', dockerTargetName);\n addDependencyToTargetIfNotPresent(project, 'build', 'docker');\n\n addDockerScanTarget(tree, {\n project,\n containerEngine: containers,\n trivyTargetName: `${agentTargetPrefix}-trivy`,\n dockerTargetName,\n imageTags: [dockerImageTag],\n });\n\n // Add shared constructs\n const iac = await resolveIac(tree, options.iac);\n await sharedConstructsGenerator(tree, { iac });\n\n // AG-UI uses HTTP as the AgentCore protocol type (AG-UI is HTTP-based with SSE over POST).\n const infraProtocol: 'http' | 'a2a' =\n protocol === 'ag-ui' ? 'http' : (protocol as 'http' | 'a2a');\n\n await addAgentInfra(tree, {\n agentNameKebabCase: name,\n agentNameClassName,\n projectName: project.name,\n dockerImageTag,\n dockerOutputDir,\n iac,\n auth,\n serverProtocol: infraProtocol,\n containers,\n });\n }\n\n // Add dependencies\n addDependenciesToPackageJson(\n tree,\n withVersions([\n 'zod',\n '@strands-agents/sdk',\n '@aws-sdk/credential-providers',\n '@aws-sdk/client-appconfigdata',\n '@aws-lambda-powertools/parameters',\n '@modelcontextprotocol/sdk',\n ...(protocol === 'a2a'\n ? (['express', '@a2a-js/sdk'] as const)\n : protocol === 'ag-ui'\n ? ([\n '@ag-ui/aws-strands',\n // @ag-ui/aws-strands declares these as peer dependencies but\n // statically imports them, so they must be installed for the\n // bundler to resolve and inline them into the runtime image.\n '@ag-ui/a2ui-toolkit',\n '@ag-ui/client',\n '@ag-ui/core',\n '@ag-ui/encoder',\n 'express',\n 'cors',\n ] as const)\n : ([\n '@trpc/server',\n '@trpc/client',\n 'ws',\n 'cors',\n 'aws4fetch',\n ] as const)),\n ]),\n withVersions([\n // The chat CLI runs standalone via tsx for every protocol, and resolves\n // the deployed agent from AppConfig when `RUNTIME_CONFIG_APP_ID` is set.\n 'tsx',\n '@types/node',\n 'agent-chat-cli',\n '@aws-lambda-powertools/parameters',\n '@aws-sdk/client-appconfigdata',\n ...(auth === 'iam'\n ? (['aws4fetch', '@aws-sdk/credential-providers'] as const)\n : ([] as const)),\n // A2A chat builds a signed @a2a-js client factory for the deployed agent.\n ...(protocol === 'a2a' ? (['@a2a-js/sdk'] as const) : ([] as const)),\n ...(protocol === 'a2a' || protocol === 'ag-ui'\n ? (['@types/express', '@types/cors'] as const)\n : (['@types/ws', '@types/cors'] as const)),\n ]),\n );\n\n // A2A servers use port 9000 as per the Strands A2A SDK default and AgentCore A2A contract.\n // HTTP and AG-UI agents use port 8081+ to avoid conflict with VS Code server on 8080.\n const localDevPortStart = protocol === 'a2a' ? 9000 : 8081;\n const localDevPort = assignPort(tree, project, localDevPortStart, {\n component: { info: TS_AGENT_GENERATOR_INFO, name: agentTargetPrefix },\n });\n\n // Every protocol gets a standalone `chat.ts`. It connects to the local\n // `dev` server by default, or to the deployed agent (with the\n // appropriate auth) when `RUNTIME_CONFIG_APP_ID` is set.\n const scriptsDir = joinPathFragments(\n project.root,\n 'scripts',\n agentTargetPrefix,\n );\n addAgentChatScripts(tree, {\n scriptsDir,\n protocol,\n language: 'ts',\n agentNameClassName,\n auth,\n relativeAgentImport: `../../${targetSourceDirRelativeToProjectRoot}`,\n });\n\n const chatUrl =\n protocol === 'http'\n ? `ws://localhost:${localDevPort}/ws`\n : protocol === 'ag-ui'\n ? `http://localhost:${localDevPort}/invocations`\n : `http://localhost:${localDevPort}`;\n const chatCommand = `tsx ./scripts/${agentTargetPrefix}/chat.ts`;\n\n const agentTargets = {\n ...project.targets,\n [`${agentTargetPrefix}-serve`]: {\n executor: 'nx:run-commands',\n continuous: true,\n options: {\n commands: [`tsx --watch ${relativeSourceDir}/index.ts`],\n cwd: '{projectRoot}',\n env: {\n PORT: `${localDevPort}`,\n },\n },\n },\n [`${agentTargetPrefix}-dev`]: {\n executor: 'nx:run-commands',\n continuous: true,\n options: {\n commands: [`tsx --watch ${relativeSourceDir}/index.ts`],\n cwd: '{projectRoot}',\n env: {\n PORT: `${localDevPort}`,\n LOCAL_DEV: 'true',\n },\n },\n },\n [`${agentTargetPrefix}-chat`]: {\n executor: 'nx:run-commands',\n options: {\n commands: [chatCommand],\n cwd: '{projectRoot}',\n env: {\n URL: chatUrl,\n },\n },\n },\n };\n\n // Aggregate `<agent>-dev` under the project-level `dev` target.\n addComponentDevTarget(agentTargets, `${agentTargetPrefix}-dev`);\n\n updateProjectConfiguration(tree, project.name, {\n ...project,\n // Sort targets so their order is stable regardless of insertion order on\n // first run vs re-run.\n targets: sortObjectKeys(agentTargets),\n });\n\n addComponentGeneratorMetadata(\n tree,\n project.name,\n TS_AGENT_GENERATOR_INFO,\n targetSourceDirRelativeToProjectRoot,\n agentTargetPrefix,\n { port: localDevPort, rc: agentNameClassName, auth, protocol },\n );\n\n await addGeneratorMetricsIfApplicable(tree, [TS_AGENT_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsAgentGenerator;\n"],"names":["addDependenciesToPackageJson","generateFiles","joinPathFragments","OverwriteStrategy","updateProjectConfiguration","addAgentChatScripts","addTypeScriptFrameworkBase","ensureTypeScriptAgentConnectionProject","addAgentInfra","addTypeScriptBundleTarget","resolveContainers","addDockerScanTarget","formatFilesInSubtree","FsCommands","resolveIac","installDependencies","addGeneratorMetricsIfApplicable","esmVars","kebabCase","toClassName","getNpmScope","addComponentDevTarget","addComponentGeneratorMetadata","addDependencyToTargetIfNotPresent","getGeneratorInfo","readProjectConfigurationUnqualified","sortObjectKeys","assignPort","sharedConstructsGenerator","BASE_IMAGES","TS_VERSIONS","withVersions","TS_AGENT_GENERATOR_INFO","filename","tsAgentGenerator","tree","options","project","exists","root","Error","defaultName","name","split","pop","agentNameClassName","agentTargetPrefix","targetSourceDirRelativeToProjectRoot","targetSourceDir","relativeSourceDir","replace","distDir","infra","protocol","auth","console","warn","templateContext","agentConnectionImport","dirname","overwriteStrategy","KeepExisting","toLowerCase","containers","dockerImageTag","targetFilePath","bundleOutputDir","adotVersion","jaegerVersion","nodeBaseImage","node","npmVersion","npm","dockerOutputDir","dockerTargetName","fs","targets","cache","outputs","executor","commands","cp","parallel","dependsOn","containerEngine","trivyTargetName","imageTags","iac","infraProtocol","agentNameKebabCase","projectName","serverProtocol","localDevPortStart","localDevPort","component","info","scriptsDir","language","relativeAgentImport","chatUrl","chatCommand","agentTargets","continuous","cwd","env","PORT","LOCAL_DEV","URL","port","rc","preferInstallDependencies","languages"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/agent/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { addAgentChatScripts } from '../../utils/agent-chat/agent-chat';\nimport {\n addTypeScriptFrameworkBase,\n ensureTypeScriptAgentConnectionProject,\n} from '../../utils/agent-connection/agent-connection';\nimport { addAgentInfra } from '../../utils/agent-core-constructs/agent-core-constructs';\nimport { addTypeScriptBundleTarget } from '../../utils/bundle/bundle';\nimport { resolveContainers } from '../../utils/containers';\nimport { addDependenciesToPackageJson } from '../../utils/dependencies';\nimport { addDockerScanTarget } from '../../utils/docker';\nimport { formatFilesInSubtree } from '../../utils/format';\nimport { FsCommands } from '../../utils/fs';\nimport { resolveIac } from '../../utils/iac';\nimport { installDependencies } from '../../utils/install';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics';\nimport { esmVars } from '../../utils/module-format';\nimport { kebabCase, toClassName } from '../../utils/names';\nimport { getNpmScope } from '../../utils/npm-scope';\nimport {\n addComponentDevTarget,\n addComponentGeneratorMetadata,\n addDependencyToTargetIfNotPresent,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../utils/nx';\nimport { sortObjectKeys } from '../../utils/object';\nimport { assignPort } from '../../utils/port';\nimport { sharedConstructsGenerator } from '../../utils/shared-constructs';\nimport { BASE_IMAGES, TS_VERSIONS, withVersions } from '../../utils/versions';\nimport type { TsAgentGeneratorSchema } from './schema';\n\nexport const TS_AGENT_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const tsAgentGenerator = async (\n tree: Tree,\n options: TsAgentGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const project = readProjectConfigurationUnqualified(tree, options.project);\n\n if (!tree.exists(joinPathFragments(project.root, 'tsconfig.json'))) {\n throw new Error(\n `Unsupported project ${options.project}. Expected a TypeScript project (with a tsconfig.json)`,\n );\n }\n\n const defaultName = `${kebabCase(project.name.split('/').pop())}-agent`;\n const name = kebabCase(options.name || defaultName);\n const agentNameClassName = toClassName(name);\n const agentTargetPrefix = options.name ? name : 'agent';\n const targetSourceDirRelativeToProjectRoot = joinPathFragments(\n 'src',\n agentTargetPrefix,\n );\n const targetSourceDir = joinPathFragments(\n project.root,\n targetSourceDirRelativeToProjectRoot,\n );\n const relativeSourceDir = targetSourceDir.replace(project.root + '/', './');\n const distDir = joinPathFragments('dist', project.root);\n\n const infra = options.infra ?? 'agentcore';\n const protocol = options.protocol ?? 'http';\n\n if (infra === 'none' && options.auth && options.auth !== 'iam') {\n console.warn(\n 'Warning: auth is ignored when no infrastructure is configured (no infrastructure is generated)',\n );\n }\n\n const auth = options.auth ?? 'iam';\n\n // Ensure the shared agent-connection project exists so the server entry\n // point can import `runWithSessionId` and propagate the AgentCore session\n // ID to any downstream MCP / A2A clients a later connection generator\n // wires into this agent.\n await ensureTypeScriptAgentConnectionProject(tree);\n // The agent server imports the framework base helpers (session cache + model\n // error logging) regardless of whether a connection client is wired in.\n await addTypeScriptFrameworkBase(tree);\n\n const templateContext = {\n name,\n agentNameClassName,\n distDir,\n agentConnectionImport: `@${getNpmScope(tree)}/agent-connection`,\n ...esmVars(tree),\n };\n\n // Generate common files shared by both protocols\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'common'),\n targetSourceDir,\n templateContext,\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // Generate protocol-specific files\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', protocol.toLowerCase()),\n targetSourceDir,\n templateContext,\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n if (infra === 'agentcore') {\n const containers = await resolveContainers(tree, 'inherit');\n const dockerImageTag = `${getNpmScope(tree)}-${name}:latest`;\n\n // Add bundle target\n await addTypeScriptBundleTarget(tree, project, {\n targetFilePath: `${targetSourceDirRelativeToProjectRoot}/index.ts`,\n bundleOutputDir: joinPathFragments('agent', name),\n });\n\n // Add the Dockerfile\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'deploy'),\n targetSourceDir,\n {\n distDir,\n name,\n protocol,\n adotVersion:\n TS_VERSIONS['@aws/aws-distro-opentelemetry-node-autoinstrumentation'],\n jaegerVersion: TS_VERSIONS['@opentelemetry/propagator-jaeger'],\n nodeBaseImage: BASE_IMAGES.node,\n npmVersion: TS_VERSIONS.npm,\n ...esmVars(tree),\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n const dockerOutputDir = joinPathFragments(\n 'dist',\n project.root,\n 'bundle',\n 'agent',\n name,\n );\n const dockerTargetName = `${agentTargetPrefix}-docker`;\n\n const fs = new FsCommands(tree);\n project.targets[dockerTargetName] = {\n cache: true,\n outputs: [`{workspaceRoot}/${dockerOutputDir}/Dockerfile`],\n executor: 'nx:run-commands',\n options: {\n commands: [\n fs.cp(\n `${targetSourceDir}/Dockerfile`,\n `${dockerOutputDir}/Dockerfile`,\n ),\n `${containers} build --platform linux/arm64 -t ${dockerImageTag} ${dockerOutputDir}`,\n ],\n parallel: false,\n },\n dependsOn: ['bundle'],\n };\n\n addDependencyToTargetIfNotPresent(project, 'docker', dockerTargetName);\n addDependencyToTargetIfNotPresent(project, 'build', 'docker');\n\n addDockerScanTarget(tree, {\n project,\n containerEngine: containers,\n trivyTargetName: `${agentTargetPrefix}-trivy`,\n dockerTargetName,\n imageTags: [dockerImageTag],\n });\n\n // Add shared constructs\n const iac = await resolveIac(tree, options.iac);\n await sharedConstructsGenerator(tree, { iac });\n\n // AG-UI uses HTTP as the AgentCore protocol type (AG-UI is HTTP-based with SSE over POST).\n const infraProtocol: 'http' | 'a2a' =\n protocol === 'ag-ui' ? 'http' : (protocol as 'http' | 'a2a');\n\n await addAgentInfra(tree, {\n agentNameKebabCase: name,\n agentNameClassName,\n projectName: project.name,\n dockerImageTag,\n dockerOutputDir,\n iac,\n auth,\n serverProtocol: infraProtocol,\n containers,\n });\n }\n\n // Add dependencies\n addDependenciesToPackageJson(\n tree,\n withVersions([\n 'zod',\n '@strands-agents/sdk',\n '@aws-sdk/credential-providers',\n '@aws-sdk/client-appconfigdata',\n '@aws-lambda-powertools/parameters',\n '@modelcontextprotocol/sdk',\n ...(protocol === 'a2a'\n ? (['express', '@a2a-js/sdk'] as const)\n : protocol === 'ag-ui'\n ? ([\n '@ag-ui/aws-strands',\n // @ag-ui/aws-strands declares these as peer dependencies but\n // statically imports them, so they must be installed for the\n // bundler to resolve and inline them into the runtime image.\n '@ag-ui/a2ui-toolkit',\n '@ag-ui/client',\n '@ag-ui/core',\n '@ag-ui/encoder',\n 'express',\n 'cors',\n ] as const)\n : ([\n '@trpc/server',\n '@trpc/client',\n 'ws',\n 'cors',\n 'aws4fetch',\n ] as const)),\n ]),\n withVersions([\n '@types/node',\n // The chat CLI runs standalone via tsx and resolves the deployed agent\n // from AppConfig when `RUNTIME_CONFIG_APP_ID` is set.\n 'agent-chat-cli',\n '@aws-lambda-powertools/parameters',\n '@aws-sdk/client-appconfigdata',\n ...(auth === 'iam'\n ? (['aws4fetch', '@aws-sdk/credential-providers'] as const)\n : ([] as const)),\n // A2A chat builds a signed @a2a-js client factory for the deployed agent.\n ...(protocol === 'a2a' ? (['@a2a-js/sdk'] as const) : ([] as const)),\n ...(protocol === 'a2a' || protocol === 'ag-ui'\n ? (['@types/express', '@types/cors'] as const)\n : (['@types/ws', '@types/cors'] as const)),\n ]),\n joinPathFragments(project.root, 'package.json'),\n );\n addDependenciesToPackageJson(tree, {}, withVersions(['tsx']));\n\n // A2A servers use port 9000 as per the Strands A2A SDK default and AgentCore A2A contract.\n // HTTP and AG-UI agents use port 8081+ to avoid conflict with VS Code server on 8080.\n const localDevPortStart = protocol === 'a2a' ? 9000 : 8081;\n const localDevPort = assignPort(tree, project, localDevPortStart, {\n component: { info: TS_AGENT_GENERATOR_INFO, name: agentTargetPrefix },\n });\n\n // Every protocol gets a standalone `chat.ts`. It connects to the local\n // `dev` server by default, or to the deployed agent (with the\n // appropriate auth) when `RUNTIME_CONFIG_APP_ID` is set.\n const scriptsDir = joinPathFragments(\n project.root,\n 'scripts',\n agentTargetPrefix,\n );\n addAgentChatScripts(tree, {\n scriptsDir,\n protocol,\n language: 'ts',\n agentNameClassName,\n auth,\n relativeAgentImport: `../../${targetSourceDirRelativeToProjectRoot}`,\n });\n\n const chatUrl =\n protocol === 'http'\n ? `ws://localhost:${localDevPort}/ws`\n : protocol === 'ag-ui'\n ? `http://localhost:${localDevPort}/invocations`\n : `http://localhost:${localDevPort}`;\n const chatCommand = `tsx ./scripts/${agentTargetPrefix}/chat.ts`;\n\n const agentTargets = {\n ...project.targets,\n [`${agentTargetPrefix}-serve`]: {\n executor: 'nx:run-commands',\n continuous: true,\n options: {\n commands: [`tsx --watch ${relativeSourceDir}/index.ts`],\n cwd: '{projectRoot}',\n env: {\n PORT: `${localDevPort}`,\n },\n },\n },\n [`${agentTargetPrefix}-dev`]: {\n executor: 'nx:run-commands',\n continuous: true,\n options: {\n commands: [`tsx --watch ${relativeSourceDir}/index.ts`],\n cwd: '{projectRoot}',\n env: {\n PORT: `${localDevPort}`,\n LOCAL_DEV: 'true',\n },\n },\n },\n [`${agentTargetPrefix}-chat`]: {\n executor: 'nx:run-commands',\n options: {\n commands: [chatCommand],\n cwd: '{projectRoot}',\n env: {\n URL: chatUrl,\n },\n },\n },\n };\n\n // Aggregate `<agent>-dev` under the project-level `dev` target.\n addComponentDevTarget(agentTargets, `${agentTargetPrefix}-dev`);\n\n updateProjectConfiguration(tree, project.name, {\n ...project,\n // Sort targets so their order is stable regardless of insertion order on\n // first run vs re-run.\n targets: sortObjectKeys(agentTargets),\n });\n\n addComponentGeneratorMetadata(\n tree,\n project.name,\n TS_AGENT_GENERATOR_INFO,\n targetSourceDirRelativeToProjectRoot,\n agentTargetPrefix,\n { port: localDevPort, rc: agentNameClassName, auth, protocol },\n );\n\n await addGeneratorMetricsIfApplicable(tree, [TS_AGENT_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsAgentGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateProjectConfiguration","addAgentChatScripts","addTypeScriptFrameworkBase","ensureTypeScriptAgentConnectionProject","addAgentInfra","addTypeScriptBundleTarget","resolveContainers","addDependenciesToPackageJson","addDockerScanTarget","formatFilesInSubtree","FsCommands","resolveIac","installDependencies","addGeneratorMetricsIfApplicable","esmVars","kebabCase","toClassName","getNpmScope","addComponentDevTarget","addComponentGeneratorMetadata","addDependencyToTargetIfNotPresent","getGeneratorInfo","readProjectConfigurationUnqualified","sortObjectKeys","assignPort","sharedConstructsGenerator","BASE_IMAGES","TS_VERSIONS","withVersions","TS_AGENT_GENERATOR_INFO","filename","tsAgentGenerator","tree","options","project","exists","root","Error","defaultName","name","split","pop","agentNameClassName","agentTargetPrefix","targetSourceDirRelativeToProjectRoot","targetSourceDir","relativeSourceDir","replace","distDir","infra","protocol","auth","console","warn","templateContext","agentConnectionImport","dirname","overwriteStrategy","KeepExisting","toLowerCase","containers","dockerImageTag","targetFilePath","bundleOutputDir","adotVersion","jaegerVersion","nodeBaseImage","node","npmVersion","npm","dockerOutputDir","dockerTargetName","fs","targets","cache","outputs","executor","commands","cp","parallel","dependsOn","containerEngine","trivyTargetName","imageTags","iac","infraProtocol","agentNameKebabCase","projectName","serverProtocol","localDevPortStart","localDevPort","component","info","scriptsDir","language","relativeAgentImport","chatUrl","chatCommand","agentTargets","continuous","cwd","env","PORT","LOCAL_DEV","URL","port","rc","preferInstallDependencies","languages"],"mappings":"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"}
|
|
@@ -243,7 +243,7 @@ export class InventoryMcpClientStrands {
|
|
|
243
243
|
`;
|
|
244
244
|
|
|
245
245
|
exports[`ts#agent#mcp-connection generator > should match snapshot for agent-connection src files > transformed-agent.ts 1`] = `
|
|
246
|
-
"import { InventoryMcpClientStrands } from '
|
|
246
|
+
"import { InventoryMcpClientStrands } from '@proj/agent-connection';
|
|
247
247
|
import { Agent, tool } from '@strands-agents/sdk';
|
|
248
248
|
import { z } from 'zod';
|
|
249
249
|
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
3
|
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
*/ import {
|
|
4
|
+
*/ import { generateFiles, joinPathFragments, OverwriteStrategy, updateProjectConfiguration } from "@nx/devkit";
|
|
5
5
|
import { AGENT_CONNECTION_PROJECT_DIR, addTypeScriptClientToAgent, addTypeScriptCoreClient, ensureTypeScriptAgentConnectionProject } from "../../../utils/agent-connection/agent-connection.js";
|
|
6
6
|
import { addDestructuredImport, addStarExport } from "../../../utils/ast.js";
|
|
7
|
+
import { addDependenciesToPackageJson } from "../../../utils/dependencies.js";
|
|
7
8
|
import { formatFilesInSubtree } from "../../../utils/format.js";
|
|
8
9
|
import { installDependencies } from "../../../utils/install.js";
|
|
9
10
|
import { addGeneratorMetricsIfApplicable } from "../../../utils/metrics.js";
|
|
@@ -52,7 +53,7 @@ export const tsAgentMcpConnectionGenerator = async (tree, options)=>{
|
|
|
52
53
|
// Add import for the client
|
|
53
54
|
await addDestructuredImport(tree, agentFilePath, [
|
|
54
55
|
clientClassName
|
|
55
|
-
],
|
|
56
|
+
], `@${npmScope}/agent-connection`);
|
|
56
57
|
await addTypeScriptClientToAgent(tree, agentFilePath, clientClassName, clientVarName);
|
|
57
58
|
}
|
|
58
59
|
// 4. Set up dev target
|
|
@@ -76,7 +77,7 @@ export const tsAgentMcpConnectionGenerator = async (tree, options)=>{
|
|
|
76
77
|
'@aws-sdk/client-appconfigdata',
|
|
77
78
|
'aws4fetch',
|
|
78
79
|
'@aws-sdk/credential-providers'
|
|
79
|
-
]), {});
|
|
80
|
+
]), {}, joinPathFragments(sourceProject.root, 'package.json'));
|
|
80
81
|
await addGeneratorMetricsIfApplicable(tree, [
|
|
81
82
|
TS_AGENT_MCP_CONNECTION_GENERATOR_INFO
|
|
82
83
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../packages/nx-plugin/src/ts/agent/mcp-connection/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n
|
|
1
|
+
{"version":3,"sources":["../../../../../../../packages/nx-plugin/src/ts/agent/mcp-connection/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport {\n AGENT_CONNECTION_PROJECT_DIR,\n addTypeScriptClientToAgent,\n addTypeScriptCoreClient,\n ensureTypeScriptAgentConnectionProject,\n} from '../../../utils/agent-connection/agent-connection';\nimport { addDestructuredImport, addStarExport } from '../../../utils/ast';\nimport { addDependenciesToPackageJson } from '../../../utils/dependencies';\nimport { formatFilesInSubtree } from '../../../utils/format';\nimport { installDependencies } from '../../../utils/install';\nimport { addGeneratorMetricsIfApplicable } from '../../../utils/metrics';\nimport { esmVars } from '../../../utils/module-format';\nimport { kebabCase } from '../../../utils/names';\nimport { getNpmScope } from '../../../utils/npm-scope';\nimport {\n addDependencyToTargetIfNotPresent,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../../utils/nx';\nimport { withVersions } from '../../../utils/versions';\nimport type { TsAgentMcpConnectionGeneratorSchema } from './schema';\n\nexport const TS_AGENT_MCP_CONNECTION_GENERATOR_INFO: NxGeneratorInfo =\n getGeneratorInfo(import.meta.filename);\n\nexport const tsAgentMcpConnectionGenerator = async (\n tree: Tree,\n options: TsAgentMcpConnectionGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const sourceProject = readProjectConfigurationUnqualified(\n tree,\n options.sourceProject,\n );\n const targetProject = readProjectConfigurationUnqualified(\n tree,\n options.targetProject,\n );\n\n const agentComponent = options.sourceComponent;\n const mcpComponent = options.targetComponent;\n\n if (!agentComponent || !mcpComponent) {\n throw new Error(\n 'Both sourceComponent and targetComponent must be provided for ts#agent -> mcp connections',\n );\n }\n\n if (mcpComponent.auth && mcpComponent.auth.toLowerCase() !== 'iam') {\n throw new Error(\n `MCP server connection currently only supports IAM authentication, but '${mcpComponent.name}' uses '${mcpComponent.auth}' authentication.`,\n );\n }\n\n const mcpComponentName = mcpComponent.name ?? 'mcp-server';\n const mcpServerClassName = mcpComponent.rc as string;\n const mcpServerKebabCase = kebabCase(mcpServerClassName);\n const mcpServerPort = mcpComponent.port ?? 8000;\n\n const npmScope = getNpmScope(tree);\n\n // 1. Ensure the shared agent-connection project exists + has the MCP core client\n await ensureTypeScriptAgentConnectionProject(tree);\n await addTypeScriptCoreClient(tree, 'mcp');\n\n // 2. Generate the per-connection <Name>Client into app/\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'agent-connection', 'app'),\n joinPathFragments(AGENT_CONNECTION_PROJECT_DIR, 'src', 'app'),\n {\n mcpServerKebabCase,\n mcpServerClassName,\n mcpServerPort,\n ...esmVars(tree),\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // Add re-export to index.ts\n await addStarExport(\n tree,\n joinPathFragments(AGENT_CONNECTION_PROJECT_DIR, 'src', 'index.ts'),\n `./app/${mcpServerKebabCase}-client-strands.js`,\n );\n\n // 3. AST transform agent.ts to add MCP tools\n const agentSourceDir = joinPathFragments(\n sourceProject.root,\n agentComponent.path ?? 'src',\n );\n const agentFilePath = joinPathFragments(agentSourceDir, 'agent.ts');\n\n if (tree.exists(agentFilePath)) {\n const clientClassName = `${mcpServerClassName}ClientStrands`;\n const clientVarName =\n mcpServerClassName.charAt(0).toLowerCase() + mcpServerClassName.slice(1);\n\n // Add import for the client\n await addDestructuredImport(\n tree,\n agentFilePath,\n [clientClassName],\n `@${npmScope}/agent-connection`,\n );\n\n await addTypeScriptClientToAgent(\n tree,\n agentFilePath,\n clientClassName,\n clientVarName,\n );\n }\n\n // 4. Set up dev target\n const agentName = agentComponent.name ?? 'agent';\n const devTargetName = `${agentName}-dev`;\n const mcpDevTargetName = `${mcpComponentName}-dev`;\n\n if (sourceProject.targets?.[devTargetName]) {\n addDependencyToTargetIfNotPresent(sourceProject, devTargetName, {\n projects: [targetProject.name],\n target: mcpDevTargetName,\n });\n updateProjectConfiguration(tree, sourceProject.name, sourceProject);\n }\n\n // 5. Add dependencies required by the MCP core client + vended client\n addDependenciesToPackageJson(\n tree,\n withVersions([\n '@modelcontextprotocol/sdk',\n '@strands-agents/sdk',\n '@aws-lambda-powertools/parameters',\n '@aws-sdk/client-appconfigdata',\n 'aws4fetch',\n '@aws-sdk/credential-providers',\n ]),\n {},\n joinPathFragments(sourceProject.root, 'package.json'),\n );\n\n await addGeneratorMetricsIfApplicable(tree, [\n TS_AGENT_MCP_CONNECTION_GENERATOR_INFO,\n ]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsAgentMcpConnectionGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateProjectConfiguration","AGENT_CONNECTION_PROJECT_DIR","addTypeScriptClientToAgent","addTypeScriptCoreClient","ensureTypeScriptAgentConnectionProject","addDestructuredImport","addStarExport","addDependenciesToPackageJson","formatFilesInSubtree","installDependencies","addGeneratorMetricsIfApplicable","esmVars","kebabCase","getNpmScope","addDependencyToTargetIfNotPresent","getGeneratorInfo","readProjectConfigurationUnqualified","withVersions","TS_AGENT_MCP_CONNECTION_GENERATOR_INFO","filename","tsAgentMcpConnectionGenerator","tree","options","sourceProject","targetProject","agentComponent","sourceComponent","mcpComponent","targetComponent","Error","auth","toLowerCase","name","mcpComponentName","mcpServerClassName","rc","mcpServerKebabCase","mcpServerPort","port","npmScope","dirname","overwriteStrategy","KeepExisting","agentSourceDir","root","path","agentFilePath","exists","clientClassName","clientVarName","charAt","slice","agentName","devTargetName","mcpDevTargetName","targets","projects","target","preferInstallDependencies","languages"],"mappings":"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"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
3
|
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
*/ import {
|
|
4
|
+
*/ import { generateFiles, joinPathFragments, OverwriteStrategy, updateJson } from "@nx/devkit";
|
|
5
5
|
import { addAgentRuntimeToConnectionNamespace } from "../../../connection/agent-runtime-config.js";
|
|
6
6
|
import { addSingleImport, applyGritQL } from "../../../utils/ast.js";
|
|
7
|
+
import { addDependenciesToPackageJson } from "../../../utils/dependencies.js";
|
|
7
8
|
import { formatFilesInSubtree } from "../../../utils/format.js";
|
|
8
9
|
import { installDependencies } from "../../../utils/install.js";
|
|
9
10
|
import { addGeneratorMetricsIfApplicable } from "../../../utils/metrics.js";
|
|
10
11
|
import { kebabCase, toClassName } from "../../../utils/names.js";
|
|
11
|
-
import { toScopeAlias } from "../../../utils/npm-scope.js";
|
|
12
12
|
import { getGeneratorInfo, readProjectConfigurationUnqualified } from "../../../utils/nx.js";
|
|
13
13
|
import { withVersions } from "../../../utils/versions.js";
|
|
14
14
|
import { addAgUiReactConnection } from "../../react-website/agui/generator.js";
|
|
@@ -25,7 +25,7 @@ export async function tsAgentReactConnectionGenerator(tree, options) {
|
|
|
25
25
|
const agentNameClassName = targetComponent?.rc ?? toClassName(agentName);
|
|
26
26
|
const agentPort = targetComponent?.port ?? metadata?.ports?.[0] ?? 8081;
|
|
27
27
|
const auth = (targetComponent?.auth ?? metadata?.auth ?? 'iam').toLowerCase();
|
|
28
|
-
const agentProjectAlias =
|
|
28
|
+
const agentProjectAlias = agentProjectConfig.name;
|
|
29
29
|
const agentPath = targetComponent?.path ?? 'src/agent';
|
|
30
30
|
if ((targetComponent?.protocol ?? '').toLowerCase() === 'a2a') {
|
|
31
31
|
throw new Error(`Cannot connect a React website to an A2A agent. ` + `Consider generating an agent with the HTTP or AG-UI protocol instead.`);
|
|
@@ -116,7 +116,7 @@ export async function tsAgentReactConnectionGenerator(tree, options) {
|
|
|
116
116
|
] : []
|
|
117
117
|
]), withVersions([
|
|
118
118
|
'@smithy/types'
|
|
119
|
-
]));
|
|
119
|
+
]), joinPathFragments(frontendProjectConfig.root, 'package.json'));
|
|
120
120
|
await addGeneratorMetricsIfApplicable(tree, [
|
|
121
121
|
TS_AGENT_REACT_CONNECTION_GENERATOR_INFO
|
|
122
122
|
]);
|
|
@@ -130,29 +130,20 @@ export async function tsAgentReactConnectionGenerator(tree, options) {
|
|
|
130
130
|
export default tsAgentReactConnectionGenerator;
|
|
131
131
|
/**
|
|
132
132
|
* Ensures a wildcard path entry exists in tsconfig.base.json for the given project,
|
|
133
|
-
* allowing deep imports (e.g.,
|
|
134
|
-
* Both the scope alias and npm package name forms are added.
|
|
133
|
+
* allowing deep imports (e.g., `@scope/project/src/agent/router.js`).
|
|
135
134
|
*/ function ensureWildcardPathEntry(tree, projectName, projectRoot) {
|
|
136
135
|
const tsconfigPath = [
|
|
137
136
|
'tsconfig.base.json',
|
|
138
137
|
'tsconfig.json'
|
|
139
138
|
].find((p)=>tree.exists(p));
|
|
140
139
|
if (!tsconfigPath) return;
|
|
141
|
-
const wildcardValue = [
|
|
142
|
-
`./${projectRoot}/*`
|
|
143
|
-
];
|
|
144
|
-
const scopeAlias = toScopeAlias(projectName);
|
|
145
140
|
updateJson(tree, tsconfigPath, (json)=>{
|
|
146
141
|
const paths = json.compilerOptions?.paths ?? {};
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
// Also add wildcard for the npm package name
|
|
153
|
-
const npmWildcardKey = `${projectName}/*`;
|
|
154
|
-
if (!paths[npmWildcardKey]) {
|
|
155
|
-
paths[npmWildcardKey] = wildcardValue;
|
|
142
|
+
const wildcardKey = `${projectName}/*`;
|
|
143
|
+
if (!paths[wildcardKey]) {
|
|
144
|
+
paths[wildcardKey] = [
|
|
145
|
+
`./${projectRoot}/*`
|
|
146
|
+
];
|
|
156
147
|
}
|
|
157
148
|
json.compilerOptions = {
|
|
158
149
|
...json.compilerOptions,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../packages/nx-plugin/src/ts/agent/react-connection/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n addDependenciesToPackageJson,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateJson,\n} from '@nx/devkit';\nimport { addAgentRuntimeToConnectionNamespace } from '../../../connection/agent-runtime-config';\nimport type { ResolvedConnectionOptions } from '../../../connection/generator';\nimport { addSingleImport, applyGritQL } from '../../../utils/ast';\nimport { formatFilesInSubtree } from '../../../utils/format';\nimport { installDependencies } from '../../../utils/install';\nimport { addGeneratorMetricsIfApplicable } from '../../../utils/metrics';\nimport { kebabCase, toClassName } from '../../../utils/names';\nimport { toScopeAlias } from '../../../utils/npm-scope';\nimport {\n type ComponentMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../../utils/nx';\nimport { withVersions } from '../../../utils/versions';\nimport {\n type AgUiAuth,\n addAgUiReactConnection,\n} from '../../react-website/agui/generator';\nimport { runtimeConfigGenerator } from '../../react-website/runtime-config/generator';\nimport { addTsAgentTargetToLocalDev } from './local-dev';\n\nexport const TS_AGENT_REACT_CONNECTION_GENERATOR_INFO: NxGeneratorInfo =\n getGeneratorInfo(import.meta.filename);\n\nexport async function tsAgentReactConnectionGenerator(\n tree: Tree,\n options: ResolvedConnectionOptions,\n) {\n const frontendProjectConfig = readProjectConfigurationUnqualified(\n tree,\n options.sourceProject,\n );\n const agentProjectConfig = readProjectConfigurationUnqualified(\n tree,\n options.targetProject,\n );\n\n const targetComponent: ComponentMetadata | undefined =\n options.targetComponent;\n\n // Extract agent metadata from the target component or project metadata\n const metadata = agentProjectConfig.metadata as any;\n const agentName = targetComponent?.name ?? 'agent';\n const agentNameClassName = targetComponent?.rc ?? toClassName(agentName);\n const agentPort = targetComponent?.port ?? metadata?.ports?.[0] ?? 8081;\n const auth = (targetComponent?.auth ?? metadata?.auth ?? 'iam').toLowerCase();\n const agentProjectAlias = toScopeAlias(agentProjectConfig.name);\n const agentPath = targetComponent?.path ?? 'src/agent';\n\n if ((targetComponent?.protocol ?? '').toLowerCase() === 'a2a') {\n throw new Error(\n `Cannot connect a React website to an A2A agent. ` +\n `Consider generating an agent with the HTTP or AG-UI protocol instead.`,\n );\n }\n\n if (targetComponent?.protocol === 'ag-ui') {\n await addAgUiReactConnection(tree, {\n frontendProjectConfig,\n agentName,\n agentNameClassName,\n auth: auth as AgUiAuth,\n });\n\n await addTsAgentTargetToLocalDev(\n tree,\n frontendProjectConfig.name,\n agentProjectConfig.name,\n {\n agentName,\n agentNameClassName,\n port: agentPort,\n targetComponent,\n },\n );\n\n await addGeneratorMetricsIfApplicable(tree, [\n TS_AGENT_REACT_CONNECTION_GENERATOR_INFO,\n ]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n }\n\n // Ensure the agent project has a wildcard path entry in tsconfig.base.json\n // so that deep imports (e.g., for the router type) resolve correctly\n ensureWildcardPathEntry(\n tree,\n agentProjectConfig.name,\n agentProjectConfig.root,\n );\n\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files'),\n frontendProjectConfig.root,\n {\n agentName,\n agentNameClassName,\n auth,\n agentProjectAlias,\n agentPath,\n },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n // Generate the tanstack query provider if it does not exist already\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n '../../../utils/files/website/components/tanstack-query',\n ),\n joinPathFragments(frontendProjectConfig.sourceRoot, 'components'),\n {},\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n if (auth === 'iam') {\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n '../../../utils/files/website/hooks/sigv4',\n ),\n joinPathFragments(frontendProjectConfig.sourceRoot, 'hooks'),\n {},\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n }\n\n await runtimeConfigGenerator(tree, {\n project: frontendProjectConfig.name,\n preferInstallDependencies: false,\n });\n\n // update main.tsx\n const mainTsxPath = joinPathFragments(\n frontendProjectConfig.sourceRoot,\n 'main.tsx',\n );\n await addSingleImport(\n tree,\n mainTsxPath,\n 'QueryClientProvider',\n './components/QueryClientProvider',\n );\n\n const clientProviderName = `${agentNameClassName}AgentClientProvider`;\n await addSingleImport(\n tree,\n mainTsxPath,\n clientProviderName,\n `./components/${clientProviderName}`,\n );\n\n // Wrap <App /> in QueryClientProvider if not already present\n await applyGritQL(\n tree,\n mainTsxPath,\n '`<App />` => `<QueryClientProvider><App /></QueryClientProvider>` where { $program <: not contains `<QueryClientProvider>$_</QueryClientProvider>` }',\n );\n\n // Wrap <App /> in the agent client provider if not already present\n await applyGritQL(\n tree,\n mainTsxPath,\n `\\`<App />\\` => \\`<${clientProviderName}><App /></${clientProviderName}>\\` where { $program <: not contains \\`<${clientProviderName}>$_</${clientProviderName}>\\` }`,\n );\n\n await addTsAgentTargetToLocalDev(\n tree,\n frontendProjectConfig.name,\n agentProjectConfig.name,\n {\n agentName,\n agentNameClassName,\n port: agentPort,\n targetComponent,\n },\n );\n\n // Expose the agent's runtime ARN to the frontend via the 'connection'\n // namespace (which is published to runtime-config.json). The agent construct\n // itself only registers to the 'agentcore' namespace by default.\n await addAgentRuntimeToConnectionNamespace(tree, {\n agentNameKebabCase: kebabCase(agentNameClassName),\n agentNameClassName,\n });\n\n addDependenciesToPackageJson(\n tree,\n withVersions([\n '@trpc/client',\n '@tanstack/react-query',\n '@tanstack/react-query-devtools',\n '@trpc/tanstack-react-query',\n ...((auth === 'iam'\n ? [\n 'oidc-client-ts',\n 'aws4fetch',\n '@aws-sdk/credential-provider-cognito-identity',\n 'react-oidc-context',\n ]\n : []) as any),\n ...((auth === 'cognito' ? ['react-oidc-context'] : []) as any),\n ]),\n withVersions(['@smithy/types']),\n );\n\n await addGeneratorMetricsIfApplicable(tree, [\n TS_AGENT_REACT_CONNECTION_GENERATOR_INFO,\n ]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n}\nexport default tsAgentReactConnectionGenerator;\n\n/**\n * Ensures a wildcard path entry exists in tsconfig.base.json for the given project,\n * allowing deep imports (e.g., `:scope/project/src/agent/router.js`).\n * Both the scope alias and npm package name forms are added.\n */\nfunction ensureWildcardPathEntry(\n tree: Tree,\n projectName: string,\n projectRoot: string,\n) {\n const tsconfigPath = ['tsconfig.base.json', 'tsconfig.json'].find((p) =>\n tree.exists(p),\n );\n if (!tsconfigPath) return;\n\n const wildcardValue = [`./${projectRoot}/*`];\n const scopeAlias = toScopeAlias(projectName);\n\n updateJson(tree, tsconfigPath, (json) => {\n const paths = json.compilerOptions?.paths ?? {};\n // Add wildcard for the scope alias (used by generated templates)\n const scopeWildcardKey = `${scopeAlias}/*`;\n if (!paths[scopeWildcardKey]) {\n paths[scopeWildcardKey] = wildcardValue;\n }\n // Also add wildcard for the npm package name\n const npmWildcardKey = `${projectName}/*`;\n if (!paths[npmWildcardKey]) {\n paths[npmWildcardKey] = wildcardValue;\n }\n json.compilerOptions = {\n ...json.compilerOptions,\n paths,\n };\n return json;\n });\n}\n"],"names":["addDependenciesToPackageJson","generateFiles","joinPathFragments","OverwriteStrategy","updateJson","addAgentRuntimeToConnectionNamespace","addSingleImport","applyGritQL","formatFilesInSubtree","installDependencies","addGeneratorMetricsIfApplicable","kebabCase","toClassName","toScopeAlias","getGeneratorInfo","readProjectConfigurationUnqualified","withVersions","addAgUiReactConnection","runtimeConfigGenerator","addTsAgentTargetToLocalDev","TS_AGENT_REACT_CONNECTION_GENERATOR_INFO","filename","tsAgentReactConnectionGenerator","tree","options","frontendProjectConfig","sourceProject","agentProjectConfig","targetProject","targetComponent","metadata","agentName","name","agentNameClassName","rc","agentPort","port","ports","auth","toLowerCase","agentProjectAlias","agentPath","path","protocol","Error","preferInstallDependencies","languages","ensureWildcardPathEntry","root","dirname","overwriteStrategy","KeepExisting","sourceRoot","project","mainTsxPath","clientProviderName","agentNameKebabCase","projectName","projectRoot","tsconfigPath","find","p","exists","wildcardValue","scopeAlias","json","paths","compilerOptions","scopeWildcardKey","npmWildcardKey"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../packages/nx-plugin/src/ts/agent/react-connection/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateJson,\n} from '@nx/devkit';\nimport { addAgentRuntimeToConnectionNamespace } from '../../../connection/agent-runtime-config';\nimport type { ResolvedConnectionOptions } from '../../../connection/generator';\nimport { addSingleImport, applyGritQL } from '../../../utils/ast';\nimport { addDependenciesToPackageJson } from '../../../utils/dependencies';\nimport { formatFilesInSubtree } from '../../../utils/format';\nimport { installDependencies } from '../../../utils/install';\nimport { addGeneratorMetricsIfApplicable } from '../../../utils/metrics';\nimport { kebabCase, toClassName } from '../../../utils/names';\nimport {\n type ComponentMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../../utils/nx';\nimport { withVersions } from '../../../utils/versions';\nimport {\n type AgUiAuth,\n addAgUiReactConnection,\n} from '../../react-website/agui/generator';\nimport { runtimeConfigGenerator } from '../../react-website/runtime-config/generator';\nimport { addTsAgentTargetToLocalDev } from './local-dev';\n\nexport const TS_AGENT_REACT_CONNECTION_GENERATOR_INFO: NxGeneratorInfo =\n getGeneratorInfo(import.meta.filename);\n\nexport async function tsAgentReactConnectionGenerator(\n tree: Tree,\n options: ResolvedConnectionOptions,\n) {\n const frontendProjectConfig = readProjectConfigurationUnqualified(\n tree,\n options.sourceProject,\n );\n const agentProjectConfig = readProjectConfigurationUnqualified(\n tree,\n options.targetProject,\n );\n\n const targetComponent: ComponentMetadata | undefined =\n options.targetComponent;\n\n // Extract agent metadata from the target component or project metadata\n const metadata = agentProjectConfig.metadata as any;\n const agentName = targetComponent?.name ?? 'agent';\n const agentNameClassName = targetComponent?.rc ?? toClassName(agentName);\n const agentPort = targetComponent?.port ?? metadata?.ports?.[0] ?? 8081;\n const auth = (targetComponent?.auth ?? metadata?.auth ?? 'iam').toLowerCase();\n const agentProjectAlias = agentProjectConfig.name;\n const agentPath = targetComponent?.path ?? 'src/agent';\n\n if ((targetComponent?.protocol ?? '').toLowerCase() === 'a2a') {\n throw new Error(\n `Cannot connect a React website to an A2A agent. ` +\n `Consider generating an agent with the HTTP or AG-UI protocol instead.`,\n );\n }\n\n if (targetComponent?.protocol === 'ag-ui') {\n await addAgUiReactConnection(tree, {\n frontendProjectConfig,\n agentName,\n agentNameClassName,\n auth: auth as AgUiAuth,\n });\n\n await addTsAgentTargetToLocalDev(\n tree,\n frontendProjectConfig.name,\n agentProjectConfig.name,\n {\n agentName,\n agentNameClassName,\n port: agentPort,\n targetComponent,\n },\n );\n\n await addGeneratorMetricsIfApplicable(tree, [\n TS_AGENT_REACT_CONNECTION_GENERATOR_INFO,\n ]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n }\n\n // Ensure the agent project has a wildcard path entry in tsconfig.base.json\n // so that deep imports (e.g., for the router type) resolve correctly\n ensureWildcardPathEntry(\n tree,\n agentProjectConfig.name,\n agentProjectConfig.root,\n );\n\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files'),\n frontendProjectConfig.root,\n {\n agentName,\n agentNameClassName,\n auth,\n agentProjectAlias,\n agentPath,\n },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n // Generate the tanstack query provider if it does not exist already\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n '../../../utils/files/website/components/tanstack-query',\n ),\n joinPathFragments(frontendProjectConfig.sourceRoot, 'components'),\n {},\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n if (auth === 'iam') {\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n '../../../utils/files/website/hooks/sigv4',\n ),\n joinPathFragments(frontendProjectConfig.sourceRoot, 'hooks'),\n {},\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n }\n\n await runtimeConfigGenerator(tree, {\n project: frontendProjectConfig.name,\n preferInstallDependencies: false,\n });\n\n // update main.tsx\n const mainTsxPath = joinPathFragments(\n frontendProjectConfig.sourceRoot,\n 'main.tsx',\n );\n await addSingleImport(\n tree,\n mainTsxPath,\n 'QueryClientProvider',\n './components/QueryClientProvider',\n );\n\n const clientProviderName = `${agentNameClassName}AgentClientProvider`;\n await addSingleImport(\n tree,\n mainTsxPath,\n clientProviderName,\n `./components/${clientProviderName}`,\n );\n\n // Wrap <App /> in QueryClientProvider if not already present\n await applyGritQL(\n tree,\n mainTsxPath,\n '`<App />` => `<QueryClientProvider><App /></QueryClientProvider>` where { $program <: not contains `<QueryClientProvider>$_</QueryClientProvider>` }',\n );\n\n // Wrap <App /> in the agent client provider if not already present\n await applyGritQL(\n tree,\n mainTsxPath,\n `\\`<App />\\` => \\`<${clientProviderName}><App /></${clientProviderName}>\\` where { $program <: not contains \\`<${clientProviderName}>$_</${clientProviderName}>\\` }`,\n );\n\n await addTsAgentTargetToLocalDev(\n tree,\n frontendProjectConfig.name,\n agentProjectConfig.name,\n {\n agentName,\n agentNameClassName,\n port: agentPort,\n targetComponent,\n },\n );\n\n // Expose the agent's runtime ARN to the frontend via the 'connection'\n // namespace (which is published to runtime-config.json). The agent construct\n // itself only registers to the 'agentcore' namespace by default.\n await addAgentRuntimeToConnectionNamespace(tree, {\n agentNameKebabCase: kebabCase(agentNameClassName),\n agentNameClassName,\n });\n\n addDependenciesToPackageJson(\n tree,\n withVersions([\n '@trpc/client',\n '@tanstack/react-query',\n '@tanstack/react-query-devtools',\n '@trpc/tanstack-react-query',\n ...((auth === 'iam'\n ? [\n 'oidc-client-ts',\n 'aws4fetch',\n '@aws-sdk/credential-provider-cognito-identity',\n 'react-oidc-context',\n ]\n : []) as any),\n ...((auth === 'cognito' ? ['react-oidc-context'] : []) as any),\n ]),\n withVersions(['@smithy/types']),\n joinPathFragments(frontendProjectConfig.root, 'package.json'),\n );\n\n await addGeneratorMetricsIfApplicable(tree, [\n TS_AGENT_REACT_CONNECTION_GENERATOR_INFO,\n ]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n}\nexport default tsAgentReactConnectionGenerator;\n\n/**\n * Ensures a wildcard path entry exists in tsconfig.base.json for the given project,\n * allowing deep imports (e.g., `@scope/project/src/agent/router.js`).\n */\nfunction ensureWildcardPathEntry(\n tree: Tree,\n projectName: string,\n projectRoot: string,\n) {\n const tsconfigPath = ['tsconfig.base.json', 'tsconfig.json'].find((p) =>\n tree.exists(p),\n );\n if (!tsconfigPath) return;\n\n updateJson(tree, tsconfigPath, (json) => {\n const paths = json.compilerOptions?.paths ?? {};\n const wildcardKey = `${projectName}/*`;\n if (!paths[wildcardKey]) {\n paths[wildcardKey] = [`./${projectRoot}/*`];\n }\n json.compilerOptions = {\n ...json.compilerOptions,\n paths,\n };\n return json;\n });\n}\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateJson","addAgentRuntimeToConnectionNamespace","addSingleImport","applyGritQL","addDependenciesToPackageJson","formatFilesInSubtree","installDependencies","addGeneratorMetricsIfApplicable","kebabCase","toClassName","getGeneratorInfo","readProjectConfigurationUnqualified","withVersions","addAgUiReactConnection","runtimeConfigGenerator","addTsAgentTargetToLocalDev","TS_AGENT_REACT_CONNECTION_GENERATOR_INFO","filename","tsAgentReactConnectionGenerator","tree","options","frontendProjectConfig","sourceProject","agentProjectConfig","targetProject","targetComponent","metadata","agentName","name","agentNameClassName","rc","agentPort","port","ports","auth","toLowerCase","agentProjectAlias","agentPath","path","protocol","Error","preferInstallDependencies","languages","ensureWildcardPathEntry","root","dirname","overwriteStrategy","KeepExisting","sourceRoot","project","mainTsxPath","clientProviderName","agentNameKebabCase","projectName","projectRoot","tsconfigPath","find","p","exists","json","paths","compilerOptions","wildcardKey"],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
3
|
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
*/ import {
|
|
4
|
+
*/ import { addProjectConfiguration, generateFiles, joinPathFragments, OverwriteStrategy } from "@nx/devkit";
|
|
5
|
+
import { addDependenciesToPackageJson } from "../../utils/dependencies.js";
|
|
5
6
|
import { formatFilesInSubtree } from "../../utils/format.js";
|
|
6
7
|
import { installDependencies } from "../../utils/install.js";
|
|
7
8
|
import { addGeneratorMetricsIfApplicable } from "../../utils/metrics.js";
|
|
@@ -10,6 +11,7 @@ import { toKebabCase } from "../../utils/names.js";
|
|
|
10
11
|
import { getNpmScopePrefix } from "../../utils/npm-scope.js";
|
|
11
12
|
import { addGeneratorMetadata, getGeneratorInfo, projectExists } from "../../utils/nx.js";
|
|
12
13
|
import { getPackageManagerDisplayCommands } from "../../utils/pkg-manager.js";
|
|
14
|
+
import { ensureProjectPackageJson } from "../../utils/project-package-json.js";
|
|
13
15
|
import { withVersions } from "../../utils/versions.js";
|
|
14
16
|
export const TS_ASTRO_DOCS_GENERATOR_INFO = getGeneratorInfo(import.meta.filename);
|
|
15
17
|
export const tsAstroDocsGenerator = async (tree, schema)=>{
|
|
@@ -77,6 +79,10 @@ export const tsAstroDocsGenerator = async (tree, schema)=>{
|
|
|
77
79
|
targets
|
|
78
80
|
});
|
|
79
81
|
}
|
|
82
|
+
ensureProjectPackageJson(tree, {
|
|
83
|
+
dir,
|
|
84
|
+
fullyQualifiedName
|
|
85
|
+
});
|
|
80
86
|
const templateOptions = {
|
|
81
87
|
fullyQualifiedName,
|
|
82
88
|
title: schema.name,
|
|
@@ -113,9 +119,12 @@ export const tsAstroDocsGenerator = async (tree, schema)=>{
|
|
|
113
119
|
}
|
|
114
120
|
if (includeTranslation) {
|
|
115
121
|
dependencies.push('@strands-agents/sdk', 'commander', 'fast-glob', 'fs-extra', 'simple-git');
|
|
116
|
-
devDependencies.push('
|
|
122
|
+
devDependencies.push('@types/fs-extra');
|
|
123
|
+
addDependenciesToPackageJson(tree, {}, withVersions([
|
|
124
|
+
'tsx'
|
|
125
|
+
]));
|
|
117
126
|
}
|
|
118
|
-
addDependenciesToPackageJson(tree, withVersions(dependencies), withVersions(devDependencies));
|
|
127
|
+
addDependenciesToPackageJson(tree, withVersions(dependencies), withVersions(devDependencies), joinPathFragments(dir, 'package.json'));
|
|
119
128
|
await addGeneratorMetricsIfApplicable(tree, [
|
|
120
129
|
TS_ASTRO_DOCS_GENERATOR_INFO
|
|
121
130
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/astro-docs/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n
|
|
1
|
+
{"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/astro-docs/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n addProjectConfiguration,\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type ProjectConfiguration,\n type Tree,\n} from '@nx/devkit';\nimport { addDependenciesToPackageJson } from '../../utils/dependencies';\nimport { formatFilesInSubtree } from '../../utils/format';\nimport { installDependencies } from '../../utils/install';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics';\nimport { isEsmWorkspace } from '../../utils/module-format';\nimport { toKebabCase } from '../../utils/names';\nimport { getNpmScopePrefix } from '../../utils/npm-scope';\nimport {\n addGeneratorMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n projectExists,\n} from '../../utils/nx';\nimport { getPackageManagerDisplayCommands } from '../../utils/pkg-manager';\nimport { ensureProjectPackageJson } from '../../utils/project-package-json';\nimport { type ITsDepVersion, withVersions } from '../../utils/versions';\nimport type { TsAstroDocsGeneratorSchema } from './schema';\n\nexport const TS_ASTRO_DOCS_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const tsAstroDocsGenerator = async (\n tree: Tree,\n schema: TsAstroDocsGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const includeTranslation = !(schema.noTranslation ?? false);\n const includeBlog = !(schema.noBlog ?? false);\n const npmScopePrefix = getNpmScopePrefix(tree);\n const docsNameKebabCase = toKebabCase(schema.name);\n const fullyQualifiedName = `${npmScopePrefix}${docsNameKebabCase}`;\n // NB: interactive nx generator cli can pass empty string\n const dir = joinPathFragments(\n schema.directory || '.',\n schema.subDirectory || docsNameKebabCase,\n );\n\n const alreadyExists = projectExists(tree, fullyQualifiedName);\n\n const targets: ProjectConfiguration['targets'] = {\n build: {\n executor: 'nx:run-commands',\n options: {\n command: 'astro build',\n cwd: dir,\n },\n outputs: [`{workspaceRoot}/${dir}/dist`],\n cache: true,\n },\n start: {\n executor: 'nx:run-commands',\n options: {\n command: 'astro dev',\n cwd: dir,\n },\n continuous: true,\n },\n serve: {\n dependsOn: ['start'],\n },\n preview: {\n executor: 'nx:run-commands',\n options: {\n command: 'astro preview',\n cwd: dir,\n },\n dependsOn: ['build'],\n continuous: true,\n },\n };\n\n if (includeTranslation) {\n targets['translate'] = {\n executor: 'nx:run-commands',\n options: {\n command: 'tsx ./scripts/translate.ts',\n cwd: dir,\n forwardAllArgs: true,\n },\n };\n }\n\n if (!alreadyExists) {\n addProjectConfiguration(tree, fullyQualifiedName, {\n name: fullyQualifiedName,\n root: dir,\n sourceRoot: joinPathFragments(dir, 'src'),\n projectType: 'application',\n targets,\n });\n }\n\n ensureProjectPackageJson(tree, { dir, fullyQualifiedName });\n\n const templateOptions = {\n fullyQualifiedName,\n title: schema.name,\n includeTranslation,\n includeBlog,\n esm: isEsmWorkspace(tree),\n pkgMgrCmd: getPackageManagerDisplayCommands().exec,\n today: new Date().toISOString().slice(0, 10),\n };\n\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'base'),\n dir,\n templateOptions,\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // The sample blog post is always emitted above — drop it if the user opted out.\n if (!includeBlog) {\n tree.delete(\n joinPathFragments(\n dir,\n 'src',\n 'content',\n 'docs',\n 'en',\n 'blog',\n 'welcome.mdx',\n ),\n );\n }\n\n if (includeTranslation) {\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'translation'),\n dir,\n templateOptions,\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n }\n\n addGeneratorMetadata(tree, fullyQualifiedName, TS_ASTRO_DOCS_GENERATOR_INFO, {\n framework: 'astro',\n includeTranslation,\n includeBlog,\n });\n\n const dependencies: ITsDepVersion[] = ['astro', '@astrojs/starlight'];\n const devDependencies: ITsDepVersion[] = [];\n\n if (includeBlog) {\n dependencies.push('starlight-blog');\n }\n\n if (includeTranslation) {\n dependencies.push(\n '@strands-agents/sdk',\n 'commander',\n 'fast-glob',\n 'fs-extra',\n 'simple-git',\n );\n devDependencies.push('@types/fs-extra');\n addDependenciesToPackageJson(tree, {}, withVersions(['tsx']));\n }\n\n addDependenciesToPackageJson(\n tree,\n withVersions(dependencies),\n withVersions(devDependencies),\n joinPathFragments(dir, 'package.json'),\n );\n\n await addGeneratorMetricsIfApplicable(tree, [TS_ASTRO_DOCS_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, schema.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsAstroDocsGenerator;\n"],"names":["addProjectConfiguration","generateFiles","joinPathFragments","OverwriteStrategy","addDependenciesToPackageJson","formatFilesInSubtree","installDependencies","addGeneratorMetricsIfApplicable","isEsmWorkspace","toKebabCase","getNpmScopePrefix","addGeneratorMetadata","getGeneratorInfo","projectExists","getPackageManagerDisplayCommands","ensureProjectPackageJson","withVersions","TS_ASTRO_DOCS_GENERATOR_INFO","filename","tsAstroDocsGenerator","tree","schema","includeTranslation","noTranslation","includeBlog","noBlog","npmScopePrefix","docsNameKebabCase","name","fullyQualifiedName","dir","directory","subDirectory","alreadyExists","targets","build","executor","options","command","cwd","outputs","cache","start","continuous","serve","dependsOn","preview","forwardAllArgs","root","sourceRoot","projectType","templateOptions","title","esm","pkgMgrCmd","exec","today","Date","toISOString","slice","dirname","overwriteStrategy","KeepExisting","delete","framework","dependencies","devDependencies","push","preferInstallDependencies","languages"],"mappings":"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"}
|