Pular para o conteúdo

Configurar um monorepo

Para criar um novo monorepo, dentro do diretório desejado, execute o seguinte comando:

Terminal window
npx create-nx-workspace@21.6.8 dungeon-adventure --pm=pnpm --preset=@aws/nx-plugin --iacProvider=CDK --ci=skip --aiAgents

Isso configurará um monorepo NX dentro do diretório dungeon-adventure. Quando você abrir o diretório no VSCode, verá esta estrutura de arquivos:

  • Directory.nx/
  • Directory.vscode/
  • Directorynode_modules/
  • Directorypackages/ aqui residirão seus subprojetos
  • .gitignore
  • .npmrc
  • .prettierignore
  • .prettierrc
  • nx.json configura o CLI do NX e padrões do monorepo
  • package.json todas as dependências Node são definidas aqui
  • pnpm-lock.yaml ou bun.lock, yarn.lock, package-lock.json dependendo do gerenciador de pacotes
  • pnpm-workspace.yaml se usar pnpm
  • README.md
  • tsconfig.base.json todos os subprojetos baseados em Node estendem este
  • tsconfig.json
  • aws-nx-plugin.config.mts configuração do Nx Plugin para AWS

Agora podemos começar a criar nossos diferentes subprojetos usando o @aws/nx-plugin.

Primeiro, vamos criar nossa Game API. Para isso, crie uma API tRPC chamada GameApi usando estas etapas:

  1. Instale o Nx Console VSCode Plugin se ainda não o fez
  2. Abra o console Nx no VSCode
  3. Clique em Generate (UI) na seção "Common Nx Commands"
  4. Procure por @aws/nx-plugin - ts#trpc-api
  5. Preencha os parâmetros obrigatórios
    • name: GameApi
  6. Clique em Generate

Você verá alguns novos arquivos aparecerem na sua árvore de arquivos.

Clique aqui para examinar estes arquivos em mais detalhes.

Agora vamos criar nossos Story Agents.

Para criar um projeto Python:

  1. Instale o Nx Console VSCode Plugin se ainda não o fez
  2. Abra o console Nx no VSCode
  3. Clique em Generate (UI) na seção "Common Nx Commands"
  4. Procure por @aws/nx-plugin - py#project
  5. Preencha os parâmetros obrigatórios
    • name: story
  6. Clique em Generate

Você verá alguns novos arquivos aparecerem na sua árvore de arquivos.

Clique aqui para examinar estes arquivos em mais detalhes.

Para adicionar um agente Strands ao projeto com o gerador py#strands-agent:

  1. Instale o Nx Console VSCode Plugin se ainda não o fez
  2. Abra o console Nx no VSCode
  3. Clique em Generate (UI) na seção "Common Nx Commands"
  4. Procure por @aws/nx-plugin - py#strands-agent
  5. Preencha os parâmetros obrigatórios
    • project: story
  6. Clique em Generate

Você verá alguns novos arquivos aparecerem na sua árvore de arquivos.

Clique aqui para examinar estes arquivos em mais detalhes.

Vamos criar um servidor MCP para fornecer ferramentas para nosso Story Agent gerenciar o inventário de um jogador.

Primeiro, criamos um projeto TypeScript:

  1. Instale o Nx Console VSCode Plugin se ainda não o fez
  2. Abra o console Nx no VSCode
  3. Clique em Generate (UI) na seção "Common Nx Commands"
  4. Procure por @aws/nx-plugin - ts#project
  5. Preencha os parâmetros obrigatórios
    • name: inventory
  6. Clique em Generate

Isso criará um projeto TypeScript vazio.

Clique aqui para examinar estes arquivos em mais detalhes.

Em seguida, adicionaremos um servidor MCP ao nosso projeto TypeScript:

  1. Instale o Nx Console VSCode Plugin se ainda não o fez
  2. Abra o console Nx no VSCode
  3. Clique em Generate (UI) na seção "Common Nx Commands"
  4. Procure por @aws/nx-plugin - ts#mcp-server
  5. Preencha os parâmetros obrigatórios
    • project: inventory
  6. Clique em Generate

Isso adicionará um servidor MCP.

Clique aqui para examinar estes arquivos em mais detalhes.

Nesta tarefa, criaremos a UI que permitirá interagir com o jogo.

Para criar a UI, crie um website chamado GameUI usando estas etapas:

  1. Instale o Nx Console VSCode Plugin se ainda não o fez
  2. Abra o console Nx no VSCode
  3. Clique em Generate (UI) na seção "Common Nx Commands"
  4. Procure por @aws/nx-plugin - ts#react-website
  5. Preencha os parâmetros obrigatórios
    • name: GameUI
  6. Clique em Generate

Você verá alguns novos arquivos aparecerem na sua árvore de arquivos.

Clique aqui para examinar estes arquivos em mais detalhes.

Vamos configurar nossa Game UI para exigir acesso autenticado via Amazon Cognito usando estas etapas:

  1. Instale o Nx Console VSCode Plugin se ainda não o fez
  2. Abra o console Nx no VSCode
  3. Clique em Generate (UI) na seção "Common Nx Commands"
  4. Procure por @aws/nx-plugin - ts#react-website#auth
  5. Preencha os parâmetros obrigatórios
    • cognitoDomain: game-ui
    • project: @dungeon-adventure/game-ui
    • allowSignup: true
  6. Clique em Generate

Você verá alguns novos arquivos aparecerem/mudarem na sua árvore de arquivos.

Clique aqui para examinar estes arquivos em mais detalhes.

Vamos configurar nossa Game UI para se conectar à nossa Game API criada anteriormente.

  1. Instale o Nx Console VSCode Plugin se ainda não o fez
  2. Abra o console Nx no VSCode
  3. Clique em Generate (UI) na seção "Common Nx Commands"
  4. Procure por @aws/nx-plugin - api-connection
  5. Preencha os parâmetros obrigatórios
    • sourceProject: @dungeon-adventure/game-ui
    • targetProject: @dungeon-adventure/game-api
  6. Clique em Generate

Você verá alguns novos arquivos aparecerem/mudarem na sua árvore de arquivos.

Clique aqui para examinar estes arquivos em mais detalhes.

Vamos criar o subprojeto final para a infraestrutura CDK.

  1. Instale o Nx Console VSCode Plugin se ainda não o fez
  2. Abra o console Nx no VSCode
  3. Clique em Generate (UI) na seção "Common Nx Commands"
  4. Procure por @aws/nx-plugin - ts#infra
  5. Preencha os parâmetros obrigatórios
    • name: infra
  6. Clique em Generate

Você verá alguns novos arquivos aparecerem/mudarem na sua árvore de arquivos.

Clique aqui para examinar estes arquivos em mais detalhes.

Vamos atualizar packages/infra/src/stacks/application-stack.ts para instanciar alguns de nossos constructs gerados:

import {
GameApi,
GameUI,
InventoryMcpServer,
RuntimeConfig,
StoryAgent,
UserIdentity,
} from ':dungeon-adventure/common-constructs';
import { Stack, StackProps, CfnOutput } from 'aws-cdk-lib';
import { Construct } from 'constructs';
export class ApplicationStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
const userIdentity = new UserIdentity(this, 'UserIdentity');
const gameApi = new GameApi(this, 'GameApi', {
integrations: GameApi.defaultIntegrations(this).build(),
});
const { userPool, userPoolClient } = userIdentity;
const mcpServer = new InventoryMcpServer(this, 'InventoryMcpServer');
// Use Cognito for user authentication with the agent
const storyAgent = new StoryAgent(this, 'StoryAgent', {
authorizerConfiguration: {
customJwtAuthorizer: {
discoveryUrl: `https://cognito-idp.${Stack.of(userPool).region}.amazonaws.com/${userPool.userPoolId}/.well-known/openid-configuration`,
allowedAudience: [userPoolClient.userPoolClientId],
},
},
environment: {
INVENTORY_MCP_ARN: mcpServer.agentCoreRuntime.arn,
},
});
// Add the Story Agent ARN to runtime-config.json so it can be referenced by the website
RuntimeConfig.ensure(this).config.agentArn =
storyAgent.agentCoreRuntime.arn;
new CfnOutput(this, 'StoryAgentArn', {
value: storyAgent.agentCoreRuntime.arn,
});
new CfnOutput(this, 'InventoryMcpArn', {
value: mcpServer.agentCoreRuntime.arn,
});
// Grant the agent permissions to invoke our mcp server
mcpServer.agentCoreRuntime.grantInvoke(storyAgent.agentCoreRuntime);
// Grant the authenticated role access to invoke the api
gameApi.grantInvokeAccess(userIdentity.identityPool.authenticatedRole);
// Ensure this is instantiated last so our runtime-config.json can be automatically configured
new GameUI(this, 'GameUI');
}
}
Agora é hora de construir nosso código pela primeira vez

Usando a linha de comando, execute:

Terminal window
pnpm nx run-many --target build --all

Você será questionado com o seguinte:

Terminal window
NX The workspace is out of sync
[@nx/js:typescript-sync]: Some TypeScript configuration files are missing project references to the projects they depend on or contain outdated project references.
This will result in an error in CI.
? Would you like to sync the identified changes to get your workspace up to date?
Yes, sync the changes and run the tasks
No, run the tasks without syncing the changes

Esta mensagem indica que o NX detectou alguns arquivos que podem ser atualizados automaticamente. Neste caso, está se referindo aos arquivos tsconfig.json que não têm referências de projeto TypeScript configuradas em projetos dependentes.

Selecione a opção Yes, sync the changes and run the tasks para prosseguir. Você deve notar que todos os erros de importação relacionados à IDE são resolvidos automaticamente, pois o gerador de sincronização adicionará as referências TypeScript faltantes automaticamente!

Todos os artefatos construídos estão agora disponíveis dentro da pasta dist/ na raiz do monorepo. Esta é uma prática padrão ao usar projetos gerados pelo @aws/nx-plugin, pois não polui sua árvore de arquivos com arquivos gerados. Caso queira limpar seus arquivos, delete a pasta dist/ sem se preocupar com arquivos gerados espalhados pela árvore de arquivos.

Parabéns! Você criou todos os subprojetos necessários para começar a implementar o núcleo do nosso jogo AI Dungeon Adventure. 🎉🎉🎉