[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-aws-aws-transform":3,"mdc-jmn56f-key":35,"related-repo-aws-aws-transform":5879,"related-org-aws-aws-transform":5983},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":24,"repoUrl":25,"updatedAt":26,"license":27,"forks":28,"topics":29,"repo":30,"sourceUrl":33,"mdContent":34},"aws-transform","upgrade and migrate code with AWS Transform","Performs code upgrades, migrations, and transformations using the AWS Transform (ATX) CLI. Use when upgrading language versions, migrating AWS SDKs, migrating frameworks (Angular, Vue.js, Spring Boot, React), upgrading libraries, optimizing performance, migrating x86 to Graviton, analyzing codebases \u002F generating documentation, or defining custom transformations with natural language. Runs locally on a few repositories or at scale across hundreds via AWS Batch\u002FFargate.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"aws","AWS (Amazon)","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Faws.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"CLI","cli","tag",{"name":17,"slug":18,"type":15},"Migration","migration",{"name":20,"slug":21,"type":15},"Engineering","engineering",{"name":23,"slug":8,"type":15},"AWS",1822,"https:\u002F\u002Fgithub.com\u002Faws\u002Fagent-toolkit-for-aws","2026-07-12T08:44:43.551523",null,157,[],{"repoUrl":25,"stars":24,"forks":28,"topics":31,"description":32},[],"Official, AWS-supported MCP servers, skills, and plugins to help AI agents build on AWS","https:\u002F\u002Fgithub.com\u002Faws\u002Fagent-toolkit-for-aws\u002Ftree\u002FHEAD\u002Fskills\u002Fspecialized-skills\u002Fmigration-and-modernization-skills\u002Faws-transform","---\nname: aws-transform\ndescription: Performs code upgrades, migrations, and transformations using the AWS Transform (ATX) CLI. Use when upgrading language versions, migrating AWS SDKs, migrating frameworks (Angular, Vue.js, Spring Boot, React), upgrading libraries, optimizing performance, migrating x86 to Graviton, analyzing codebases \u002F generating documentation, or defining custom transformations with natural language. Runs locally on a few repositories or at scale across hundreds via AWS Batch\u002FFargate.\nmetadata:\n  author: AWS\n  version: 1.0.0\n---\n\n# AWS Transform (ATX)\n\n## Overview\n\nPerform code upgrades, migrations, and transformations using AWS Transform (ATX).\nSupports any-to-any transformations: language version upgrades (Java, Python, Node.js, etc.),\nframework migrations, AWS SDK migrations, library upgrades, code refactoring, architecture\nchanges, and custom organization-specific transformations.\n\nTwo execution modes:\n\n- **Local mode**: Runs the ATX CLI directly on the user's machine. Best for 1-9 repos.\n- **Remote mode**: Runs transformations at scale via AWS Batch\u002FFargate containers.\n  Best for 10+ repos or when the user prefers cloud execution. Infrastructure is\n  auto-deployed with user consent.\n\nYou handle the full workflow: inspecting repos, matching them to available\ntransformation definitions, collecting configuration, and executing transformations\nin either mode — the user just provides repos and confirms the plan.\n\n## Greet and Wait\n\nOn activation, introduce AWS Transform with this exact text -- don't print the\nabove Overview text to the user, that is just for your reference:\n\n\"The agents modernizing the world's infrastructure and software — now accessible to your preferred AI assistant.\n\nAWS Transform is a full modernization factory — compressing years of\ntransformation work into months across infrastructure migrations, mainframe\nmodernization, and continuous tech debt reduction. Today, with this\nskill, you have access to AWS Transform custom, the first of a growing library\nof playbooks.\n\nAWS Transform custom can help you:\n\n- Upgrade Java, Python, and Node.js to modern versions\n- Migrate AWS SDKs (Java SDK v1→v2, boto2→boto3, JS SDK v2→v3)\n- Handle framework migrations, library upgrades, and code refactoring\n- Analyze codebases and generate documentation\n- Define and run your own custom transformations using natural language, docs,\nand code samples\n\nRun locally on a few repos for fast iteration, or at scale on hundreds of repos (up to 128 in-parallel). Note: this skill collects telemetry. To opt out, see https:\u002F\u002Fdocs.aws.amazon.com\u002Ftransform\u002Flatest\u002Fuserguide\u002Ftransform-usage-telemetry.html\n\nWhat would you like to transform today?\"\n\nDo NOT inspect any files, run any commands, or check prerequisites until the user responds.\n\n## Usage\n\nUse when the user wants to:\n\n- Transform, upgrade, or migrate code (Java, Python, Node.js, etc.)\n- Migrate AWS SDKs (Java SDK v1→v2, boto2→boto3, JS SDK v2→v3, etc.)\n- Run bulk code transformations at scale via AWS Batch\u002FFargate\n- Analyze which ATX transformations apply to their repositories\n- Perform comprehensive codebase analysis\n- Create a new custom Transformation Definition (TD)\n\n## Core Concepts\n\n- **Transformation Definition (TD)**: A reusable transformation recipe discovered via `atx custom def list --json`\n- **Match Report**: Auto-generated mapping of repos to applicable TDs based on code inspection\n- **Local Mode**: Runs ATX CLI on the user's machine (1-9 repos, max 3 concurrent)\n- **Remote Mode**: Runs transformations in AWS Batch\u002FFargate (10+ repos, or by preference)\n\n## Philosophy\n\nWait for the user. On activation, present what this skill can do and ask the user\nwhat they'd like to accomplish. Do NOT automatically inspect the working directory,\nopen files, or any repository until the user explicitly provides repos to work with.\n\nOnce the user provides repositories, match — don't ask. Inspect those repositories\nand present which transformations apply automatically. Never show a raw TD list and\nask the user to pick.\n\n## Prerequisites\n\nPrerequisite checks run ONCE at the start of a session. Do not repeat per repo.\nDo NOT run prerequisite checks until the user has stated what they want to do.\n\n### 0. Platform Check (Required — All Modes)\n\nDetect the user's operating system. If on Windows (not WSL), stop immediately and\ninform the user:\n\n> AWS Transform custom does not support native Windows. You need to install\n> Windows Subsystem for Linux (WSL) and run this from within WSL.\n>\n> Install WSL: `wsl --install` in PowerShell (as Administrator), then restart.\n> After that, open a WSL terminal and re-run this skill from there.\n\nCheck by running:\n\n```bash\nuname -s\n```\n\n- `Linux` or `Darwin` → proceed normally\n- `MINGW*`, `MSYS*`, `CYGWIN*`, or any Windows-like output → block and show the WSL message above\n- Command fails, errors, or is not found → treat as native Windows, block and show the WSL message above\n\nDo NOT proceed with any other steps on native Windows.\n\n### 1. AWS CLI (Required — All Modes)\n\n```bash\naws --version\n```\n\nIf not installed, guide the user:\n\n- macOS: `brew install awscli` or `curl \"https:\u002F\u002Fawscli.amazonaws.com\u002FAWSCLIV2.pkg\" -o \"AWSCLIV2.pkg\" && sudo installer -pkg AWSCLIV2.pkg -target \u002F`\n- Linux: `curl \"https:\u002F\u002Fawscli.amazonaws.com\u002Fawscli-exe-linux-x86_64.zip\" -o \"awscliv2.zip\" && unzip awscliv2.zip && sudo .\u002Faws\u002Finstall`\n\nDo NOT proceed until `aws --version` succeeds.\n\n### 2. AWS Credentials (Required — All Modes)\n\n```bash\naws sts get-caller-identity\n```\n\nIf credentials are NOT configured, walk the user through setup:\n\n```\nAWS Transform custom requires AWS credentials to authenticate with the service. Configure authentication using one of the following methods.\n\n1. AWS CLI Configure (~\u002F.aws\u002Fcredentials):\n   aws configure\n\n2. AWS Credentials File (manual). Configure credentials in ~\u002F.aws\u002Fcredentials:\n\n[default]\naws_access_key_id = your_access_key\naws_secret_access_key = your_secret_key\n\n3. Environment Variables. Set the following environment variables:\n\nexport AWS_ACCESS_KEY_ID=your_access_key\nexport AWS_SECRET_ACCESS_KEY=your_secret_key\nexport AWS_SESSION_TOKEN=your_session_token\n\nYou can also specify a profile using the AWS_PROFILE environment variable:\n\nexport AWS_PROFILE=your_profile_name\n```\n\nDo NOT proceed until credentials are verified. Re-run `aws sts get-caller-identity` after setup.\n\nNote: environment variables set via `export` do not carry over between shell sessions. If the agent spawns a new shell, credentials set as env vars may be lost. Prefer `aws configure` or `~\u002F.aws\u002Fcredentials` for persistence.\n\n### 3. ATX CLI (Required — All Modes)\n\nRequired in all modes for TD discovery (`atx custom def list --json`).\nLocal mode also uses it for transformation execution.\n\n```bash\natx --version\n# Install: curl -fsSL https:\u002F\u002Ftransform-cli.awsstatic.com\u002Finstall.sh | bash\n```\n\n**Mandatory: always run `atx update` once at the start of every session**, even if you just ran it recently. This catches new ATX CLI versions and new TDs. Run it before any other ATX command (including `atx custom def list --json`):\n\n```bash\natx update\n```\n\nDo NOT skip this step. Do NOT ask the user whether to update. Do NOT condition it on whether the CLI \"needs\" an update. Run it unconditionally.\n\n### 4. IAM Permissions (Required — All Modes)\n\nLocal mode requires `transform-custom:*` minimum. Verify by running a TD list:\n\n```bash\natx custom def list --json\n```\n\nIf this succeeds, permissions are sufficient — skip the rest of this section.\n\nIf it fails with a permissions error, the caller needs the `transform-custom:*`\nIAM permission. Explain to the user what's needed and get confirmation before proceeding:\n\n> Your identity needs the `transform-custom:*` permission to use the ATX CLI.\n> I can attach the AWS-managed policy `AWSTransformCustomFullAccess` to your\n> identity. Shall I proceed?\n\nOnly after the user confirms, attach the managed policy:\n\n```bash\nCALLER_ARN=$(aws sts get-caller-identity --query Arn --output text)\nif echo \"$CALLER_ARN\" | grep -q \":user\u002F\"; then\n  IDENTITY_NAME=$(echo \"$CALLER_ARN\" | awk -F'\u002F' '{print $NF}')\n  aws iam attach-user-policy --user-name \"$IDENTITY_NAME\" \\\n    --policy-arn \"arn:aws:iam::aws:policy\u002FAWSTransformCustomFullAccess\"\nelif echo \"$CALLER_ARN\" | grep -Eq \":assumed-role\u002F|:role\u002F\"; then\n  ROLE_NAME=$(echo \"$CALLER_ARN\" | sed 's\u002F.*:\\(assumed-\\)\\{0,1\\}role\\\u002F\u002F\u002F' | cut -d'\u002F' -f1)\n  aws iam attach-role-policy --role-name \"$ROLE_NAME\" \\\n    --policy-arn \"arn:aws:iam::aws:policy\u002FAWSTransformCustomFullAccess\"\nfi\n```\n\nIf the attachment command itself fails (e.g., insufficient IAM permissions, or an\nSSO-managed role), inform the user they need to ask their AWS administrator to\nattach the `AWSTransformCustomFullAccess` AWS-managed policy to their identity.\nFor SSO users (role names starting with `AWSReservedSSO_`), this must be added\nto their IAM Identity Center permission set — it cannot be attached directly.\n\nDo NOT proceed until `atx custom def list --json` succeeds.\n\nRemote mode requires additional permissions (Lambda invoke, S3, KMS, Secrets Manager,\nCloudWatch). These are generated and attached as part of the deployment flow — see\n[references\u002Fremote-execution.md](references\u002Fremote-execution.md).\n\nSee [references\u002Fcli-reference.md](references\u002Fcli-reference.md) for the full permission list.\n\n### 5. AWS CDK (Remote Mode Only)\n\nRequired for deploying remote infrastructure. Check if installed:\n\n```bash\ncdk --version\n```\n\nIf not installed, install it globally:\n\n```bash\nnpm install -g aws-cdk\n```\n\nDo NOT proceed with remote deployment until `cdk --version` succeeds.\n\n### 6. Remote Infrastructure (Remote Mode Only — Deferred)\n\nOnly verify if user chooses remote mode. The infrastructure CDK scripts are fetched\nat runtime by cloning `https:\u002F\u002Fgithub.com\u002Faws-samples\u002Faws-transform-custom-samples.git` (branch `atx-remote-infra`) —\nthey are not bundled with this skill. See [references\u002Fremote-execution.md](references\u002Fremote-execution.md).\n\n## Workflow\n\nGenerate a session timestamp once and reuse it for all paths in this session:\n\n```bash\nSESSION_TS=$(date +%Y%m%d-%H%M%S)\n```\n\n### Step 1: Collect Repositories\n\nAsk the user for local paths or git URLs. Accept one or many. Do NOT assume the\ncurrent working directory or open editor files are the target — wait for the user\nto explicitly provide repositories.\n\nAccepted source formats:\n\n- **Local paths** — directories on the user's machine (e.g., `\u002Fhome\u002Fuser\u002Fmy-project`)\n- **HTTPS git URLs** — public or private (e.g., `https:\u002F\u002Fgithub.com\u002Forg\u002Frepo.git`)\n- **SSH git URLs** — e.g., `git@github.com:org\u002Frepo.git`\n- **S3 bucket path with zips** — e.g., `s3:\u002F\u002Fmy-bucket\u002Frepos\u002F`\n  containing zip files of repositories. Each zip becomes one transformation job.\n\n#### S3 Bucket Input\n\nIf the user provides an S3 path containing zip files, ask which execution mode\nthey prefer (if not already specified). S3 input works in both modes:\n\n**Remote mode:** Copy the zips from the user's bucket to the managed source bucket,\nthen submit jobs pointing to the managed copies:\n\n```bash\nACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)\nSOURCE_BUCKET=\"atx-source-code-${ACCOUNT_ID}\"\n\n# List all zips in the user's bucket path\naws s3 ls s3:\u002F\u002Fuser-bucket\u002Frepos\u002F --recursive | grep '\\.zip$'\n\n# Copy each zip to the managed source bucket\naws s3 sync s3:\u002F\u002Fuser-bucket\u002Frepos\u002F s3:\u002F\u002F${SOURCE_BUCKET}\u002Frepos\u002F --exclude \"*\" --include \"*.zip\"\n```\n\nThen submit a batch job with one job per zip, each pointing to\n`s3:\u002F\u002F${SOURCE_BUCKET}\u002Frepos\u002F\u003Cfilename>.zip`. The container handles zip extraction\nautomatically. See [references\u002Fmulti-transformation.md](references\u002Fmulti-transformation.md) for batch submission.\nThe managed source bucket has a 7-day lifecycle — copied zips auto-delete.\n\n**Local mode:** Download and extract each zip locally:\n\n```bash\nmkdir -p ~\u002F.aws\u002Fatx\u002Fcustom\u002Fatx-agent-session\u002Frepos\naws s3 sync s3:\u002F\u002Fuser-bucket\u002Frepos\u002F ~\u002F.aws\u002Fatx\u002Fcustom\u002Fatx-agent-session\u002Frepos\u002F --exclude \"*\" --include \"*.zip\"\nfor zip in ~\u002F.aws\u002Fatx\u002Fcustom\u002Fatx-agent-session\u002Frepos\u002F*.zip; do\n  name=$(basename \"$zip\" .zip)\n  unzip -qo \"$zip\" -d \"$HOME\u002F.aws\u002Fatx\u002Fcustom\u002Fatx-agent-session\u002Frepos\u002F${name}-$SESSION_TS\u002F\"\ndone\n```\n\nUse the extracted directories as `\u003Crepo-path>` for local execution. Standard local\nmode limits apply (max 3 concurrent repos).\n\n#### Private Repository Detection (Remote Mode)\n\n**Always ask the user** — do NOT try to determine repo visibility yourself. Never\nattempt to clone, curl, or probe a URL to check if it's public or private. Simply\nask the user. As soon as the user provides git URLs and remote mode is selected\n(or likely), ask:\n\n> \"Are any of these repositories private? If so, the remote container needs\n> credentials to clone them — I'll walk you through the setup.\"\n\nDo NOT skip this question. Do NOT try to infer visibility by attempting a clone,\ncurl, or any other network request. Just ask.\n\nIf the user confirms repos are private, determine the credential type based on URL format:\n\nFirst, resolve the region (use for all Secrets Manager commands below):\n\n```bash\nREGION=${AWS_REGION:-${AWS_DEFAULT_REGION:-$(aws configure get region 2>\u002Fdev\u002Fnull)}}\nREGION=${REGION:-us-east-1}\n```\n\n**For HTTPS URLs** — check whether a GitHub PAT is already configured:\n\n```bash\naws secretsmanager describe-secret --secret-id \"atx\u002Fgithub-token\" --region \"$REGION\" 2>\u002Fdev\u002Fnull \\\n  && echo \"CONFIGURED\" || echo \"NOT_CONFIGURED\"\n```\n\nIf CONFIGURED, ask the user: \"A GitHub PAT is already stored. Would you like to\nkeep using it, or replace it with a new one?\" If they want to replace it, tell\nthem to run:\n\n```\naws secretsmanager put-secret-value --secret-id \"atx\u002Fgithub-token\" --region \"$REGION\" --secret-string \"YOUR_TOKEN_HERE\"\n```\n\nIf NOT_CONFIGURED, explain what's needed and tell the user to run the create command:\n> \"Private HTTPS repos need a GitHub Personal Access Token (PAT) stored in AWS\n> Secrets Manager. The remote container fetches it at startup to clone your repos.\n> The token stays in your AWS account — you can delete it anytime.\n>\n> The PAT needs the `repo` scope for private repositories. Create one at\n> https:\u002F\u002Fgithub.com\u002Fsettings\u002Ftokens and then run:\n>\n> ```\n> aws secretsmanager create-secret --name \"atx\u002Fgithub-token\" --region \"$REGION\" --secret-string \"YOUR_TOKEN_HERE\"\n> ```\n>\n> Delete anytime: `aws secretsmanager delete-secret --secret-id atx\u002Fgithub-token --region \"$REGION\" --force-delete-without-recovery`\"\n\nDo NOT ask the user to paste their token in chat. They run the command themselves.\nWait for the user to confirm it's done, then verify:\n\n```bash\naws secretsmanager describe-secret --secret-id \"atx\u002Fgithub-token\" --region \"$REGION\" 2>\u002Fdev\u002Fnull \\\n  && echo \"CONFIGURED\" || echo \"NOT_CONFIGURED\"\n```\n\n**For SSH URLs** (`git@...` or `ssh:\u002F\u002F...`) — check whether an SSH key is configured:\n\n```bash\naws secretsmanager describe-secret --secret-id \"atx\u002Fssh-key\" --region \"$REGION\" 2>\u002Fdev\u002Fnull \\\n  && echo \"CONFIGURED\" || echo \"NOT_CONFIGURED\"\n```\n\nIf CONFIGURED, ask the user: \"An SSH key is already stored. Would you like to\nkeep using it, or replace it with a new one?\" If they want to replace it, tell\nthem to run:\n\n```\naws secretsmanager put-secret-value --secret-id \"atx\u002Fssh-key\" --region \"$REGION\" --secret-string \"$(cat \u003Cpath-to-your-private-key>)\"\n```\n\nIf NOT_CONFIGURED, explain what's needed and tell the user to run the create command:\n> \"SSH repos need an SSH private key stored in AWS Secrets Manager. The remote\n> container fetches it at startup to clone your repos.\n>\n> Run:\n>\n> ```\n> aws secretsmanager create-secret --name \"atx\u002Fssh-key\" --region \"$REGION\" --secret-string \"$(cat \u003Cpath-to-your-private-key>)\"\n> ```\n>\n> Delete anytime: `aws secretsmanager delete-secret --secret-id atx\u002Fssh-key --region \"$REGION\" --force-delete-without-recovery`\"\n\nDo NOT ask the user to paste their SSH key in chat. They run the command themselves.\n\nFor local mode, private repo credentials are not needed — the user's local git\nconfig handles authentication. Skip this check entirely for local mode.\n\n### Step 2: Discover TDs (Silent)\n\nRun silently — do NOT show output to user:\n\n```bash\natx custom def list --json\n```\n\nInspect the JSON output directly to build an internal lookup of available TDs.\nDo NOT pipe the output to python, jq, or other parsing scripts — read the JSON\nyourself. Never hardcode TD names.\n\n#### Creating a New TD\n\n**User explicitly asks to create a TD:** Do NOT attempt to create one\nprogrammatically. Tell the user:\n\n> To create a new Transformation Definition, open a new terminal and run:\n>\n> ```\n> atx -t\n> ```\n>\n> This starts an interactive session where you describe the transformation you\n> want to build (e.g., \"migrate all logging from log4j to SLF4J\", \"upgrade\n> Spring Boot 2 to Spring Boot 3\"). The ATX CLI will walk you through defining\n> and testing the TD, then publish it to your AWS account.\n>\n> Once it's published, come back here and I'll pick it up automatically when\n> I scan your available TDs.\n\n**No existing TD matches the user's goal:** Do NOT silently redirect to TD\ncreation. The match logic may be imperfect. Instead, confirm with the user first:\n\n> \"I didn't find an existing TD that covers [describe the user's goal]. Would\n> you like to create a new one?\"\n\nOnly show the `atx -t` instructions if the user confirms. If they say no, ask\nthem to clarify what they're looking for — they may know the TD name or want a\ndifferent approach.\n\nDo NOT run `atx -t` yourself — it requires an interactive terminal session that\nthe agent cannot drive. The user must run it manually in a separate terminal.\n\nAfter the user returns from creating a TD, re-run `atx custom def list --json`\nto pick up the newly published TD and continue with the normal workflow.\n\n### Step 3: Inspect Each Repository\n\nPerform lightweight inspection only — check config files for key signals:\n\n| Signal | Files to Check | Likely TD Type |\n|--------|---------------|----------------|\n| Python version | `.python-version`, `pyproject.toml`, `setup.cfg`, `requirements.txt` | Python version upgrade |\n| Java version | `pom.xml` (`\u003Cjava.version>`), `build.gradle` (`sourceCompatibility`), `.java-version` | Java version upgrade |\n| Node.js version | `package.json` (`engines.node`), `.nvmrc`, `.node-version` | Node.js version upgrade |\n| Python boto2 | `import boto` (NOT boto3) | boto2→boto3 migration |\n| Java SDK v1 | `com.amazonaws` imports, `aws-java-sdk` in pom.xml | Java SDK v1→v2 |\n| Node.js SDK v2 | `\"aws-sdk\"` in package.json (NOT `@aws-sdk`) | JS SDK v2→v3 |\n| x86 Java | `x86_64`\u002F`amd64` in Dockerfiles, build configs | Graviton migration |\n\nCross-reference detected signals against TDs from Step 2. Only match TDs that\nactually exist in the user's account.\n\nSee [references\u002Frepo-analysis.md](references\u002Frepo-analysis.md) for full detection commands.\n\n### Step 4: Present Match Report\n\nFormat:\n\n```\nTransformation Match Report\n=============================\nRepository: \u003Cname> (\u003Cpath>)\n  Language: \u003Clang> \u003Cversion>\n  Matching TDs:\n    - \u003Ctd-name> — \u003Cdescription>\n\nSummary: N repos analyzed, M have applicable transformations (T total jobs)\n```\n\nPresent the match report and wait for user confirmation before proceeding.\nDo NOT start any transformation without explicit user consent.\n\n### Step 5: Collect Configuration\n\nAsk the user for any additional plan context (e.g., target version for upgrade TDs).\nThis is mandatory — always ask, even if the TD doesn't strictly require config.\nThe user may have preferences or constraints the agent doesn't know about.\nSkip only if the user explicitly says no additional context is needed.\n\n### Step 6: Verify Runtime Compatibility (Remote and Local)\n\n#### Remote Mode\n\nBefore submitting remote jobs, determine whether the pre-built image covers the\ntarget runtime or if a custom Docker build is needed.\n\n**Pre-built image includes:**\n\n- **Java**: 8, 11, 17, 21, 25 (Amazon Corretto) with Maven and Gradle 9.4\n- **Python**: 3.8, 3.9, 3.10, 3.11, 3.12, 3.13, 3.14 (dnf + pyenv)\n- **Node.js**: 16, 18, 20, 22, 24 (nvm) with yarn, pnpm, TypeScript, ts-node\n- **Build tools**: gcc, g++, make, patch\n- **CLI tools**: AWS CLI v2, ATX CLI, git, jq, curl, unzip, tar\n- **OS**: Amazon Linux 2023 (x86_64)\n\n**Decision logic:**\n\n1. Based on the transformation requirements (source runtime, target runtime,\n   build tools, and any other dependencies), determine whether everything\n   needed is available in the pre-built image listed above\n2. If **yes** → use the pre-built image path (no Docker required). Proceed to deployment\n   using the pre-built image instructions in [references\u002Fremote-execution.md](references\u002Fremote-execution.md).\n3. If **no** → use the custom image path (Docker required). Inform the user:\n\n> The remote container doesn't include [language\u002Ftool version]. To run this\n> transformation remotely, I'll need to build a custom container image. This\n> requires Docker installed and running on your machine. It's a one-time change\n> — about 5-10 minutes. Want me to proceed?\n\nIf the user confirms, follow the custom image path in\n[references\u002Fremote-execution.md](references\u002Fremote-execution.md): clear `prebuiltImageUri`,\ncustomize the Dockerfile, and deploy.\n\nIf the user declines, suggest local mode as an alternative (if the tools are\navailable on their machine).\n\n**Dockerfile customization (custom image path only):**\n\nFirst, read the Dockerfile to see what's installed:\n\n```bash\nATX_INFRA_DIR=\"$HOME\u002F.aws\u002Fatx\u002Fcustom\u002Fremote-infra\"\ncat \"$ATX_INFRA_DIR\u002Fcontainer\u002FDockerfile\" 2>\u002Fdev\u002Fnull\n```\n\n1. Ensure the infrastructure repo is cloned and up to date:\n\n   ```bash\n   ATX_INFRA_DIR=\"$HOME\u002F.aws\u002Fatx\u002Fcustom\u002Fremote-infra\"\n   if [ -d \"$ATX_INFRA_DIR\" ]; then\n     git -C \"$ATX_INFRA_DIR\" add -A\n     git -C \"$ATX_INFRA_DIR\" commit -m \"Local customizations\" -q 2>\u002Fdev\u002Fnull || true\n     git -C \"$ATX_INFRA_DIR\" pull -q\n   else\n     git clone -b atx-remote-infra --single-branch https:\u002F\u002Fgithub.com\u002Faws-samples\u002Faws-transform-custom-samples.git \"$ATX_INFRA_DIR\"\n   fi\n   ```\n\n   If `git pull` reports a merge conflict, resolve it by keeping both upstream\n   changes and the user's customizations in the `CUSTOM LANGUAGES AND TOOLS`\n   section of the Dockerfile, then commit the merge.\n\n2. Edit `$ATX_INFRA_DIR\u002Fcontainer\u002FDockerfile`. Find the section marked\n   `# CUSTOM LANGUAGES AND TOOLS` and insert `RUN` commands after the comment\n   block, before the `USER root` line.\n\n   For missing versions of already-installed languages, add the version in the\n   custom section. Examples:\n\n   ```dockerfile\n   # Java 23 (Amazon Corretto — direct install, must run as root)\n   # Do NOT use dnf in the custom section — pyenv overrides the system python3\n   # that dnf depends on, causing \"No module named 'dnf'\" errors.\n   USER root\n   RUN curl -fsSL \"https:\u002F\u002Fcorretto.aws\u002Fdownloads\u002Flatest\u002Famazon-corretto-23-x64-linux-jdk.tar.gz\" -o \u002Ftmp\u002Fcorretto23.tar.gz && \\\n       mkdir -p \u002Fusr\u002Flib\u002Fjvm && \\\n       tar -xzf \u002Ftmp\u002Fcorretto23.tar.gz -C \u002Fusr\u002Flib\u002Fjvm && \\\n       rm \u002Ftmp\u002Fcorretto23.tar.gz && \\\n       ln -sfn \u002Fusr\u002Flib\u002Fjvm\u002Famazon-corretto-23.* \u002Fusr\u002Flib\u002Fjvm\u002Fcorretto-23\n\n   # Node.js 23 (via nvm — must run as atxuser)\n   USER atxuser\n   RUN . \u002Fhome\u002Fatxuser\u002F.nvm\u002Fnvm.sh && nvm install 23\n   USER root\n\n   # Python 3.15 (via pyenv — must run as atxuser)\n   USER atxuser\n   RUN eval \"$(\u002Fhome\u002Fatxuser\u002F.pyenv\u002Fbin\u002Fpyenv init -)\" && \\\n       MAKE_OPTS=\"-j$(nproc)\" \u002Fhome\u002Fatxuser\u002F.pyenv\u002Fbin\u002Fpyenv install 3.15.0\n   USER root\n   ```\n\n   For entirely new languages, avoid `dnf` in the custom section — pyenv\n   overrides the system python3 that `dnf` depends on. Use language-specific\n   installers instead:\n\n   ```dockerfile\n   # Go\n   RUN curl -fsSL https:\u002F\u002Fgo.dev\u002Fdl\u002Fgo1.22.0.linux-amd64.tar.gz | tar -C \u002Fusr\u002Flocal -xz\n   ENV PATH=\"\u002Fusr\u002Flocal\u002Fgo\u002Fbin:$PATH\"\n\n   # Ruby (via rbenv — must run as atxuser)\n   USER atxuser\n   RUN git clone --depth 1 https:\u002F\u002Fgithub.com\u002Frbenv\u002Frbenv.git \u002Fhome\u002Fatxuser\u002F.rbenv && \\\n       git clone --depth 1 https:\u002F\u002Fgithub.com\u002Frbenv\u002Fruby-build.git \u002Fhome\u002Fatxuser\u002F.rbenv\u002Fplugins\u002Fruby-build && \\\n       \u002Fhome\u002Fatxuser\u002F.rbenv\u002Fbin\u002Frbenv install 3.3.0 && \\\n       \u002Fhome\u002Fatxuser\u002F.rbenv\u002Fbin\u002Frbenv global 3.3.0\n   ENV PATH=\"\u002Fhome\u002Fatxuser\u002F.rbenv\u002Fshims:\u002Fhome\u002Fatxuser\u002F.rbenv\u002Fbin:$PATH\"\n   USER root\n\n   # Rust\n   USER atxuser\n   RUN curl --proto '=https' --tlsv1.2 -sSf https:\u002F\u002Fsh.rustup.rs | sh -s -- -y\n   ENV PATH=\"\u002Fhome\u002Fatxuser\u002F.cargo\u002Fbin:$PATH\"\n   USER root\n   ```\n\n3. Update the version switcher in `$ATX_INFRA_DIR\u002Fcontainer\u002Fentrypoint.sh`.\n   Find the relevant `switch_*_version` function and add a case for the new\n   version. For Java versions installed via direct download, find the extracted\n   directory name under `\u002Fusr\u002Flib\u002Fjvm\u002F`. For example, to add Java 23:\n\n   ```bash\n   # In switch_java_version(), add to the case statement:\n   23) java_home=\"\u002Fusr\u002Flib\u002Fjvm\u002Fcorretto-23\" ;;\n   ```\n\n   Check the actual directory name: `ls \u002Fusr\u002Flib\u002Fjvm\u002F` — use the directory\n   that matches the version you installed.\n\n   For Node.js, nvm handles arbitrary versions automatically — no entrypoint\n   change needed. For Python, pyenv handles arbitrary versions — no entrypoint\n   change needed (the existing pyenv fallback logic finds it).\n\n4. Deploy (or redeploy): `cd \"$ATX_INFRA_DIR\" && .\u002Fsetup.sh`\n   CDK hashes the `container\u002F` directory — any file change triggers a rebuild\n   and push to ECR automatically.\n\nAfter redeployment, set the `environment` field on the job to the exact target\nversion (e.g., `\"JAVA_VERSION\":\"23\"`, not `\"21\"`). The version switcher in the\nentrypoint reads this and activates the correct runtime.\n\nIf the user declines, suggest local mode as an alternative (if the tools are\navailable on their machine).\n\n#### Local Mode\n\nBefore running local transformations, verify the user has the target runtime\nversion installed. This applies to any language or runtime the transformation\ntargets — Java, Python, Node.js, Ruby, Go, Rust, .NET, etc. Check the current\nversion of whatever runtime the TD requires. For example:\n\n```bash\njava -version    # Java transformations\npython3 --version # Python transformations\nnode --version   # Node.js transformations\nruby --version   # Ruby transformations\ngo version       # Go transformations\n```\n\nIf the target version is not active, check whether it's already installed:\n\n```bash\n# Java: check common install locations\n\u002Fusr\u002Flibexec\u002Fjava_home -V 2>&1          # macOS\nls \u002Fusr\u002Flib\u002Fjvm\u002F 2>\u002Fdev\u002Fnull            # Linux\n# Python: check if the specific version binary exists\nwhich python3.12 2>\u002Fdev\u002Fnull            # adjust version as needed\n# Node.js: check if nvm is available, or look for the binary\ncommand -v nvm &>\u002Fdev\u002Fnull && nvm ls 2>\u002Fdev\u002Fnull\nwhich node 2>\u002Fdev\u002Fnull && node --version\n```\n\nIf the target version is found, switch to it:\n\n- Java: `export JAVA_HOME=\u003Cpath to JDK> && export PATH=\"$JAVA_HOME\u002Fbin:$PATH\"`\n- Python: `pyenv shell 3.15.0`\n- Node.js: `nvm use 23`\n\nOnly if the target version is not installed at all, ask the user for permission before installing. Do NOT install runtimes without explicit user confirmation.\nSuggest the appropriate version manager:\n\n- Java: `brew install --cask corretto23` (macOS), `sudo yum install java-23-amazon-corretto-devel` (RHEL\u002FAL2), or `sudo apt install java-23-amazon-corretto-jdk` (Debian\u002FUbuntu)\n- Python: `pyenv install 3.15.0 && pyenv shell 3.15.0`, or `brew install python@3.15`\n- Node.js: `nvm install 23 && nvm use 23`\n\nThe active runtime must match the transformation's target version so that builds\nand tests run correctly. Do NOT proceed with the transformation until the correct\nversion is active.\n\n### Step 7: Confirm Transformation Plan\n\nPresent final plan with repo, TD, config, and execution mode. Do NOT proceed\nuntil user confirms.\n\n### Step 8: Execute\n\nWhen running `atx custom def exec`, always include `--telemetry` (see the Telemetry section).\n\nFor remote mode, check infrastructure deployment status first using CloudFormation (see [references\u002Fremote-execution.md](references\u002Fremote-execution.md) — Infrastructure Check section). Do NOT check deployment by probing Lambda function names.\n\n- **1 repo**: See [references\u002Fsingle-transformation.md](references\u002Fsingle-transformation.md)\n- **Multiple repos**: See [references\u002Fmulti-transformation.md](references\u002Fmulti-transformation.md)\n\n## Execution Modes\n\n| Mode | Best For | Prerequisites |\n|------|----------|---------------|\n| **Local** (default for 1-9 repos) | Quick transforms, dev machines with ATX | ATX CLI installed |\n| **Remote** (recommended for 10+ repos) | Bulk transforms, up to 512 repos (128 concurrent per batch) | AWS account, auto-deployed infra |\n\nMode inference:\n\n- User says \"local\"\u002F\"here\"\u002F\"on my machine\" → Local (honor the request regardless of repo count)\n- User says \"remote\"\u002F\"cloud\"\u002F\"AWS\"\u002F\"batch\"\u002F\"at scale\" → Remote\n- 10+ repos without preference → Recommend remote, explain local cap of 3 concurrent\n- 1-9 repos without preference → Local, note remote available\n\nSee [references\u002Fremote-execution.md](references\u002Fremote-execution.md) for infrastructure setup.\n\n## Critical Rules\n\n1. **Discover TDs dynamically** — Always run `atx custom def list --json`. Never hardcode TD names.\n2. **Match, don't ask** — Inspect repos and present matches. Never show raw TD lists.\n3. **Lightweight inspection only** — Check config files and key signals. No deep analysis.\n4. **Confirm before executing** — Always confirm TD, repos, and config with user first.\n5. **No time estimates** — Never include duration predictions.\n6. **Parallel execution** — Local: max 3 concurrent repos. Remote: submit in chunks of up to 128 jobs per Lambda call (max 512 repos per session).\n7. **Preserve outputs** — Do not delete generated output folders.\n8. **Recommend remote for 10+ repos** — Default to local for 1-9 repos. Recommend remote for 10+. Always respect user preference.\n9. **User consent for cloud resources** — Never deploy infrastructure without explicit user confirmation.\n10. **Shell quoting** — When constructing shell commands:\n    - Use single quotes for JSON payloads: `--payload '{\"key\":\"value\"}'`\n    - Use single quotes for `--configuration`: ex. `--configuration 'additionalPlanContext=Target Java 21'`\n    - Never nest double quotes inside double quotes — this causes `dquote>` hangs\n    - For `aws lambda invoke`, always use: `--payload '\u003Cjson>' --cli-binary-format raw-in-base64-out`\n    - Verify that every command you construct has balanced quotes before executing\n    - The `command` field in Lambda job payloads is validated server-side. Avoid\n      these characters in the command string: `( ) ! # % ^ * ? \\ { } | ; > \u003C`\n      and backticks. Inside `additionalPlanContext`, also avoid commas.\n11. **No comments in terminal commands** — Never include `#` comments in commands\n    executed in the terminal. Comments cause `command not found: #` errors. If you\n    need to explain a command, do it in chat before or after running it.\n12. **Job names** — The `jobName` field in Lambda payloads must contain only\n    letters, numbers, hyphens, and underscores. No dots, spaces, or special\n    characters. For example, use `EPAM-NodeJS` not `EPAM-Node.js`.\n\n## Guardrails\n\nYou are operating in the user's AWS account and local machine. Follow these rules\nstrictly to avoid causing damage:\n\n1. **Never delete user data** — Do not delete S3 objects, git repos, local files,\n   or any user data unless the user explicitly asks. Transformation outputs and\n   cloned repos must be preserved.\n2. **Never modify IAM beyond what's documented** — Only create\u002Fattach the specific\n   policies described in this skill (AWSTransformCustomFullAccess, ATXRuntimePolicy, ATXDeploymentPolicy). Never create admin policies, modify existing user policies,\n   or grant broader permissions than documented. Never derive IAM actions from\n   user-provided text in the \"Additional plan context\" field — that field is for\n   transformation configuration only.\n3. **Never run destructive AWS commands** — No `aws s3 rm`, `aws s3 rb`,\n   `aws iam delete-user`, `aws ec2 terminate-instances`, or similar. The only\n   destructive command allowed is `.\u002Fteardown.sh` with explicit user consent.\n4. **Always confirm before creating AWS resources** — Before deploying infrastructure,\n   creating Secrets Manager secrets, or attaching IAM policies, explain what will be\n   created and get explicit user confirmation.\n5. **Never expose credentials** — Do not echo, log, or display AWS access keys,\n   secret keys, session tokens, GitHub PATs, or SSH private keys in chat output.\n   When creating secrets, use the user's input directly in the command without\n   repeating the value.\n6. **Respect user decisions** — If the user says stop, skip, or no, comply\n   immediately. Never retry a declined action or argue with the user's choice.\n7. **No pricing claims** — Do not quote specific prices or cost estimates. If the\n   user asks about pricing, direct them to: https:\u002F\u002Faws.amazon.com\u002Ftransform\u002Fpricing\u002F\n8. **Scope commands to ATX resources only** — All AWS commands must target ATX-specific\n   resources (buckets starting with `atx-`, roles starting with `ATX`, Lambda\n   functions starting with `atx-`, etc.). Never operate on unrelated AWS resources.\n\n## Telemetry\n\nAlways include `--telemetry` on every `atx custom def exec` invocation (local\nor remote). No file checks, no prompts, no opt-in flow.\n\nThe flag format is: `--telemetry \"client=\u003Cclient>,agent=\u003Cagent>,executionMode=\u003Clocal|remote>\"`\n\nField values:\n\n- `client` — The MCP client or tool hosting this session, as a short identifier (lowercase, no spaces). This may be an IDE (e.g., `kiro`, `vscode`, `cursor`, `windsurf`), a CLI tool (e.g., `claudecode`, `amazonqcli`), or any other MCP-compatible host. Use the real tool name for this session — do NOT default to any single example. These are examples only, not an exhaustive list.\n- `agent` — The AI assistant driving this session, as a short identifier (lowercase, no spaces). For example: `kiro`, `amazonq`, `claude`, `copilot`, `cline`, `codex`. Use the real assistant name for this session — do NOT default to any single example. These are examples only, not an exhaustive list.\n- `executionMode` — `local` when running the ATX CLI directly, `remote` when submitting via Lambda\n\nThe only exception: if the user explicitly asks to disable telemetry during the\nsession (e.g., \"disable telemetry\", \"opt out of telemetry\", \"no telemetry\", or\nsimilar), you MUST comply immediately — omit `--telemetry` for the remainder of\nthat session. Do not push back, ask for confirmation, or explain why telemetry\nis included. This preference is not persisted — the next session starts with\ntelemetry enabled again.\n\n## Output Structure\n\nLocal mode: transformed code is in the repo directory.\n\nRemote mode results stay in S3 — do NOT download automatically. Present the S3\npath to the user:\n\n```\ns3:\u002F\u002Fatx-custom-output-{account-id}\u002F\n  transformations\u002F\n    {job-name}\u002F\n      {conversation-id}\u002F\n        code.zip                      # Zipped transformed source code\n        logs.zip                      # ATX conversation logs\n```\n\nIf the user explicitly asks to download, provide the command but let them run it:\n`aws s3 cp s3:\u002F\u002Fatx-custom-output-{account-id}\u002Ftransformations\u002F{job-name}\u002F{conversation-id}\u002Fcode.zip .\u002Fcode.zip`\n\nBulk results summary: `~\u002F.aws\u002Fatx\u002Fcustom\u002Fatx-agent-session\u002Ftransformation-summaries\u002F` — see [references\u002Fresults-synthesis.md](references\u002Fresults-synthesis.md).\n\n## References\n\n| Reference | When to Use |\n|-----------|-------------|\n| [repo-analysis.md](references\u002Frepo-analysis.md) | Detection commands, signal matching, match report format |\n| [single-transformation.md](references\u002Fsingle-transformation.md) | Applying one TD to one repo (local or remote) |\n| [multi-transformation.md](references\u002Fmulti-transformation.md) | Applying TDs to multiple repos in parallel |\n| [remote-execution.md](references\u002Fremote-execution.md) | Infrastructure deployment, job submission, monitoring |\n| [results-synthesis.md](references\u002Fresults-synthesis.md) | Generating consolidated reports after bulk transforms |\n| [cli-reference.md](references\u002Fcli-reference.md) | ATX CLI flags, commands, env vars, IAM permissions |\n| [troubleshooting.md](references\u002Ftroubleshooting.md) | Error resolution, debugging, quality improvement |\n\n## License\nAWS Service Terms. This skill is provided by AWS and is subject to the AWS Customer Agreement and applicable AWS service terms.\n\n## Changelog\nShare if the user asks what changed, what's new, etc.\n### [1.0.0] - 2026-04-30\n\n- Initial release of the AWS Transform Agent Skill\n- Supported TDs:\n  - AWS\u002Fjava-version-upgrade\n  - AWS\u002Fpython-version-upgrade\n  - AWS\u002Fnodejs-version-upgrade\n  - AWS\u002Fjava-aws-sdk-v1-to-v2\n  - AWS\u002Fnodejs-aws-sdk-v2-to-v3\n  - AWS\u002Fpython-boto2-to-boto3\n  - AWS\u002Fcomprehensive-codebase-analysis\n  - AWS\u002Fjava-performance-optimization\n  - AWS\u002Fangular-version-upgrade\n  - AWS\u002Fvue.js-version-upgrade\n  - AWS\u002Fearly-access-java-x86-to-graviton\n  - AWS\u002Fearly-access-angular-to-react-migration\n  - AWS\u002Fearly-access-log4j-to-slf4j-migration\n",{"data":36,"body":39},{"name":4,"description":6,"metadata":37},{"author":23,"version":38},"1.0.0",{"type":40,"children":41},"root",[42,51,58,64,69,95,100,106,111,116,121,126,154,167,172,177,183,188,221,227,277,283,288,293,299,304,311,316,338,343,372,425,430,436,455,460,492,505,511,535,540,550,563,591,597,609,638,663,682,687,693,706,740,745,757,780,785,1267,1287,1297,1309,1321,1327,1332,1351,1356,1386,1398,1404,1430,1436,1441,1474,1480,1485,1490,1561,1568,1573,1583,1831,1851,1861,2095,2108,2114,2124,2132,2137,2142,2147,2244,2254,2375,2380,2389,2394,2444,2449,2557,2582,2692,2697,2706,2710,2743,2748,2753,2759,2764,2793,2798,2804,2814,2841,2851,2866,2879,2891,2903,2909,2914,3202,3207,3218,3224,3229,3238,3243,3249,3254,3260,3265,3270,3278,3341,3349,3386,3401,3420,3425,3433,3438,3509,4302,4331,4335,4340,4345,4440,4445,4633,4638,4674,4679,4738,4743,4749,4754,4760,4781,4792,4823,4829,4901,4906,4929,4939,4945,5212,5218,5223,5373,5379,5398,5409,5414,5552,5564,5570,5575,5580,5589,5600,5619,5625,5760,5766,5771,5777,5782,5792,5873],{"type":43,"tag":44,"props":45,"children":47},"element","h1",{"id":46},"aws-transform-atx",[48],{"type":49,"value":50},"text","AWS Transform (ATX)",{"type":43,"tag":52,"props":53,"children":55},"h2",{"id":54},"overview",[56],{"type":49,"value":57},"Overview",{"type":43,"tag":59,"props":60,"children":61},"p",{},[62],{"type":49,"value":63},"Perform code upgrades, migrations, and transformations using AWS Transform (ATX).\nSupports any-to-any transformations: language version upgrades (Java, Python, Node.js, etc.),\nframework migrations, AWS SDK migrations, library upgrades, code refactoring, architecture\nchanges, and custom organization-specific transformations.",{"type":43,"tag":59,"props":65,"children":66},{},[67],{"type":49,"value":68},"Two execution modes:",{"type":43,"tag":70,"props":71,"children":72},"ul",{},[73,85],{"type":43,"tag":74,"props":75,"children":76},"li",{},[77,83],{"type":43,"tag":78,"props":79,"children":80},"strong",{},[81],{"type":49,"value":82},"Local mode",{"type":49,"value":84},": Runs the ATX CLI directly on the user's machine. Best for 1-9 repos.",{"type":43,"tag":74,"props":86,"children":87},{},[88,93],{"type":43,"tag":78,"props":89,"children":90},{},[91],{"type":49,"value":92},"Remote mode",{"type":49,"value":94},": Runs transformations at scale via AWS Batch\u002FFargate containers.\nBest for 10+ repos or when the user prefers cloud execution. Infrastructure is\nauto-deployed with user consent.",{"type":43,"tag":59,"props":96,"children":97},{},[98],{"type":49,"value":99},"You handle the full workflow: inspecting repos, matching them to available\ntransformation definitions, collecting configuration, and executing transformations\nin either mode — the user just provides repos and confirms the plan.",{"type":43,"tag":52,"props":101,"children":103},{"id":102},"greet-and-wait",[104],{"type":49,"value":105},"Greet and Wait",{"type":43,"tag":59,"props":107,"children":108},{},[109],{"type":49,"value":110},"On activation, introduce AWS Transform with this exact text -- don't print the\nabove Overview text to the user, that is just for your reference:",{"type":43,"tag":59,"props":112,"children":113},{},[114],{"type":49,"value":115},"\"The agents modernizing the world's infrastructure and software — now accessible to your preferred AI assistant.",{"type":43,"tag":59,"props":117,"children":118},{},[119],{"type":49,"value":120},"AWS Transform is a full modernization factory — compressing years of\ntransformation work into months across infrastructure migrations, mainframe\nmodernization, and continuous tech debt reduction. Today, with this\nskill, you have access to AWS Transform custom, the first of a growing library\nof playbooks.",{"type":43,"tag":59,"props":122,"children":123},{},[124],{"type":49,"value":125},"AWS Transform custom can help you:",{"type":43,"tag":70,"props":127,"children":128},{},[129,134,139,144,149],{"type":43,"tag":74,"props":130,"children":131},{},[132],{"type":49,"value":133},"Upgrade Java, Python, and Node.js to modern versions",{"type":43,"tag":74,"props":135,"children":136},{},[137],{"type":49,"value":138},"Migrate AWS SDKs (Java SDK v1→v2, boto2→boto3, JS SDK v2→v3)",{"type":43,"tag":74,"props":140,"children":141},{},[142],{"type":49,"value":143},"Handle framework migrations, library upgrades, and code refactoring",{"type":43,"tag":74,"props":145,"children":146},{},[147],{"type":49,"value":148},"Analyze codebases and generate documentation",{"type":43,"tag":74,"props":150,"children":151},{},[152],{"type":49,"value":153},"Define and run your own custom transformations using natural language, docs,\nand code samples",{"type":43,"tag":59,"props":155,"children":156},{},[157,159],{"type":49,"value":158},"Run locally on a few repos for fast iteration, or at scale on hundreds of repos (up to 128 in-parallel). Note: this skill collects telemetry. To opt out, see ",{"type":43,"tag":160,"props":161,"children":165},"a",{"href":162,"rel":163},"https:\u002F\u002Fdocs.aws.amazon.com\u002Ftransform\u002Flatest\u002Fuserguide\u002Ftransform-usage-telemetry.html",[164],"nofollow",[166],{"type":49,"value":162},{"type":43,"tag":59,"props":168,"children":169},{},[170],{"type":49,"value":171},"What would you like to transform today?\"",{"type":43,"tag":59,"props":173,"children":174},{},[175],{"type":49,"value":176},"Do NOT inspect any files, run any commands, or check prerequisites until the user responds.",{"type":43,"tag":52,"props":178,"children":180},{"id":179},"usage",[181],{"type":49,"value":182},"Usage",{"type":43,"tag":59,"props":184,"children":185},{},[186],{"type":49,"value":187},"Use when the user wants to:",{"type":43,"tag":70,"props":189,"children":190},{},[191,196,201,206,211,216],{"type":43,"tag":74,"props":192,"children":193},{},[194],{"type":49,"value":195},"Transform, upgrade, or migrate code (Java, Python, Node.js, etc.)",{"type":43,"tag":74,"props":197,"children":198},{},[199],{"type":49,"value":200},"Migrate AWS SDKs (Java SDK v1→v2, boto2→boto3, JS SDK v2→v3, etc.)",{"type":43,"tag":74,"props":202,"children":203},{},[204],{"type":49,"value":205},"Run bulk code transformations at scale via AWS Batch\u002FFargate",{"type":43,"tag":74,"props":207,"children":208},{},[209],{"type":49,"value":210},"Analyze which ATX transformations apply to their repositories",{"type":43,"tag":74,"props":212,"children":213},{},[214],{"type":49,"value":215},"Perform comprehensive codebase analysis",{"type":43,"tag":74,"props":217,"children":218},{},[219],{"type":49,"value":220},"Create a new custom Transformation Definition (TD)",{"type":43,"tag":52,"props":222,"children":224},{"id":223},"core-concepts",[225],{"type":49,"value":226},"Core Concepts",{"type":43,"tag":70,"props":228,"children":229},{},[230,247,257,267],{"type":43,"tag":74,"props":231,"children":232},{},[233,238,240],{"type":43,"tag":78,"props":234,"children":235},{},[236],{"type":49,"value":237},"Transformation Definition (TD)",{"type":49,"value":239},": A reusable transformation recipe discovered via ",{"type":43,"tag":241,"props":242,"children":244},"code",{"className":243},[],[245],{"type":49,"value":246},"atx custom def list --json",{"type":43,"tag":74,"props":248,"children":249},{},[250,255],{"type":43,"tag":78,"props":251,"children":252},{},[253],{"type":49,"value":254},"Match Report",{"type":49,"value":256},": Auto-generated mapping of repos to applicable TDs based on code inspection",{"type":43,"tag":74,"props":258,"children":259},{},[260,265],{"type":43,"tag":78,"props":261,"children":262},{},[263],{"type":49,"value":264},"Local Mode",{"type":49,"value":266},": Runs ATX CLI on the user's machine (1-9 repos, max 3 concurrent)",{"type":43,"tag":74,"props":268,"children":269},{},[270,275],{"type":43,"tag":78,"props":271,"children":272},{},[273],{"type":49,"value":274},"Remote Mode",{"type":49,"value":276},": Runs transformations in AWS Batch\u002FFargate (10+ repos, or by preference)",{"type":43,"tag":52,"props":278,"children":280},{"id":279},"philosophy",[281],{"type":49,"value":282},"Philosophy",{"type":43,"tag":59,"props":284,"children":285},{},[286],{"type":49,"value":287},"Wait for the user. On activation, present what this skill can do and ask the user\nwhat they'd like to accomplish. Do NOT automatically inspect the working directory,\nopen files, or any repository until the user explicitly provides repos to work with.",{"type":43,"tag":59,"props":289,"children":290},{},[291],{"type":49,"value":292},"Once the user provides repositories, match — don't ask. Inspect those repositories\nand present which transformations apply automatically. Never show a raw TD list and\nask the user to pick.",{"type":43,"tag":52,"props":294,"children":296},{"id":295},"prerequisites",[297],{"type":49,"value":298},"Prerequisites",{"type":43,"tag":59,"props":300,"children":301},{},[302],{"type":49,"value":303},"Prerequisite checks run ONCE at the start of a session. Do not repeat per repo.\nDo NOT run prerequisite checks until the user has stated what they want to do.",{"type":43,"tag":305,"props":306,"children":308},"h3",{"id":307},"_0-platform-check-required-all-modes",[309],{"type":49,"value":310},"0. Platform Check (Required — All Modes)",{"type":43,"tag":59,"props":312,"children":313},{},[314],{"type":49,"value":315},"Detect the user's operating system. If on Windows (not WSL), stop immediately and\ninform the user:",{"type":43,"tag":317,"props":318,"children":319},"blockquote",{},[320,325],{"type":43,"tag":59,"props":321,"children":322},{},[323],{"type":49,"value":324},"AWS Transform custom does not support native Windows. You need to install\nWindows Subsystem for Linux (WSL) and run this from within WSL.",{"type":43,"tag":59,"props":326,"children":327},{},[328,330,336],{"type":49,"value":329},"Install WSL: ",{"type":43,"tag":241,"props":331,"children":333},{"className":332},[],[334],{"type":49,"value":335},"wsl --install",{"type":49,"value":337}," in PowerShell (as Administrator), then restart.\nAfter that, open a WSL terminal and re-run this skill from there.",{"type":43,"tag":59,"props":339,"children":340},{},[341],{"type":49,"value":342},"Check by running:",{"type":43,"tag":344,"props":345,"children":350},"pre",{"className":346,"code":347,"language":348,"meta":349,"style":349},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","uname -s\n","bash","",[351],{"type":43,"tag":241,"props":352,"children":353},{"__ignoreMap":349},[354],{"type":43,"tag":355,"props":356,"children":359},"span",{"class":357,"line":358},"line",1,[360,366],{"type":43,"tag":355,"props":361,"children":363},{"style":362},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[364],{"type":49,"value":365},"uname",{"type":43,"tag":355,"props":367,"children":369},{"style":368},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[370],{"type":49,"value":371}," -s\n",{"type":43,"tag":70,"props":373,"children":374},{},[375,394,420],{"type":43,"tag":74,"props":376,"children":377},{},[378,384,386,392],{"type":43,"tag":241,"props":379,"children":381},{"className":380},[],[382],{"type":49,"value":383},"Linux",{"type":49,"value":385}," or ",{"type":43,"tag":241,"props":387,"children":389},{"className":388},[],[390],{"type":49,"value":391},"Darwin",{"type":49,"value":393}," → proceed normally",{"type":43,"tag":74,"props":395,"children":396},{},[397,403,405,411,412,418],{"type":43,"tag":241,"props":398,"children":400},{"className":399},[],[401],{"type":49,"value":402},"MINGW*",{"type":49,"value":404},", ",{"type":43,"tag":241,"props":406,"children":408},{"className":407},[],[409],{"type":49,"value":410},"MSYS*",{"type":49,"value":404},{"type":43,"tag":241,"props":413,"children":415},{"className":414},[],[416],{"type":49,"value":417},"CYGWIN*",{"type":49,"value":419},", or any Windows-like output → block and show the WSL message above",{"type":43,"tag":74,"props":421,"children":422},{},[423],{"type":49,"value":424},"Command fails, errors, or is not found → treat as native Windows, block and show the WSL message above",{"type":43,"tag":59,"props":426,"children":427},{},[428],{"type":49,"value":429},"Do NOT proceed with any other steps on native Windows.",{"type":43,"tag":305,"props":431,"children":433},{"id":432},"_1-aws-cli-required-all-modes",[434],{"type":49,"value":435},"1. AWS CLI (Required — All Modes)",{"type":43,"tag":344,"props":437,"children":439},{"className":346,"code":438,"language":348,"meta":349,"style":349},"aws --version\n",[440],{"type":43,"tag":241,"props":441,"children":442},{"__ignoreMap":349},[443],{"type":43,"tag":355,"props":444,"children":445},{"class":357,"line":358},[446,450],{"type":43,"tag":355,"props":447,"children":448},{"style":362},[449],{"type":49,"value":8},{"type":43,"tag":355,"props":451,"children":452},{"style":368},[453],{"type":49,"value":454}," --version\n",{"type":43,"tag":59,"props":456,"children":457},{},[458],{"type":49,"value":459},"If not installed, guide the user:",{"type":43,"tag":70,"props":461,"children":462},{},[463,481],{"type":43,"tag":74,"props":464,"children":465},{},[466,468,474,475],{"type":49,"value":467},"macOS: ",{"type":43,"tag":241,"props":469,"children":471},{"className":470},[],[472],{"type":49,"value":473},"brew install awscli",{"type":49,"value":385},{"type":43,"tag":241,"props":476,"children":478},{"className":477},[],[479],{"type":49,"value":480},"curl \"https:\u002F\u002Fawscli.amazonaws.com\u002FAWSCLIV2.pkg\" -o \"AWSCLIV2.pkg\" && sudo installer -pkg AWSCLIV2.pkg -target \u002F",{"type":43,"tag":74,"props":482,"children":483},{},[484,486],{"type":49,"value":485},"Linux: ",{"type":43,"tag":241,"props":487,"children":489},{"className":488},[],[490],{"type":49,"value":491},"curl \"https:\u002F\u002Fawscli.amazonaws.com\u002Fawscli-exe-linux-x86_64.zip\" -o \"awscliv2.zip\" && unzip awscliv2.zip && sudo .\u002Faws\u002Finstall",{"type":43,"tag":59,"props":493,"children":494},{},[495,497,503],{"type":49,"value":496},"Do NOT proceed until ",{"type":43,"tag":241,"props":498,"children":500},{"className":499},[],[501],{"type":49,"value":502},"aws --version",{"type":49,"value":504}," succeeds.",{"type":43,"tag":305,"props":506,"children":508},{"id":507},"_2-aws-credentials-required-all-modes",[509],{"type":49,"value":510},"2. AWS Credentials (Required — All Modes)",{"type":43,"tag":344,"props":512,"children":514},{"className":346,"code":513,"language":348,"meta":349,"style":349},"aws sts get-caller-identity\n",[515],{"type":43,"tag":241,"props":516,"children":517},{"__ignoreMap":349},[518],{"type":43,"tag":355,"props":519,"children":520},{"class":357,"line":358},[521,525,530],{"type":43,"tag":355,"props":522,"children":523},{"style":362},[524],{"type":49,"value":8},{"type":43,"tag":355,"props":526,"children":527},{"style":368},[528],{"type":49,"value":529}," sts",{"type":43,"tag":355,"props":531,"children":532},{"style":368},[533],{"type":49,"value":534}," get-caller-identity\n",{"type":43,"tag":59,"props":536,"children":537},{},[538],{"type":49,"value":539},"If credentials are NOT configured, walk the user through setup:",{"type":43,"tag":344,"props":541,"children":545},{"className":542,"code":544,"language":49},[543],"language-text","AWS Transform custom requires AWS credentials to authenticate with the service. Configure authentication using one of the following methods.\n\n1. AWS CLI Configure (~\u002F.aws\u002Fcredentials):\n   aws configure\n\n2. AWS Credentials File (manual). Configure credentials in ~\u002F.aws\u002Fcredentials:\n\n[default]\naws_access_key_id = your_access_key\naws_secret_access_key = your_secret_key\n\n3. Environment Variables. Set the following environment variables:\n\nexport AWS_ACCESS_KEY_ID=your_access_key\nexport AWS_SECRET_ACCESS_KEY=your_secret_key\nexport AWS_SESSION_TOKEN=your_session_token\n\nYou can also specify a profile using the AWS_PROFILE environment variable:\n\nexport AWS_PROFILE=your_profile_name\n",[546],{"type":43,"tag":241,"props":547,"children":548},{"__ignoreMap":349},[549],{"type":49,"value":544},{"type":43,"tag":59,"props":551,"children":552},{},[553,555,561],{"type":49,"value":554},"Do NOT proceed until credentials are verified. Re-run ",{"type":43,"tag":241,"props":556,"children":558},{"className":557},[],[559],{"type":49,"value":560},"aws sts get-caller-identity",{"type":49,"value":562}," after setup.",{"type":43,"tag":59,"props":564,"children":565},{},[566,568,574,576,582,583,589],{"type":49,"value":567},"Note: environment variables set via ",{"type":43,"tag":241,"props":569,"children":571},{"className":570},[],[572],{"type":49,"value":573},"export",{"type":49,"value":575}," do not carry over between shell sessions. If the agent spawns a new shell, credentials set as env vars may be lost. Prefer ",{"type":43,"tag":241,"props":577,"children":579},{"className":578},[],[580],{"type":49,"value":581},"aws configure",{"type":49,"value":385},{"type":43,"tag":241,"props":584,"children":586},{"className":585},[],[587],{"type":49,"value":588},"~\u002F.aws\u002Fcredentials",{"type":49,"value":590}," for persistence.",{"type":43,"tag":305,"props":592,"children":594},{"id":593},"_3-atx-cli-required-all-modes",[595],{"type":49,"value":596},"3. ATX CLI (Required — All Modes)",{"type":43,"tag":59,"props":598,"children":599},{},[600,602,607],{"type":49,"value":601},"Required in all modes for TD discovery (",{"type":43,"tag":241,"props":603,"children":605},{"className":604},[],[606],{"type":49,"value":246},{"type":49,"value":608},").\nLocal mode also uses it for transformation execution.",{"type":43,"tag":344,"props":610,"children":612},{"className":346,"code":611,"language":348,"meta":349,"style":349},"atx --version\n# Install: curl -fsSL https:\u002F\u002Ftransform-cli.awsstatic.com\u002Finstall.sh | bash\n",[613],{"type":43,"tag":241,"props":614,"children":615},{"__ignoreMap":349},[616,628],{"type":43,"tag":355,"props":617,"children":618},{"class":357,"line":358},[619,624],{"type":43,"tag":355,"props":620,"children":621},{"style":362},[622],{"type":49,"value":623},"atx",{"type":43,"tag":355,"props":625,"children":626},{"style":368},[627],{"type":49,"value":454},{"type":43,"tag":355,"props":629,"children":631},{"class":357,"line":630},2,[632],{"type":43,"tag":355,"props":633,"children":635},{"style":634},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[636],{"type":49,"value":637},"# Install: curl -fsSL https:\u002F\u002Ftransform-cli.awsstatic.com\u002Finstall.sh | bash\n",{"type":43,"tag":59,"props":639,"children":640},{},[641,654,656,661],{"type":43,"tag":78,"props":642,"children":643},{},[644,646,652],{"type":49,"value":645},"Mandatory: always run ",{"type":43,"tag":241,"props":647,"children":649},{"className":648},[],[650],{"type":49,"value":651},"atx update",{"type":49,"value":653}," once at the start of every session",{"type":49,"value":655},", even if you just ran it recently. This catches new ATX CLI versions and new TDs. Run it before any other ATX command (including ",{"type":43,"tag":241,"props":657,"children":659},{"className":658},[],[660],{"type":49,"value":246},{"type":49,"value":662},"):",{"type":43,"tag":344,"props":664,"children":666},{"className":346,"code":665,"language":348,"meta":349,"style":349},"atx update\n",[667],{"type":43,"tag":241,"props":668,"children":669},{"__ignoreMap":349},[670],{"type":43,"tag":355,"props":671,"children":672},{"class":357,"line":358},[673,677],{"type":43,"tag":355,"props":674,"children":675},{"style":362},[676],{"type":49,"value":623},{"type":43,"tag":355,"props":678,"children":679},{"style":368},[680],{"type":49,"value":681}," update\n",{"type":43,"tag":59,"props":683,"children":684},{},[685],{"type":49,"value":686},"Do NOT skip this step. Do NOT ask the user whether to update. Do NOT condition it on whether the CLI \"needs\" an update. Run it unconditionally.",{"type":43,"tag":305,"props":688,"children":690},{"id":689},"_4-iam-permissions-required-all-modes",[691],{"type":49,"value":692},"4. IAM Permissions (Required — All Modes)",{"type":43,"tag":59,"props":694,"children":695},{},[696,698,704],{"type":49,"value":697},"Local mode requires ",{"type":43,"tag":241,"props":699,"children":701},{"className":700},[],[702],{"type":49,"value":703},"transform-custom:*",{"type":49,"value":705}," minimum. Verify by running a TD list:",{"type":43,"tag":344,"props":707,"children":709},{"className":346,"code":708,"language":348,"meta":349,"style":349},"atx custom def list --json\n",[710],{"type":43,"tag":241,"props":711,"children":712},{"__ignoreMap":349},[713],{"type":43,"tag":355,"props":714,"children":715},{"class":357,"line":358},[716,720,725,730,735],{"type":43,"tag":355,"props":717,"children":718},{"style":362},[719],{"type":49,"value":623},{"type":43,"tag":355,"props":721,"children":722},{"style":368},[723],{"type":49,"value":724}," custom",{"type":43,"tag":355,"props":726,"children":727},{"style":368},[728],{"type":49,"value":729}," def",{"type":43,"tag":355,"props":731,"children":732},{"style":368},[733],{"type":49,"value":734}," list",{"type":43,"tag":355,"props":736,"children":737},{"style":368},[738],{"type":49,"value":739}," --json\n",{"type":43,"tag":59,"props":741,"children":742},{},[743],{"type":49,"value":744},"If this succeeds, permissions are sufficient — skip the rest of this section.",{"type":43,"tag":59,"props":746,"children":747},{},[748,750,755],{"type":49,"value":749},"If it fails with a permissions error, the caller needs the ",{"type":43,"tag":241,"props":751,"children":753},{"className":752},[],[754],{"type":49,"value":703},{"type":49,"value":756},"\nIAM permission. Explain to the user what's needed and get confirmation before proceeding:",{"type":43,"tag":317,"props":758,"children":759},{},[760],{"type":43,"tag":59,"props":761,"children":762},{},[763,765,770,772,778],{"type":49,"value":764},"Your identity needs the ",{"type":43,"tag":241,"props":766,"children":768},{"className":767},[],[769],{"type":49,"value":703},{"type":49,"value":771}," permission to use the ATX CLI.\nI can attach the AWS-managed policy ",{"type":43,"tag":241,"props":773,"children":775},{"className":774},[],[776],{"type":49,"value":777},"AWSTransformCustomFullAccess",{"type":49,"value":779}," to your\nidentity. Shall I proceed?",{"type":43,"tag":59,"props":781,"children":782},{},[783],{"type":49,"value":784},"Only after the user confirms, attach the managed policy:",{"type":43,"tag":344,"props":786,"children":788},{"className":346,"code":787,"language":348,"meta":349,"style":349},"CALLER_ARN=$(aws sts get-caller-identity --query Arn --output text)\nif echo \"$CALLER_ARN\" | grep -q \":user\u002F\"; then\n  IDENTITY_NAME=$(echo \"$CALLER_ARN\" | awk -F'\u002F' '{print $NF}')\n  aws iam attach-user-policy --user-name \"$IDENTITY_NAME\" \\\n    --policy-arn \"arn:aws:iam::aws:policy\u002FAWSTransformCustomFullAccess\"\nelif echo \"$CALLER_ARN\" | grep -Eq \":assumed-role\u002F|:role\u002F\"; then\n  ROLE_NAME=$(echo \"$CALLER_ARN\" | sed 's\u002F.*:\\(assumed-\\)\\{0,1\\}role\\\u002F\u002F\u002F' | cut -d'\u002F' -f1)\n  aws iam attach-role-policy --role-name \"$ROLE_NAME\" \\\n    --policy-arn \"arn:aws:iam::aws:policy\u002FAWSTransformCustomFullAccess\"\nfi\n",[789],{"type":43,"tag":241,"props":790,"children":791},{"__ignoreMap":349},[792,845,913,989,1031,1054,1113,1199,1238,1258],{"type":43,"tag":355,"props":793,"children":794},{"class":357,"line":358},[795,801,807,811,815,820,825,830,835,840],{"type":43,"tag":355,"props":796,"children":798},{"style":797},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[799],{"type":49,"value":800},"CALLER_ARN",{"type":43,"tag":355,"props":802,"children":804},{"style":803},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[805],{"type":49,"value":806},"=$(",{"type":43,"tag":355,"props":808,"children":809},{"style":362},[810],{"type":49,"value":8},{"type":43,"tag":355,"props":812,"children":813},{"style":368},[814],{"type":49,"value":529},{"type":43,"tag":355,"props":816,"children":817},{"style":368},[818],{"type":49,"value":819}," get-caller-identity",{"type":43,"tag":355,"props":821,"children":822},{"style":368},[823],{"type":49,"value":824}," --query",{"type":43,"tag":355,"props":826,"children":827},{"style":368},[828],{"type":49,"value":829}," Arn",{"type":43,"tag":355,"props":831,"children":832},{"style":368},[833],{"type":49,"value":834}," --output",{"type":43,"tag":355,"props":836,"children":837},{"style":368},[838],{"type":49,"value":839}," text",{"type":43,"tag":355,"props":841,"children":842},{"style":803},[843],{"type":49,"value":844},")\n",{"type":43,"tag":355,"props":846,"children":847},{"class":357,"line":630},[848,854,860,865,870,875,880,885,890,894,899,903,908],{"type":43,"tag":355,"props":849,"children":851},{"style":850},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[852],{"type":49,"value":853},"if",{"type":43,"tag":355,"props":855,"children":857},{"style":856},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[858],{"type":49,"value":859}," echo",{"type":43,"tag":355,"props":861,"children":862},{"style":803},[863],{"type":49,"value":864}," \"",{"type":43,"tag":355,"props":866,"children":867},{"style":797},[868],{"type":49,"value":869},"$CALLER_ARN",{"type":43,"tag":355,"props":871,"children":872},{"style":803},[873],{"type":49,"value":874},"\"",{"type":43,"tag":355,"props":876,"children":877},{"style":803},[878],{"type":49,"value":879}," |",{"type":43,"tag":355,"props":881,"children":882},{"style":362},[883],{"type":49,"value":884}," grep",{"type":43,"tag":355,"props":886,"children":887},{"style":368},[888],{"type":49,"value":889}," -q",{"type":43,"tag":355,"props":891,"children":892},{"style":803},[893],{"type":49,"value":864},{"type":43,"tag":355,"props":895,"children":896},{"style":368},[897],{"type":49,"value":898},":user\u002F",{"type":43,"tag":355,"props":900,"children":901},{"style":803},[902],{"type":49,"value":874},{"type":43,"tag":355,"props":904,"children":905},{"style":803},[906],{"type":49,"value":907},";",{"type":43,"tag":355,"props":909,"children":910},{"style":850},[911],{"type":49,"value":912}," then\n",{"type":43,"tag":355,"props":914,"children":916},{"class":357,"line":915},3,[917,922,926,931,935,939,943,947,952,957,962,967,971,976,981,985],{"type":43,"tag":355,"props":918,"children":919},{"style":797},[920],{"type":49,"value":921},"  IDENTITY_NAME",{"type":43,"tag":355,"props":923,"children":924},{"style":803},[925],{"type":49,"value":806},{"type":43,"tag":355,"props":927,"children":928},{"style":856},[929],{"type":49,"value":930},"echo",{"type":43,"tag":355,"props":932,"children":933},{"style":803},[934],{"type":49,"value":864},{"type":43,"tag":355,"props":936,"children":937},{"style":797},[938],{"type":49,"value":869},{"type":43,"tag":355,"props":940,"children":941},{"style":803},[942],{"type":49,"value":874},{"type":43,"tag":355,"props":944,"children":945},{"style":803},[946],{"type":49,"value":879},{"type":43,"tag":355,"props":948,"children":949},{"style":362},[950],{"type":49,"value":951}," awk",{"type":43,"tag":355,"props":953,"children":954},{"style":368},[955],{"type":49,"value":956}," -F",{"type":43,"tag":355,"props":958,"children":959},{"style":803},[960],{"type":49,"value":961},"'",{"type":43,"tag":355,"props":963,"children":964},{"style":368},[965],{"type":49,"value":966},"\u002F",{"type":43,"tag":355,"props":968,"children":969},{"style":803},[970],{"type":49,"value":961},{"type":43,"tag":355,"props":972,"children":973},{"style":803},[974],{"type":49,"value":975}," '",{"type":43,"tag":355,"props":977,"children":978},{"style":368},[979],{"type":49,"value":980},"{print $NF}",{"type":43,"tag":355,"props":982,"children":983},{"style":803},[984],{"type":49,"value":961},{"type":43,"tag":355,"props":986,"children":987},{"style":803},[988],{"type":49,"value":844},{"type":43,"tag":355,"props":990,"children":992},{"class":357,"line":991},4,[993,998,1003,1008,1013,1017,1022,1026],{"type":43,"tag":355,"props":994,"children":995},{"style":362},[996],{"type":49,"value":997},"  aws",{"type":43,"tag":355,"props":999,"children":1000},{"style":368},[1001],{"type":49,"value":1002}," iam",{"type":43,"tag":355,"props":1004,"children":1005},{"style":368},[1006],{"type":49,"value":1007}," attach-user-policy",{"type":43,"tag":355,"props":1009,"children":1010},{"style":368},[1011],{"type":49,"value":1012}," --user-name",{"type":43,"tag":355,"props":1014,"children":1015},{"style":803},[1016],{"type":49,"value":864},{"type":43,"tag":355,"props":1018,"children":1019},{"style":797},[1020],{"type":49,"value":1021},"$IDENTITY_NAME",{"type":43,"tag":355,"props":1023,"children":1024},{"style":803},[1025],{"type":49,"value":874},{"type":43,"tag":355,"props":1027,"children":1028},{"style":797},[1029],{"type":49,"value":1030}," \\\n",{"type":43,"tag":355,"props":1032,"children":1034},{"class":357,"line":1033},5,[1035,1040,1044,1049],{"type":43,"tag":355,"props":1036,"children":1037},{"style":368},[1038],{"type":49,"value":1039},"    --policy-arn",{"type":43,"tag":355,"props":1041,"children":1042},{"style":803},[1043],{"type":49,"value":864},{"type":43,"tag":355,"props":1045,"children":1046},{"style":368},[1047],{"type":49,"value":1048},"arn:aws:iam::aws:policy\u002FAWSTransformCustomFullAccess",{"type":43,"tag":355,"props":1050,"children":1051},{"style":803},[1052],{"type":49,"value":1053},"\"\n",{"type":43,"tag":355,"props":1055,"children":1057},{"class":357,"line":1056},6,[1058,1063,1067,1071,1075,1079,1083,1087,1092,1096,1101,1105,1109],{"type":43,"tag":355,"props":1059,"children":1060},{"style":850},[1061],{"type":49,"value":1062},"elif",{"type":43,"tag":355,"props":1064,"children":1065},{"style":856},[1066],{"type":49,"value":859},{"type":43,"tag":355,"props":1068,"children":1069},{"style":803},[1070],{"type":49,"value":864},{"type":43,"tag":355,"props":1072,"children":1073},{"style":797},[1074],{"type":49,"value":869},{"type":43,"tag":355,"props":1076,"children":1077},{"style":803},[1078],{"type":49,"value":874},{"type":43,"tag":355,"props":1080,"children":1081},{"style":803},[1082],{"type":49,"value":879},{"type":43,"tag":355,"props":1084,"children":1085},{"style":362},[1086],{"type":49,"value":884},{"type":43,"tag":355,"props":1088,"children":1089},{"style":368},[1090],{"type":49,"value":1091}," -Eq",{"type":43,"tag":355,"props":1093,"children":1094},{"style":803},[1095],{"type":49,"value":864},{"type":43,"tag":355,"props":1097,"children":1098},{"style":368},[1099],{"type":49,"value":1100},":assumed-role\u002F|:role\u002F",{"type":43,"tag":355,"props":1102,"children":1103},{"style":803},[1104],{"type":49,"value":874},{"type":43,"tag":355,"props":1106,"children":1107},{"style":803},[1108],{"type":49,"value":907},{"type":43,"tag":355,"props":1110,"children":1111},{"style":850},[1112],{"type":49,"value":912},{"type":43,"tag":355,"props":1114,"children":1116},{"class":357,"line":1115},7,[1117,1122,1126,1130,1134,1138,1142,1146,1151,1155,1160,1164,1168,1173,1178,1182,1186,1190,1195],{"type":43,"tag":355,"props":1118,"children":1119},{"style":797},[1120],{"type":49,"value":1121},"  ROLE_NAME",{"type":43,"tag":355,"props":1123,"children":1124},{"style":803},[1125],{"type":49,"value":806},{"type":43,"tag":355,"props":1127,"children":1128},{"style":856},[1129],{"type":49,"value":930},{"type":43,"tag":355,"props":1131,"children":1132},{"style":803},[1133],{"type":49,"value":864},{"type":43,"tag":355,"props":1135,"children":1136},{"style":797},[1137],{"type":49,"value":869},{"type":43,"tag":355,"props":1139,"children":1140},{"style":803},[1141],{"type":49,"value":874},{"type":43,"tag":355,"props":1143,"children":1144},{"style":803},[1145],{"type":49,"value":879},{"type":43,"tag":355,"props":1147,"children":1148},{"style":362},[1149],{"type":49,"value":1150}," sed",{"type":43,"tag":355,"props":1152,"children":1153},{"style":803},[1154],{"type":49,"value":975},{"type":43,"tag":355,"props":1156,"children":1157},{"style":368},[1158],{"type":49,"value":1159},"s\u002F.*:\\(assumed-\\)\\{0,1\\}role\\\u002F\u002F\u002F",{"type":43,"tag":355,"props":1161,"children":1162},{"style":803},[1163],{"type":49,"value":961},{"type":43,"tag":355,"props":1165,"children":1166},{"style":803},[1167],{"type":49,"value":879},{"type":43,"tag":355,"props":1169,"children":1170},{"style":362},[1171],{"type":49,"value":1172}," cut",{"type":43,"tag":355,"props":1174,"children":1175},{"style":368},[1176],{"type":49,"value":1177}," -d",{"type":43,"tag":355,"props":1179,"children":1180},{"style":803},[1181],{"type":49,"value":961},{"type":43,"tag":355,"props":1183,"children":1184},{"style":368},[1185],{"type":49,"value":966},{"type":43,"tag":355,"props":1187,"children":1188},{"style":803},[1189],{"type":49,"value":961},{"type":43,"tag":355,"props":1191,"children":1192},{"style":368},[1193],{"type":49,"value":1194}," -f1",{"type":43,"tag":355,"props":1196,"children":1197},{"style":803},[1198],{"type":49,"value":844},{"type":43,"tag":355,"props":1200,"children":1202},{"class":357,"line":1201},8,[1203,1207,1211,1216,1221,1225,1230,1234],{"type":43,"tag":355,"props":1204,"children":1205},{"style":362},[1206],{"type":49,"value":997},{"type":43,"tag":355,"props":1208,"children":1209},{"style":368},[1210],{"type":49,"value":1002},{"type":43,"tag":355,"props":1212,"children":1213},{"style":368},[1214],{"type":49,"value":1215}," attach-role-policy",{"type":43,"tag":355,"props":1217,"children":1218},{"style":368},[1219],{"type":49,"value":1220}," --role-name",{"type":43,"tag":355,"props":1222,"children":1223},{"style":803},[1224],{"type":49,"value":864},{"type":43,"tag":355,"props":1226,"children":1227},{"style":797},[1228],{"type":49,"value":1229},"$ROLE_NAME",{"type":43,"tag":355,"props":1231,"children":1232},{"style":803},[1233],{"type":49,"value":874},{"type":43,"tag":355,"props":1235,"children":1236},{"style":797},[1237],{"type":49,"value":1030},{"type":43,"tag":355,"props":1239,"children":1241},{"class":357,"line":1240},9,[1242,1246,1250,1254],{"type":43,"tag":355,"props":1243,"children":1244},{"style":368},[1245],{"type":49,"value":1039},{"type":43,"tag":355,"props":1247,"children":1248},{"style":803},[1249],{"type":49,"value":864},{"type":43,"tag":355,"props":1251,"children":1252},{"style":368},[1253],{"type":49,"value":1048},{"type":43,"tag":355,"props":1255,"children":1256},{"style":803},[1257],{"type":49,"value":1053},{"type":43,"tag":355,"props":1259,"children":1261},{"class":357,"line":1260},10,[1262],{"type":43,"tag":355,"props":1263,"children":1264},{"style":850},[1265],{"type":49,"value":1266},"fi\n",{"type":43,"tag":59,"props":1268,"children":1269},{},[1270,1272,1277,1279,1285],{"type":49,"value":1271},"If the attachment command itself fails (e.g., insufficient IAM permissions, or an\nSSO-managed role), inform the user they need to ask their AWS administrator to\nattach the ",{"type":43,"tag":241,"props":1273,"children":1275},{"className":1274},[],[1276],{"type":49,"value":777},{"type":49,"value":1278}," AWS-managed policy to their identity.\nFor SSO users (role names starting with ",{"type":43,"tag":241,"props":1280,"children":1282},{"className":1281},[],[1283],{"type":49,"value":1284},"AWSReservedSSO_",{"type":49,"value":1286},"), this must be added\nto their IAM Identity Center permission set — it cannot be attached directly.",{"type":43,"tag":59,"props":1288,"children":1289},{},[1290,1291,1296],{"type":49,"value":496},{"type":43,"tag":241,"props":1292,"children":1294},{"className":1293},[],[1295],{"type":49,"value":246},{"type":49,"value":504},{"type":43,"tag":59,"props":1298,"children":1299},{},[1300,1302,1307],{"type":49,"value":1301},"Remote mode requires additional permissions (Lambda invoke, S3, KMS, Secrets Manager,\nCloudWatch). These are generated and attached as part of the deployment flow — see\n",{"type":43,"tag":160,"props":1303,"children":1305},{"href":1304},"references\u002Fremote-execution.md",[1306],{"type":49,"value":1304},{"type":49,"value":1308},".",{"type":43,"tag":59,"props":1310,"children":1311},{},[1312,1314,1319],{"type":49,"value":1313},"See ",{"type":43,"tag":160,"props":1315,"children":1317},{"href":1316},"references\u002Fcli-reference.md",[1318],{"type":49,"value":1316},{"type":49,"value":1320}," for the full permission list.",{"type":43,"tag":305,"props":1322,"children":1324},{"id":1323},"_5-aws-cdk-remote-mode-only",[1325],{"type":49,"value":1326},"5. AWS CDK (Remote Mode Only)",{"type":43,"tag":59,"props":1328,"children":1329},{},[1330],{"type":49,"value":1331},"Required for deploying remote infrastructure. Check if installed:",{"type":43,"tag":344,"props":1333,"children":1335},{"className":346,"code":1334,"language":348,"meta":349,"style":349},"cdk --version\n",[1336],{"type":43,"tag":241,"props":1337,"children":1338},{"__ignoreMap":349},[1339],{"type":43,"tag":355,"props":1340,"children":1341},{"class":357,"line":358},[1342,1347],{"type":43,"tag":355,"props":1343,"children":1344},{"style":362},[1345],{"type":49,"value":1346},"cdk",{"type":43,"tag":355,"props":1348,"children":1349},{"style":368},[1350],{"type":49,"value":454},{"type":43,"tag":59,"props":1352,"children":1353},{},[1354],{"type":49,"value":1355},"If not installed, install it globally:",{"type":43,"tag":344,"props":1357,"children":1359},{"className":346,"code":1358,"language":348,"meta":349,"style":349},"npm install -g aws-cdk\n",[1360],{"type":43,"tag":241,"props":1361,"children":1362},{"__ignoreMap":349},[1363],{"type":43,"tag":355,"props":1364,"children":1365},{"class":357,"line":358},[1366,1371,1376,1381],{"type":43,"tag":355,"props":1367,"children":1368},{"style":362},[1369],{"type":49,"value":1370},"npm",{"type":43,"tag":355,"props":1372,"children":1373},{"style":368},[1374],{"type":49,"value":1375}," install",{"type":43,"tag":355,"props":1377,"children":1378},{"style":368},[1379],{"type":49,"value":1380}," -g",{"type":43,"tag":355,"props":1382,"children":1383},{"style":368},[1384],{"type":49,"value":1385}," aws-cdk\n",{"type":43,"tag":59,"props":1387,"children":1388},{},[1389,1391,1397],{"type":49,"value":1390},"Do NOT proceed with remote deployment until ",{"type":43,"tag":241,"props":1392,"children":1394},{"className":1393},[],[1395],{"type":49,"value":1396},"cdk --version",{"type":49,"value":504},{"type":43,"tag":305,"props":1399,"children":1401},{"id":1400},"_6-remote-infrastructure-remote-mode-only-deferred",[1402],{"type":49,"value":1403},"6. Remote Infrastructure (Remote Mode Only — Deferred)",{"type":43,"tag":59,"props":1405,"children":1406},{},[1407,1409,1415,1417,1423,1425,1429],{"type":49,"value":1408},"Only verify if user chooses remote mode. The infrastructure CDK scripts are fetched\nat runtime by cloning ",{"type":43,"tag":241,"props":1410,"children":1412},{"className":1411},[],[1413],{"type":49,"value":1414},"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Faws-transform-custom-samples.git",{"type":49,"value":1416}," (branch ",{"type":43,"tag":241,"props":1418,"children":1420},{"className":1419},[],[1421],{"type":49,"value":1422},"atx-remote-infra",{"type":49,"value":1424},") —\nthey are not bundled with this skill. See ",{"type":43,"tag":160,"props":1426,"children":1427},{"href":1304},[1428],{"type":49,"value":1304},{"type":49,"value":1308},{"type":43,"tag":52,"props":1431,"children":1433},{"id":1432},"workflow",[1434],{"type":49,"value":1435},"Workflow",{"type":43,"tag":59,"props":1437,"children":1438},{},[1439],{"type":49,"value":1440},"Generate a session timestamp once and reuse it for all paths in this session:",{"type":43,"tag":344,"props":1442,"children":1444},{"className":346,"code":1443,"language":348,"meta":349,"style":349},"SESSION_TS=$(date +%Y%m%d-%H%M%S)\n",[1445],{"type":43,"tag":241,"props":1446,"children":1447},{"__ignoreMap":349},[1448],{"type":43,"tag":355,"props":1449,"children":1450},{"class":357,"line":358},[1451,1456,1460,1465,1470],{"type":43,"tag":355,"props":1452,"children":1453},{"style":797},[1454],{"type":49,"value":1455},"SESSION_TS",{"type":43,"tag":355,"props":1457,"children":1458},{"style":803},[1459],{"type":49,"value":806},{"type":43,"tag":355,"props":1461,"children":1462},{"style":362},[1463],{"type":49,"value":1464},"date",{"type":43,"tag":355,"props":1466,"children":1467},{"style":368},[1468],{"type":49,"value":1469}," +%Y%m%d-%H%M%S",{"type":43,"tag":355,"props":1471,"children":1472},{"style":803},[1473],{"type":49,"value":844},{"type":43,"tag":305,"props":1475,"children":1477},{"id":1476},"step-1-collect-repositories",[1478],{"type":49,"value":1479},"Step 1: Collect Repositories",{"type":43,"tag":59,"props":1481,"children":1482},{},[1483],{"type":49,"value":1484},"Ask the user for local paths or git URLs. Accept one or many. Do NOT assume the\ncurrent working directory or open editor files are the target — wait for the user\nto explicitly provide repositories.",{"type":43,"tag":59,"props":1486,"children":1487},{},[1488],{"type":49,"value":1489},"Accepted source formats:",{"type":43,"tag":70,"props":1491,"children":1492},{},[1493,1511,1528,1544],{"type":43,"tag":74,"props":1494,"children":1495},{},[1496,1501,1503,1509],{"type":43,"tag":78,"props":1497,"children":1498},{},[1499],{"type":49,"value":1500},"Local paths",{"type":49,"value":1502}," — directories on the user's machine (e.g., ",{"type":43,"tag":241,"props":1504,"children":1506},{"className":1505},[],[1507],{"type":49,"value":1508},"\u002Fhome\u002Fuser\u002Fmy-project",{"type":49,"value":1510},")",{"type":43,"tag":74,"props":1512,"children":1513},{},[1514,1519,1521,1527],{"type":43,"tag":78,"props":1515,"children":1516},{},[1517],{"type":49,"value":1518},"HTTPS git URLs",{"type":49,"value":1520}," — public or private (e.g., ",{"type":43,"tag":241,"props":1522,"children":1524},{"className":1523},[],[1525],{"type":49,"value":1526},"https:\u002F\u002Fgithub.com\u002Forg\u002Frepo.git",{"type":49,"value":1510},{"type":43,"tag":74,"props":1529,"children":1530},{},[1531,1536,1538],{"type":43,"tag":78,"props":1532,"children":1533},{},[1534],{"type":49,"value":1535},"SSH git URLs",{"type":49,"value":1537}," — e.g., ",{"type":43,"tag":241,"props":1539,"children":1541},{"className":1540},[],[1542],{"type":49,"value":1543},"git@github.com:org\u002Frepo.git",{"type":43,"tag":74,"props":1545,"children":1546},{},[1547,1552,1553,1559],{"type":43,"tag":78,"props":1548,"children":1549},{},[1550],{"type":49,"value":1551},"S3 bucket path with zips",{"type":49,"value":1537},{"type":43,"tag":241,"props":1554,"children":1556},{"className":1555},[],[1557],{"type":49,"value":1558},"s3:\u002F\u002Fmy-bucket\u002Frepos\u002F",{"type":49,"value":1560},"\ncontaining zip files of repositories. Each zip becomes one transformation job.",{"type":43,"tag":1562,"props":1563,"children":1565},"h4",{"id":1564},"s3-bucket-input",[1566],{"type":49,"value":1567},"S3 Bucket Input",{"type":43,"tag":59,"props":1569,"children":1570},{},[1571],{"type":49,"value":1572},"If the user provides an S3 path containing zip files, ask which execution mode\nthey prefer (if not already specified). S3 input works in both modes:",{"type":43,"tag":59,"props":1574,"children":1575},{},[1576,1581],{"type":43,"tag":78,"props":1577,"children":1578},{},[1579],{"type":49,"value":1580},"Remote mode:",{"type":49,"value":1582}," Copy the zips from the user's bucket to the managed source bucket,\nthen submit jobs pointing to the managed copies:",{"type":43,"tag":344,"props":1584,"children":1586},{"className":346,"code":1585,"language":348,"meta":349,"style":349},"ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)\nSOURCE_BUCKET=\"atx-source-code-${ACCOUNT_ID}\"\n\n# List all zips in the user's bucket path\naws s3 ls s3:\u002F\u002Fuser-bucket\u002Frepos\u002F --recursive | grep '\\.zip$'\n\n# Copy each zip to the managed source bucket\naws s3 sync s3:\u002F\u002Fuser-bucket\u002Frepos\u002F s3:\u002F\u002F${SOURCE_BUCKET}\u002Frepos\u002F --exclude \"*\" --include \"*.zip\"\n",[1587],{"type":43,"tag":241,"props":1588,"children":1589},{"__ignoreMap":349},[1590,1635,1671,1680,1688,1737,1744,1752],{"type":43,"tag":355,"props":1591,"children":1592},{"class":357,"line":358},[1593,1598,1602,1606,1610,1614,1618,1623,1627,1631],{"type":43,"tag":355,"props":1594,"children":1595},{"style":797},[1596],{"type":49,"value":1597},"ACCOUNT_ID",{"type":43,"tag":355,"props":1599,"children":1600},{"style":803},[1601],{"type":49,"value":806},{"type":43,"tag":355,"props":1603,"children":1604},{"style":362},[1605],{"type":49,"value":8},{"type":43,"tag":355,"props":1607,"children":1608},{"style":368},[1609],{"type":49,"value":529},{"type":43,"tag":355,"props":1611,"children":1612},{"style":368},[1613],{"type":49,"value":819},{"type":43,"tag":355,"props":1615,"children":1616},{"style":368},[1617],{"type":49,"value":824},{"type":43,"tag":355,"props":1619,"children":1620},{"style":368},[1621],{"type":49,"value":1622}," Account",{"type":43,"tag":355,"props":1624,"children":1625},{"style":368},[1626],{"type":49,"value":834},{"type":43,"tag":355,"props":1628,"children":1629},{"style":368},[1630],{"type":49,"value":839},{"type":43,"tag":355,"props":1632,"children":1633},{"style":803},[1634],{"type":49,"value":844},{"type":43,"tag":355,"props":1636,"children":1637},{"class":357,"line":630},[1638,1643,1648,1652,1657,1662,1666],{"type":43,"tag":355,"props":1639,"children":1640},{"style":797},[1641],{"type":49,"value":1642},"SOURCE_BUCKET",{"type":43,"tag":355,"props":1644,"children":1645},{"style":803},[1646],{"type":49,"value":1647},"=",{"type":43,"tag":355,"props":1649,"children":1650},{"style":803},[1651],{"type":49,"value":874},{"type":43,"tag":355,"props":1653,"children":1654},{"style":368},[1655],{"type":49,"value":1656},"atx-source-code-",{"type":43,"tag":355,"props":1658,"children":1659},{"style":803},[1660],{"type":49,"value":1661},"${",{"type":43,"tag":355,"props":1663,"children":1664},{"style":797},[1665],{"type":49,"value":1597},{"type":43,"tag":355,"props":1667,"children":1668},{"style":803},[1669],{"type":49,"value":1670},"}\"\n",{"type":43,"tag":355,"props":1672,"children":1673},{"class":357,"line":915},[1674],{"type":43,"tag":355,"props":1675,"children":1677},{"emptyLinePlaceholder":1676},true,[1678],{"type":49,"value":1679},"\n",{"type":43,"tag":355,"props":1681,"children":1682},{"class":357,"line":991},[1683],{"type":43,"tag":355,"props":1684,"children":1685},{"style":634},[1686],{"type":49,"value":1687},"# List all zips in the user's bucket path\n",{"type":43,"tag":355,"props":1689,"children":1690},{"class":357,"line":1033},[1691,1695,1700,1705,1710,1715,1719,1723,1727,1732],{"type":43,"tag":355,"props":1692,"children":1693},{"style":362},[1694],{"type":49,"value":8},{"type":43,"tag":355,"props":1696,"children":1697},{"style":368},[1698],{"type":49,"value":1699}," s3",{"type":43,"tag":355,"props":1701,"children":1702},{"style":368},[1703],{"type":49,"value":1704}," ls",{"type":43,"tag":355,"props":1706,"children":1707},{"style":368},[1708],{"type":49,"value":1709}," s3:\u002F\u002Fuser-bucket\u002Frepos\u002F",{"type":43,"tag":355,"props":1711,"children":1712},{"style":368},[1713],{"type":49,"value":1714}," --recursive",{"type":43,"tag":355,"props":1716,"children":1717},{"style":803},[1718],{"type":49,"value":879},{"type":43,"tag":355,"props":1720,"children":1721},{"style":362},[1722],{"type":49,"value":884},{"type":43,"tag":355,"props":1724,"children":1725},{"style":803},[1726],{"type":49,"value":975},{"type":43,"tag":355,"props":1728,"children":1729},{"style":368},[1730],{"type":49,"value":1731},"\\.zip$",{"type":43,"tag":355,"props":1733,"children":1734},{"style":803},[1735],{"type":49,"value":1736},"'\n",{"type":43,"tag":355,"props":1738,"children":1739},{"class":357,"line":1056},[1740],{"type":43,"tag":355,"props":1741,"children":1742},{"emptyLinePlaceholder":1676},[1743],{"type":49,"value":1679},{"type":43,"tag":355,"props":1745,"children":1746},{"class":357,"line":1115},[1747],{"type":43,"tag":355,"props":1748,"children":1749},{"style":634},[1750],{"type":49,"value":1751},"# Copy each zip to the managed source bucket\n",{"type":43,"tag":355,"props":1753,"children":1754},{"class":357,"line":1201},[1755,1759,1763,1768,1772,1777,1781,1785,1790,1795,1800,1804,1809,1813,1818,1822,1827],{"type":43,"tag":355,"props":1756,"children":1757},{"style":362},[1758],{"type":49,"value":8},{"type":43,"tag":355,"props":1760,"children":1761},{"style":368},[1762],{"type":49,"value":1699},{"type":43,"tag":355,"props":1764,"children":1765},{"style":368},[1766],{"type":49,"value":1767}," sync",{"type":43,"tag":355,"props":1769,"children":1770},{"style":368},[1771],{"type":49,"value":1709},{"type":43,"tag":355,"props":1773,"children":1774},{"style":368},[1775],{"type":49,"value":1776}," s3:\u002F\u002F",{"type":43,"tag":355,"props":1778,"children":1779},{"style":803},[1780],{"type":49,"value":1661},{"type":43,"tag":355,"props":1782,"children":1783},{"style":797},[1784],{"type":49,"value":1642},{"type":43,"tag":355,"props":1786,"children":1787},{"style":803},[1788],{"type":49,"value":1789},"}",{"type":43,"tag":355,"props":1791,"children":1792},{"style":368},[1793],{"type":49,"value":1794},"\u002Frepos\u002F",{"type":43,"tag":355,"props":1796,"children":1797},{"style":368},[1798],{"type":49,"value":1799}," --exclude",{"type":43,"tag":355,"props":1801,"children":1802},{"style":803},[1803],{"type":49,"value":864},{"type":43,"tag":355,"props":1805,"children":1806},{"style":368},[1807],{"type":49,"value":1808},"*",{"type":43,"tag":355,"props":1810,"children":1811},{"style":803},[1812],{"type":49,"value":874},{"type":43,"tag":355,"props":1814,"children":1815},{"style":368},[1816],{"type":49,"value":1817}," --include",{"type":43,"tag":355,"props":1819,"children":1820},{"style":803},[1821],{"type":49,"value":864},{"type":43,"tag":355,"props":1823,"children":1824},{"style":368},[1825],{"type":49,"value":1826},"*.zip",{"type":43,"tag":355,"props":1828,"children":1829},{"style":803},[1830],{"type":49,"value":1053},{"type":43,"tag":59,"props":1832,"children":1833},{},[1834,1836,1842,1844,1849],{"type":49,"value":1835},"Then submit a batch job with one job per zip, each pointing to\n",{"type":43,"tag":241,"props":1837,"children":1839},{"className":1838},[],[1840],{"type":49,"value":1841},"s3:\u002F\u002F${SOURCE_BUCKET}\u002Frepos\u002F\u003Cfilename>.zip",{"type":49,"value":1843},". The container handles zip extraction\nautomatically. See ",{"type":43,"tag":160,"props":1845,"children":1847},{"href":1846},"references\u002Fmulti-transformation.md",[1848],{"type":49,"value":1846},{"type":49,"value":1850}," for batch submission.\nThe managed source bucket has a 7-day lifecycle — copied zips auto-delete.",{"type":43,"tag":59,"props":1852,"children":1853},{},[1854,1859],{"type":43,"tag":78,"props":1855,"children":1856},{},[1857],{"type":49,"value":1858},"Local mode:",{"type":49,"value":1860}," Download and extract each zip locally:",{"type":43,"tag":344,"props":1862,"children":1864},{"className":346,"code":1863,"language":348,"meta":349,"style":349},"mkdir -p ~\u002F.aws\u002Fatx\u002Fcustom\u002Fatx-agent-session\u002Frepos\naws s3 sync s3:\u002F\u002Fuser-bucket\u002Frepos\u002F ~\u002F.aws\u002Fatx\u002Fcustom\u002Fatx-agent-session\u002Frepos\u002F --exclude \"*\" --include \"*.zip\"\nfor zip in ~\u002F.aws\u002Fatx\u002Fcustom\u002Fatx-agent-session\u002Frepos\u002F*.zip; do\n  name=$(basename \"$zip\" .zip)\n  unzip -qo \"$zip\" -d \"$HOME\u002F.aws\u002Fatx\u002Fcustom\u002Fatx-agent-session\u002Frepos\u002F${name}-$SESSION_TS\u002F\"\ndone\n",[1865],{"type":43,"tag":241,"props":1866,"children":1867},{"__ignoreMap":349},[1868,1886,1942,1974,2013,2087],{"type":43,"tag":355,"props":1869,"children":1870},{"class":357,"line":358},[1871,1876,1881],{"type":43,"tag":355,"props":1872,"children":1873},{"style":362},[1874],{"type":49,"value":1875},"mkdir",{"type":43,"tag":355,"props":1877,"children":1878},{"style":368},[1879],{"type":49,"value":1880}," -p",{"type":43,"tag":355,"props":1882,"children":1883},{"style":368},[1884],{"type":49,"value":1885}," ~\u002F.aws\u002Fatx\u002Fcustom\u002Fatx-agent-session\u002Frepos\n",{"type":43,"tag":355,"props":1887,"children":1888},{"class":357,"line":630},[1889,1893,1897,1901,1905,1910,1914,1918,1922,1926,1930,1934,1938],{"type":43,"tag":355,"props":1890,"children":1891},{"style":362},[1892],{"type":49,"value":8},{"type":43,"tag":355,"props":1894,"children":1895},{"style":368},[1896],{"type":49,"value":1699},{"type":43,"tag":355,"props":1898,"children":1899},{"style":368},[1900],{"type":49,"value":1767},{"type":43,"tag":355,"props":1902,"children":1903},{"style":368},[1904],{"type":49,"value":1709},{"type":43,"tag":355,"props":1906,"children":1907},{"style":368},[1908],{"type":49,"value":1909}," ~\u002F.aws\u002Fatx\u002Fcustom\u002Fatx-agent-session\u002Frepos\u002F",{"type":43,"tag":355,"props":1911,"children":1912},{"style":368},[1913],{"type":49,"value":1799},{"type":43,"tag":355,"props":1915,"children":1916},{"style":803},[1917],{"type":49,"value":864},{"type":43,"tag":355,"props":1919,"children":1920},{"style":368},[1921],{"type":49,"value":1808},{"type":43,"tag":355,"props":1923,"children":1924},{"style":803},[1925],{"type":49,"value":874},{"type":43,"tag":355,"props":1927,"children":1928},{"style":368},[1929],{"type":49,"value":1817},{"type":43,"tag":355,"props":1931,"children":1932},{"style":803},[1933],{"type":49,"value":864},{"type":43,"tag":355,"props":1935,"children":1936},{"style":368},[1937],{"type":49,"value":1826},{"type":43,"tag":355,"props":1939,"children":1940},{"style":803},[1941],{"type":49,"value":1053},{"type":43,"tag":355,"props":1943,"children":1944},{"class":357,"line":915},[1945,1950,1955,1960,1965,1969],{"type":43,"tag":355,"props":1946,"children":1947},{"style":850},[1948],{"type":49,"value":1949},"for",{"type":43,"tag":355,"props":1951,"children":1952},{"style":797},[1953],{"type":49,"value":1954}," zip ",{"type":43,"tag":355,"props":1956,"children":1957},{"style":850},[1958],{"type":49,"value":1959},"in",{"type":43,"tag":355,"props":1961,"children":1962},{"style":368},[1963],{"type":49,"value":1964}," ~\u002F.aws\u002Fatx\u002Fcustom\u002Fatx-agent-session\u002Frepos\u002F*.zip",{"type":43,"tag":355,"props":1966,"children":1967},{"style":803},[1968],{"type":49,"value":907},{"type":43,"tag":355,"props":1970,"children":1971},{"style":850},[1972],{"type":49,"value":1973}," do\n",{"type":43,"tag":355,"props":1975,"children":1976},{"class":357,"line":991},[1977,1982,1986,1991,1995,2000,2004,2009],{"type":43,"tag":355,"props":1978,"children":1979},{"style":797},[1980],{"type":49,"value":1981},"  name",{"type":43,"tag":355,"props":1983,"children":1984},{"style":803},[1985],{"type":49,"value":806},{"type":43,"tag":355,"props":1987,"children":1988},{"style":362},[1989],{"type":49,"value":1990},"basename",{"type":43,"tag":355,"props":1992,"children":1993},{"style":803},[1994],{"type":49,"value":864},{"type":43,"tag":355,"props":1996,"children":1997},{"style":797},[1998],{"type":49,"value":1999},"$zip",{"type":43,"tag":355,"props":2001,"children":2002},{"style":803},[2003],{"type":49,"value":874},{"type":43,"tag":355,"props":2005,"children":2006},{"style":368},[2007],{"type":49,"value":2008}," .zip",{"type":43,"tag":355,"props":2010,"children":2011},{"style":803},[2012],{"type":49,"value":844},{"type":43,"tag":355,"props":2014,"children":2015},{"class":357,"line":1033},[2016,2021,2026,2030,2034,2038,2042,2046,2051,2056,2060,2065,2069,2074,2079,2083],{"type":43,"tag":355,"props":2017,"children":2018},{"style":362},[2019],{"type":49,"value":2020},"  unzip",{"type":43,"tag":355,"props":2022,"children":2023},{"style":368},[2024],{"type":49,"value":2025}," -qo",{"type":43,"tag":355,"props":2027,"children":2028},{"style":803},[2029],{"type":49,"value":864},{"type":43,"tag":355,"props":2031,"children":2032},{"style":797},[2033],{"type":49,"value":1999},{"type":43,"tag":355,"props":2035,"children":2036},{"style":803},[2037],{"type":49,"value":874},{"type":43,"tag":355,"props":2039,"children":2040},{"style":368},[2041],{"type":49,"value":1177},{"type":43,"tag":355,"props":2043,"children":2044},{"style":803},[2045],{"type":49,"value":864},{"type":43,"tag":355,"props":2047,"children":2048},{"style":797},[2049],{"type":49,"value":2050},"$HOME",{"type":43,"tag":355,"props":2052,"children":2053},{"style":368},[2054],{"type":49,"value":2055},"\u002F.aws\u002Fatx\u002Fcustom\u002Fatx-agent-session\u002Frepos\u002F",{"type":43,"tag":355,"props":2057,"children":2058},{"style":803},[2059],{"type":49,"value":1661},{"type":43,"tag":355,"props":2061,"children":2062},{"style":797},[2063],{"type":49,"value":2064},"name",{"type":43,"tag":355,"props":2066,"children":2067},{"style":803},[2068],{"type":49,"value":1789},{"type":43,"tag":355,"props":2070,"children":2071},{"style":368},[2072],{"type":49,"value":2073},"-",{"type":43,"tag":355,"props":2075,"children":2076},{"style":797},[2077],{"type":49,"value":2078},"$SESSION_TS",{"type":43,"tag":355,"props":2080,"children":2081},{"style":368},[2082],{"type":49,"value":966},{"type":43,"tag":355,"props":2084,"children":2085},{"style":803},[2086],{"type":49,"value":1053},{"type":43,"tag":355,"props":2088,"children":2089},{"class":357,"line":1056},[2090],{"type":43,"tag":355,"props":2091,"children":2092},{"style":850},[2093],{"type":49,"value":2094},"done\n",{"type":43,"tag":59,"props":2096,"children":2097},{},[2098,2100,2106],{"type":49,"value":2099},"Use the extracted directories as ",{"type":43,"tag":241,"props":2101,"children":2103},{"className":2102},[],[2104],{"type":49,"value":2105},"\u003Crepo-path>",{"type":49,"value":2107}," for local execution. Standard local\nmode limits apply (max 3 concurrent repos).",{"type":43,"tag":1562,"props":2109,"children":2111},{"id":2110},"private-repository-detection-remote-mode",[2112],{"type":49,"value":2113},"Private Repository Detection (Remote Mode)",{"type":43,"tag":59,"props":2115,"children":2116},{},[2117,2122],{"type":43,"tag":78,"props":2118,"children":2119},{},[2120],{"type":49,"value":2121},"Always ask the user",{"type":49,"value":2123}," — do NOT try to determine repo visibility yourself. Never\nattempt to clone, curl, or probe a URL to check if it's public or private. Simply\nask the user. As soon as the user provides git URLs and remote mode is selected\n(or likely), ask:",{"type":43,"tag":317,"props":2125,"children":2126},{},[2127],{"type":43,"tag":59,"props":2128,"children":2129},{},[2130],{"type":49,"value":2131},"\"Are any of these repositories private? If so, the remote container needs\ncredentials to clone them — I'll walk you through the setup.\"",{"type":43,"tag":59,"props":2133,"children":2134},{},[2135],{"type":49,"value":2136},"Do NOT skip this question. Do NOT try to infer visibility by attempting a clone,\ncurl, or any other network request. Just ask.",{"type":43,"tag":59,"props":2138,"children":2139},{},[2140],{"type":49,"value":2141},"If the user confirms repos are private, determine the credential type based on URL format:",{"type":43,"tag":59,"props":2143,"children":2144},{},[2145],{"type":49,"value":2146},"First, resolve the region (use for all Secrets Manager commands below):",{"type":43,"tag":344,"props":2148,"children":2150},{"className":346,"code":2149,"language":348,"meta":349,"style":349},"REGION=${AWS_REGION:-${AWS_DEFAULT_REGION:-$(aws configure get region 2>\u002Fdev\u002Fnull)}}\nREGION=${REGION:-us-east-1}\n",[2151],{"type":43,"tag":241,"props":2152,"children":2153},{"__ignoreMap":349},[2154,2215],{"type":43,"tag":355,"props":2155,"children":2156},{"class":357,"line":358},[2157,2162,2167,2172,2177,2182,2187,2192,2196,2201,2205,2210],{"type":43,"tag":355,"props":2158,"children":2159},{"style":797},[2160],{"type":49,"value":2161},"REGION",{"type":43,"tag":355,"props":2163,"children":2164},{"style":803},[2165],{"type":49,"value":2166},"=${",{"type":43,"tag":355,"props":2168,"children":2169},{"style":797},[2170],{"type":49,"value":2171},"AWS_REGION",{"type":43,"tag":355,"props":2173,"children":2174},{"style":803},[2175],{"type":49,"value":2176},":-${",{"type":43,"tag":355,"props":2178,"children":2179},{"style":797},[2180],{"type":49,"value":2181},"AWS_DEFAULT_REGION",{"type":43,"tag":355,"props":2183,"children":2184},{"style":803},[2185],{"type":49,"value":2186},":-",{"type":43,"tag":355,"props":2188,"children":2189},{"style":797},[2190],{"type":49,"value":2191},"$(aws configure get region 2>",{"type":43,"tag":355,"props":2193,"children":2194},{"style":803},[2195],{"type":49,"value":966},{"type":43,"tag":355,"props":2197,"children":2198},{"style":797},[2199],{"type":49,"value":2200},"dev",{"type":43,"tag":355,"props":2202,"children":2203},{"style":803},[2204],{"type":49,"value":966},{"type":43,"tag":355,"props":2206,"children":2207},{"style":797},[2208],{"type":49,"value":2209},"null)",{"type":43,"tag":355,"props":2211,"children":2212},{"style":803},[2213],{"type":49,"value":2214},"}}\n",{"type":43,"tag":355,"props":2216,"children":2217},{"class":357,"line":630},[2218,2222,2226,2230,2234,2239],{"type":43,"tag":355,"props":2219,"children":2220},{"style":797},[2221],{"type":49,"value":2161},{"type":43,"tag":355,"props":2223,"children":2224},{"style":803},[2225],{"type":49,"value":2166},{"type":43,"tag":355,"props":2227,"children":2228},{"style":797},[2229],{"type":49,"value":2161},{"type":43,"tag":355,"props":2231,"children":2232},{"style":803},[2233],{"type":49,"value":2186},{"type":43,"tag":355,"props":2235,"children":2236},{"style":797},[2237],{"type":49,"value":2238},"us-east-1",{"type":43,"tag":355,"props":2240,"children":2241},{"style":803},[2242],{"type":49,"value":2243},"}\n",{"type":43,"tag":59,"props":2245,"children":2246},{},[2247,2252],{"type":43,"tag":78,"props":2248,"children":2249},{},[2250],{"type":49,"value":2251},"For HTTPS URLs",{"type":49,"value":2253}," — check whether a GitHub PAT is already configured:",{"type":43,"tag":344,"props":2255,"children":2257},{"className":346,"code":2256,"language":348,"meta":349,"style":349},"aws secretsmanager describe-secret --secret-id \"atx\u002Fgithub-token\" --region \"$REGION\" 2>\u002Fdev\u002Fnull \\\n  && echo \"CONFIGURED\" || echo \"NOT_CONFIGURED\"\n",[2258],{"type":43,"tag":241,"props":2259,"children":2260},{"__ignoreMap":349},[2261,2328],{"type":43,"tag":355,"props":2262,"children":2263},{"class":357,"line":358},[2264,2268,2273,2278,2283,2287,2292,2296,2301,2305,2310,2314,2319,2324],{"type":43,"tag":355,"props":2265,"children":2266},{"style":362},[2267],{"type":49,"value":8},{"type":43,"tag":355,"props":2269,"children":2270},{"style":368},[2271],{"type":49,"value":2272}," secretsmanager",{"type":43,"tag":355,"props":2274,"children":2275},{"style":368},[2276],{"type":49,"value":2277}," describe-secret",{"type":43,"tag":355,"props":2279,"children":2280},{"style":368},[2281],{"type":49,"value":2282}," --secret-id",{"type":43,"tag":355,"props":2284,"children":2285},{"style":803},[2286],{"type":49,"value":864},{"type":43,"tag":355,"props":2288,"children":2289},{"style":368},[2290],{"type":49,"value":2291},"atx\u002Fgithub-token",{"type":43,"tag":355,"props":2293,"children":2294},{"style":803},[2295],{"type":49,"value":874},{"type":43,"tag":355,"props":2297,"children":2298},{"style":368},[2299],{"type":49,"value":2300}," --region",{"type":43,"tag":355,"props":2302,"children":2303},{"style":803},[2304],{"type":49,"value":864},{"type":43,"tag":355,"props":2306,"children":2307},{"style":797},[2308],{"type":49,"value":2309},"$REGION",{"type":43,"tag":355,"props":2311,"children":2312},{"style":803},[2313],{"type":49,"value":874},{"type":43,"tag":355,"props":2315,"children":2316},{"style":803},[2317],{"type":49,"value":2318}," 2>",{"type":43,"tag":355,"props":2320,"children":2321},{"style":368},[2322],{"type":49,"value":2323},"\u002Fdev\u002Fnull",{"type":43,"tag":355,"props":2325,"children":2326},{"style":797},[2327],{"type":49,"value":1030},{"type":43,"tag":355,"props":2329,"children":2330},{"class":357,"line":630},[2331,2336,2340,2344,2349,2353,2358,2362,2366,2371],{"type":43,"tag":355,"props":2332,"children":2333},{"style":803},[2334],{"type":49,"value":2335},"  &&",{"type":43,"tag":355,"props":2337,"children":2338},{"style":856},[2339],{"type":49,"value":859},{"type":43,"tag":355,"props":2341,"children":2342},{"style":803},[2343],{"type":49,"value":864},{"type":43,"tag":355,"props":2345,"children":2346},{"style":368},[2347],{"type":49,"value":2348},"CONFIGURED",{"type":43,"tag":355,"props":2350,"children":2351},{"style":803},[2352],{"type":49,"value":874},{"type":43,"tag":355,"props":2354,"children":2355},{"style":803},[2356],{"type":49,"value":2357}," ||",{"type":43,"tag":355,"props":2359,"children":2360},{"style":856},[2361],{"type":49,"value":859},{"type":43,"tag":355,"props":2363,"children":2364},{"style":803},[2365],{"type":49,"value":864},{"type":43,"tag":355,"props":2367,"children":2368},{"style":368},[2369],{"type":49,"value":2370},"NOT_CONFIGURED",{"type":43,"tag":355,"props":2372,"children":2373},{"style":803},[2374],{"type":49,"value":1053},{"type":43,"tag":59,"props":2376,"children":2377},{},[2378],{"type":49,"value":2379},"If CONFIGURED, ask the user: \"A GitHub PAT is already stored. Would you like to\nkeep using it, or replace it with a new one?\" If they want to replace it, tell\nthem to run:",{"type":43,"tag":344,"props":2381,"children":2384},{"className":2382,"code":2383,"language":49},[543],"aws secretsmanager put-secret-value --secret-id \"atx\u002Fgithub-token\" --region \"$REGION\" --secret-string \"YOUR_TOKEN_HERE\"\n",[2385],{"type":43,"tag":241,"props":2386,"children":2387},{"__ignoreMap":349},[2388],{"type":49,"value":2383},{"type":43,"tag":59,"props":2390,"children":2391},{},[2392],{"type":49,"value":2393},"If NOT_CONFIGURED, explain what's needed and tell the user to run the create command:",{"type":43,"tag":317,"props":2395,"children":2396},{},[2397,2402,2423,2432],{"type":43,"tag":59,"props":2398,"children":2399},{},[2400],{"type":49,"value":2401},"\"Private HTTPS repos need a GitHub Personal Access Token (PAT) stored in AWS\nSecrets Manager. The remote container fetches it at startup to clone your repos.\nThe token stays in your AWS account — you can delete it anytime.",{"type":43,"tag":59,"props":2403,"children":2404},{},[2405,2407,2413,2415,2421],{"type":49,"value":2406},"The PAT needs the ",{"type":43,"tag":241,"props":2408,"children":2410},{"className":2409},[],[2411],{"type":49,"value":2412},"repo",{"type":49,"value":2414}," scope for private repositories. Create one at\n",{"type":43,"tag":160,"props":2416,"children":2419},{"href":2417,"rel":2418},"https:\u002F\u002Fgithub.com\u002Fsettings\u002Ftokens",[164],[2420],{"type":49,"value":2417},{"type":49,"value":2422}," and then run:",{"type":43,"tag":344,"props":2424,"children":2427},{"className":2425,"code":2426,"language":49},[543],"aws secretsmanager create-secret --name \"atx\u002Fgithub-token\" --region \"$REGION\" --secret-string \"YOUR_TOKEN_HERE\"\n",[2428],{"type":43,"tag":241,"props":2429,"children":2430},{"__ignoreMap":349},[2431],{"type":49,"value":2426},{"type":43,"tag":59,"props":2433,"children":2434},{},[2435,2437,2443],{"type":49,"value":2436},"Delete anytime: ",{"type":43,"tag":241,"props":2438,"children":2440},{"className":2439},[],[2441],{"type":49,"value":2442},"aws secretsmanager delete-secret --secret-id atx\u002Fgithub-token --region \"$REGION\" --force-delete-without-recovery",{"type":49,"value":874},{"type":43,"tag":59,"props":2445,"children":2446},{},[2447],{"type":49,"value":2448},"Do NOT ask the user to paste their token in chat. They run the command themselves.\nWait for the user to confirm it's done, then verify:",{"type":43,"tag":344,"props":2450,"children":2451},{"className":346,"code":2256,"language":348,"meta":349,"style":349},[2452],{"type":43,"tag":241,"props":2453,"children":2454},{"__ignoreMap":349},[2455,2514],{"type":43,"tag":355,"props":2456,"children":2457},{"class":357,"line":358},[2458,2462,2466,2470,2474,2478,2482,2486,2490,2494,2498,2502,2506,2510],{"type":43,"tag":355,"props":2459,"children":2460},{"style":362},[2461],{"type":49,"value":8},{"type":43,"tag":355,"props":2463,"children":2464},{"style":368},[2465],{"type":49,"value":2272},{"type":43,"tag":355,"props":2467,"children":2468},{"style":368},[2469],{"type":49,"value":2277},{"type":43,"tag":355,"props":2471,"children":2472},{"style":368},[2473],{"type":49,"value":2282},{"type":43,"tag":355,"props":2475,"children":2476},{"style":803},[2477],{"type":49,"value":864},{"type":43,"tag":355,"props":2479,"children":2480},{"style":368},[2481],{"type":49,"value":2291},{"type":43,"tag":355,"props":2483,"children":2484},{"style":803},[2485],{"type":49,"value":874},{"type":43,"tag":355,"props":2487,"children":2488},{"style":368},[2489],{"type":49,"value":2300},{"type":43,"tag":355,"props":2491,"children":2492},{"style":803},[2493],{"type":49,"value":864},{"type":43,"tag":355,"props":2495,"children":2496},{"style":797},[2497],{"type":49,"value":2309},{"type":43,"tag":355,"props":2499,"children":2500},{"style":803},[2501],{"type":49,"value":874},{"type":43,"tag":355,"props":2503,"children":2504},{"style":803},[2505],{"type":49,"value":2318},{"type":43,"tag":355,"props":2507,"children":2508},{"style":368},[2509],{"type":49,"value":2323},{"type":43,"tag":355,"props":2511,"children":2512},{"style":797},[2513],{"type":49,"value":1030},{"type":43,"tag":355,"props":2515,"children":2516},{"class":357,"line":630},[2517,2521,2525,2529,2533,2537,2541,2545,2549,2553],{"type":43,"tag":355,"props":2518,"children":2519},{"style":803},[2520],{"type":49,"value":2335},{"type":43,"tag":355,"props":2522,"children":2523},{"style":856},[2524],{"type":49,"value":859},{"type":43,"tag":355,"props":2526,"children":2527},{"style":803},[2528],{"type":49,"value":864},{"type":43,"tag":355,"props":2530,"children":2531},{"style":368},[2532],{"type":49,"value":2348},{"type":43,"tag":355,"props":2534,"children":2535},{"style":803},[2536],{"type":49,"value":874},{"type":43,"tag":355,"props":2538,"children":2539},{"style":803},[2540],{"type":49,"value":2357},{"type":43,"tag":355,"props":2542,"children":2543},{"style":856},[2544],{"type":49,"value":859},{"type":43,"tag":355,"props":2546,"children":2547},{"style":803},[2548],{"type":49,"value":864},{"type":43,"tag":355,"props":2550,"children":2551},{"style":368},[2552],{"type":49,"value":2370},{"type":43,"tag":355,"props":2554,"children":2555},{"style":803},[2556],{"type":49,"value":1053},{"type":43,"tag":59,"props":2558,"children":2559},{},[2560,2565,2567,2573,2574,2580],{"type":43,"tag":78,"props":2561,"children":2562},{},[2563],{"type":49,"value":2564},"For SSH URLs",{"type":49,"value":2566}," (",{"type":43,"tag":241,"props":2568,"children":2570},{"className":2569},[],[2571],{"type":49,"value":2572},"git@...",{"type":49,"value":385},{"type":43,"tag":241,"props":2575,"children":2577},{"className":2576},[],[2578],{"type":49,"value":2579},"ssh:\u002F\u002F...",{"type":49,"value":2581},") — check whether an SSH key is configured:",{"type":43,"tag":344,"props":2583,"children":2585},{"className":346,"code":2584,"language":348,"meta":349,"style":349},"aws secretsmanager describe-secret --secret-id \"atx\u002Fssh-key\" --region \"$REGION\" 2>\u002Fdev\u002Fnull \\\n  && echo \"CONFIGURED\" || echo \"NOT_CONFIGURED\"\n",[2586],{"type":43,"tag":241,"props":2587,"children":2588},{"__ignoreMap":349},[2589,2649],{"type":43,"tag":355,"props":2590,"children":2591},{"class":357,"line":358},[2592,2596,2600,2604,2608,2612,2617,2621,2625,2629,2633,2637,2641,2645],{"type":43,"tag":355,"props":2593,"children":2594},{"style":362},[2595],{"type":49,"value":8},{"type":43,"tag":355,"props":2597,"children":2598},{"style":368},[2599],{"type":49,"value":2272},{"type":43,"tag":355,"props":2601,"children":2602},{"style":368},[2603],{"type":49,"value":2277},{"type":43,"tag":355,"props":2605,"children":2606},{"style":368},[2607],{"type":49,"value":2282},{"type":43,"tag":355,"props":2609,"children":2610},{"style":803},[2611],{"type":49,"value":864},{"type":43,"tag":355,"props":2613,"children":2614},{"style":368},[2615],{"type":49,"value":2616},"atx\u002Fssh-key",{"type":43,"tag":355,"props":2618,"children":2619},{"style":803},[2620],{"type":49,"value":874},{"type":43,"tag":355,"props":2622,"children":2623},{"style":368},[2624],{"type":49,"value":2300},{"type":43,"tag":355,"props":2626,"children":2627},{"style":803},[2628],{"type":49,"value":864},{"type":43,"tag":355,"props":2630,"children":2631},{"style":797},[2632],{"type":49,"value":2309},{"type":43,"tag":355,"props":2634,"children":2635},{"style":803},[2636],{"type":49,"value":874},{"type":43,"tag":355,"props":2638,"children":2639},{"style":803},[2640],{"type":49,"value":2318},{"type":43,"tag":355,"props":2642,"children":2643},{"style":368},[2644],{"type":49,"value":2323},{"type":43,"tag":355,"props":2646,"children":2647},{"style":797},[2648],{"type":49,"value":1030},{"type":43,"tag":355,"props":2650,"children":2651},{"class":357,"line":630},[2652,2656,2660,2664,2668,2672,2676,2680,2684,2688],{"type":43,"tag":355,"props":2653,"children":2654},{"style":803},[2655],{"type":49,"value":2335},{"type":43,"tag":355,"props":2657,"children":2658},{"style":856},[2659],{"type":49,"value":859},{"type":43,"tag":355,"props":2661,"children":2662},{"style":803},[2663],{"type":49,"value":864},{"type":43,"tag":355,"props":2665,"children":2666},{"style":368},[2667],{"type":49,"value":2348},{"type":43,"tag":355,"props":2669,"children":2670},{"style":803},[2671],{"type":49,"value":874},{"type":43,"tag":355,"props":2673,"children":2674},{"style":803},[2675],{"type":49,"value":2357},{"type":43,"tag":355,"props":2677,"children":2678},{"style":856},[2679],{"type":49,"value":859},{"type":43,"tag":355,"props":2681,"children":2682},{"style":803},[2683],{"type":49,"value":864},{"type":43,"tag":355,"props":2685,"children":2686},{"style":368},[2687],{"type":49,"value":2370},{"type":43,"tag":355,"props":2689,"children":2690},{"style":803},[2691],{"type":49,"value":1053},{"type":43,"tag":59,"props":2693,"children":2694},{},[2695],{"type":49,"value":2696},"If CONFIGURED, ask the user: \"An SSH key is already stored. Would you like to\nkeep using it, or replace it with a new one?\" If they want to replace it, tell\nthem to run:",{"type":43,"tag":344,"props":2698,"children":2701},{"className":2699,"code":2700,"language":49},[543],"aws secretsmanager put-secret-value --secret-id \"atx\u002Fssh-key\" --region \"$REGION\" --secret-string \"$(cat \u003Cpath-to-your-private-key>)\"\n",[2702],{"type":43,"tag":241,"props":2703,"children":2704},{"__ignoreMap":349},[2705],{"type":49,"value":2700},{"type":43,"tag":59,"props":2707,"children":2708},{},[2709],{"type":49,"value":2393},{"type":43,"tag":317,"props":2711,"children":2712},{},[2713,2718,2723,2732],{"type":43,"tag":59,"props":2714,"children":2715},{},[2716],{"type":49,"value":2717},"\"SSH repos need an SSH private key stored in AWS Secrets Manager. The remote\ncontainer fetches it at startup to clone your repos.",{"type":43,"tag":59,"props":2719,"children":2720},{},[2721],{"type":49,"value":2722},"Run:",{"type":43,"tag":344,"props":2724,"children":2727},{"className":2725,"code":2726,"language":49},[543],"aws secretsmanager create-secret --name \"atx\u002Fssh-key\" --region \"$REGION\" --secret-string \"$(cat \u003Cpath-to-your-private-key>)\"\n",[2728],{"type":43,"tag":241,"props":2729,"children":2730},{"__ignoreMap":349},[2731],{"type":49,"value":2726},{"type":43,"tag":59,"props":2733,"children":2734},{},[2735,2736,2742],{"type":49,"value":2436},{"type":43,"tag":241,"props":2737,"children":2739},{"className":2738},[],[2740],{"type":49,"value":2741},"aws secretsmanager delete-secret --secret-id atx\u002Fssh-key --region \"$REGION\" --force-delete-without-recovery",{"type":49,"value":874},{"type":43,"tag":59,"props":2744,"children":2745},{},[2746],{"type":49,"value":2747},"Do NOT ask the user to paste their SSH key in chat. They run the command themselves.",{"type":43,"tag":59,"props":2749,"children":2750},{},[2751],{"type":49,"value":2752},"For local mode, private repo credentials are not needed — the user's local git\nconfig handles authentication. Skip this check entirely for local mode.",{"type":43,"tag":305,"props":2754,"children":2756},{"id":2755},"step-2-discover-tds-silent",[2757],{"type":49,"value":2758},"Step 2: Discover TDs (Silent)",{"type":43,"tag":59,"props":2760,"children":2761},{},[2762],{"type":49,"value":2763},"Run silently — do NOT show output to user:",{"type":43,"tag":344,"props":2765,"children":2766},{"className":346,"code":708,"language":348,"meta":349,"style":349},[2767],{"type":43,"tag":241,"props":2768,"children":2769},{"__ignoreMap":349},[2770],{"type":43,"tag":355,"props":2771,"children":2772},{"class":357,"line":358},[2773,2777,2781,2785,2789],{"type":43,"tag":355,"props":2774,"children":2775},{"style":362},[2776],{"type":49,"value":623},{"type":43,"tag":355,"props":2778,"children":2779},{"style":368},[2780],{"type":49,"value":724},{"type":43,"tag":355,"props":2782,"children":2783},{"style":368},[2784],{"type":49,"value":729},{"type":43,"tag":355,"props":2786,"children":2787},{"style":368},[2788],{"type":49,"value":734},{"type":43,"tag":355,"props":2790,"children":2791},{"style":368},[2792],{"type":49,"value":739},{"type":43,"tag":59,"props":2794,"children":2795},{},[2796],{"type":49,"value":2797},"Inspect the JSON output directly to build an internal lookup of available TDs.\nDo NOT pipe the output to python, jq, or other parsing scripts — read the JSON\nyourself. Never hardcode TD names.",{"type":43,"tag":1562,"props":2799,"children":2801},{"id":2800},"creating-a-new-td",[2802],{"type":49,"value":2803},"Creating a New TD",{"type":43,"tag":59,"props":2805,"children":2806},{},[2807,2812],{"type":43,"tag":78,"props":2808,"children":2809},{},[2810],{"type":49,"value":2811},"User explicitly asks to create a TD:",{"type":49,"value":2813}," Do NOT attempt to create one\nprogrammatically. Tell the user:",{"type":43,"tag":317,"props":2815,"children":2816},{},[2817,2822,2831,2836],{"type":43,"tag":59,"props":2818,"children":2819},{},[2820],{"type":49,"value":2821},"To create a new Transformation Definition, open a new terminal and run:",{"type":43,"tag":344,"props":2823,"children":2826},{"className":2824,"code":2825,"language":49},[543],"atx -t\n",[2827],{"type":43,"tag":241,"props":2828,"children":2829},{"__ignoreMap":349},[2830],{"type":49,"value":2825},{"type":43,"tag":59,"props":2832,"children":2833},{},[2834],{"type":49,"value":2835},"This starts an interactive session where you describe the transformation you\nwant to build (e.g., \"migrate all logging from log4j to SLF4J\", \"upgrade\nSpring Boot 2 to Spring Boot 3\"). The ATX CLI will walk you through defining\nand testing the TD, then publish it to your AWS account.",{"type":43,"tag":59,"props":2837,"children":2838},{},[2839],{"type":49,"value":2840},"Once it's published, come back here and I'll pick it up automatically when\nI scan your available TDs.",{"type":43,"tag":59,"props":2842,"children":2843},{},[2844,2849],{"type":43,"tag":78,"props":2845,"children":2846},{},[2847],{"type":49,"value":2848},"No existing TD matches the user's goal:",{"type":49,"value":2850}," Do NOT silently redirect to TD\ncreation. The match logic may be imperfect. Instead, confirm with the user first:",{"type":43,"tag":317,"props":2852,"children":2853},{},[2854],{"type":43,"tag":59,"props":2855,"children":2856},{},[2857,2859,2864],{"type":49,"value":2858},"\"I didn't find an existing TD that covers ",{"type":43,"tag":355,"props":2860,"children":2861},{},[2862],{"type":49,"value":2863},"describe the user's goal",{"type":49,"value":2865},". Would\nyou like to create a new one?\"",{"type":43,"tag":59,"props":2867,"children":2868},{},[2869,2871,2877],{"type":49,"value":2870},"Only show the ",{"type":43,"tag":241,"props":2872,"children":2874},{"className":2873},[],[2875],{"type":49,"value":2876},"atx -t",{"type":49,"value":2878}," instructions if the user confirms. If they say no, ask\nthem to clarify what they're looking for — they may know the TD name or want a\ndifferent approach.",{"type":43,"tag":59,"props":2880,"children":2881},{},[2882,2884,2889],{"type":49,"value":2883},"Do NOT run ",{"type":43,"tag":241,"props":2885,"children":2887},{"className":2886},[],[2888],{"type":49,"value":2876},{"type":49,"value":2890}," yourself — it requires an interactive terminal session that\nthe agent cannot drive. The user must run it manually in a separate terminal.",{"type":43,"tag":59,"props":2892,"children":2893},{},[2894,2896,2901],{"type":49,"value":2895},"After the user returns from creating a TD, re-run ",{"type":43,"tag":241,"props":2897,"children":2899},{"className":2898},[],[2900],{"type":49,"value":246},{"type":49,"value":2902},"\nto pick up the newly published TD and continue with the normal workflow.",{"type":43,"tag":305,"props":2904,"children":2906},{"id":2905},"step-3-inspect-each-repository",[2907],{"type":49,"value":2908},"Step 3: Inspect Each Repository",{"type":43,"tag":59,"props":2910,"children":2911},{},[2912],{"type":49,"value":2913},"Perform lightweight inspection only — check config files for key signals:",{"type":43,"tag":2915,"props":2916,"children":2917},"table",{},[2918,2942],{"type":43,"tag":2919,"props":2920,"children":2921},"thead",{},[2922],{"type":43,"tag":2923,"props":2924,"children":2925},"tr",{},[2926,2932,2937],{"type":43,"tag":2927,"props":2928,"children":2929},"th",{},[2930],{"type":49,"value":2931},"Signal",{"type":43,"tag":2927,"props":2933,"children":2934},{},[2935],{"type":49,"value":2936},"Files to Check",{"type":43,"tag":2927,"props":2938,"children":2939},{},[2940],{"type":49,"value":2941},"Likely TD Type",{"type":43,"tag":2943,"props":2944,"children":2945},"tbody",{},[2946,2990,3041,3084,3108,3140,3171],{"type":43,"tag":2923,"props":2947,"children":2948},{},[2949,2955,2985],{"type":43,"tag":2950,"props":2951,"children":2952},"td",{},[2953],{"type":49,"value":2954},"Python version",{"type":43,"tag":2950,"props":2956,"children":2957},{},[2958,2964,2965,2971,2972,2978,2979],{"type":43,"tag":241,"props":2959,"children":2961},{"className":2960},[],[2962],{"type":49,"value":2963},".python-version",{"type":49,"value":404},{"type":43,"tag":241,"props":2966,"children":2968},{"className":2967},[],[2969],{"type":49,"value":2970},"pyproject.toml",{"type":49,"value":404},{"type":43,"tag":241,"props":2973,"children":2975},{"className":2974},[],[2976],{"type":49,"value":2977},"setup.cfg",{"type":49,"value":404},{"type":43,"tag":241,"props":2980,"children":2982},{"className":2981},[],[2983],{"type":49,"value":2984},"requirements.txt",{"type":43,"tag":2950,"props":2986,"children":2987},{},[2988],{"type":49,"value":2989},"Python version upgrade",{"type":43,"tag":2923,"props":2991,"children":2992},{},[2993,2998,3036],{"type":43,"tag":2950,"props":2994,"children":2995},{},[2996],{"type":49,"value":2997},"Java version",{"type":43,"tag":2950,"props":2999,"children":3000},{},[3001,3007,3008,3014,3016,3022,3023,3029,3030],{"type":43,"tag":241,"props":3002,"children":3004},{"className":3003},[],[3005],{"type":49,"value":3006},"pom.xml",{"type":49,"value":2566},{"type":43,"tag":241,"props":3009,"children":3011},{"className":3010},[],[3012],{"type":49,"value":3013},"\u003Cjava.version>",{"type":49,"value":3015},"), ",{"type":43,"tag":241,"props":3017,"children":3019},{"className":3018},[],[3020],{"type":49,"value":3021},"build.gradle",{"type":49,"value":2566},{"type":43,"tag":241,"props":3024,"children":3026},{"className":3025},[],[3027],{"type":49,"value":3028},"sourceCompatibility",{"type":49,"value":3015},{"type":43,"tag":241,"props":3031,"children":3033},{"className":3032},[],[3034],{"type":49,"value":3035},".java-version",{"type":43,"tag":2950,"props":3037,"children":3038},{},[3039],{"type":49,"value":3040},"Java version upgrade",{"type":43,"tag":2923,"props":3042,"children":3043},{},[3044,3049,3079],{"type":43,"tag":2950,"props":3045,"children":3046},{},[3047],{"type":49,"value":3048},"Node.js version",{"type":43,"tag":2950,"props":3050,"children":3051},{},[3052,3058,3059,3065,3066,3072,3073],{"type":43,"tag":241,"props":3053,"children":3055},{"className":3054},[],[3056],{"type":49,"value":3057},"package.json",{"type":49,"value":2566},{"type":43,"tag":241,"props":3060,"children":3062},{"className":3061},[],[3063],{"type":49,"value":3064},"engines.node",{"type":49,"value":3015},{"type":43,"tag":241,"props":3067,"children":3069},{"className":3068},[],[3070],{"type":49,"value":3071},".nvmrc",{"type":49,"value":404},{"type":43,"tag":241,"props":3074,"children":3076},{"className":3075},[],[3077],{"type":49,"value":3078},".node-version",{"type":43,"tag":2950,"props":3080,"children":3081},{},[3082],{"type":49,"value":3083},"Node.js version upgrade",{"type":43,"tag":2923,"props":3085,"children":3086},{},[3087,3092,3103],{"type":43,"tag":2950,"props":3088,"children":3089},{},[3090],{"type":49,"value":3091},"Python boto2",{"type":43,"tag":2950,"props":3093,"children":3094},{},[3095,3101],{"type":43,"tag":241,"props":3096,"children":3098},{"className":3097},[],[3099],{"type":49,"value":3100},"import boto",{"type":49,"value":3102}," (NOT boto3)",{"type":43,"tag":2950,"props":3104,"children":3105},{},[3106],{"type":49,"value":3107},"boto2→boto3 migration",{"type":43,"tag":2923,"props":3109,"children":3110},{},[3111,3116,3135],{"type":43,"tag":2950,"props":3112,"children":3113},{},[3114],{"type":49,"value":3115},"Java SDK v1",{"type":43,"tag":2950,"props":3117,"children":3118},{},[3119,3125,3127,3133],{"type":43,"tag":241,"props":3120,"children":3122},{"className":3121},[],[3123],{"type":49,"value":3124},"com.amazonaws",{"type":49,"value":3126}," imports, ",{"type":43,"tag":241,"props":3128,"children":3130},{"className":3129},[],[3131],{"type":49,"value":3132},"aws-java-sdk",{"type":49,"value":3134}," in pom.xml",{"type":43,"tag":2950,"props":3136,"children":3137},{},[3138],{"type":49,"value":3139},"Java SDK v1→v2",{"type":43,"tag":2923,"props":3141,"children":3142},{},[3143,3148,3166],{"type":43,"tag":2950,"props":3144,"children":3145},{},[3146],{"type":49,"value":3147},"Node.js SDK v2",{"type":43,"tag":2950,"props":3149,"children":3150},{},[3151,3157,3159,3165],{"type":43,"tag":241,"props":3152,"children":3154},{"className":3153},[],[3155],{"type":49,"value":3156},"\"aws-sdk\"",{"type":49,"value":3158}," in package.json (NOT ",{"type":43,"tag":241,"props":3160,"children":3162},{"className":3161},[],[3163],{"type":49,"value":3164},"@aws-sdk",{"type":49,"value":1510},{"type":43,"tag":2950,"props":3167,"children":3168},{},[3169],{"type":49,"value":3170},"JS SDK v2→v3",{"type":43,"tag":2923,"props":3172,"children":3173},{},[3174,3179,3197],{"type":43,"tag":2950,"props":3175,"children":3176},{},[3177],{"type":49,"value":3178},"x86 Java",{"type":43,"tag":2950,"props":3180,"children":3181},{},[3182,3188,3189,3195],{"type":43,"tag":241,"props":3183,"children":3185},{"className":3184},[],[3186],{"type":49,"value":3187},"x86_64",{"type":49,"value":966},{"type":43,"tag":241,"props":3190,"children":3192},{"className":3191},[],[3193],{"type":49,"value":3194},"amd64",{"type":49,"value":3196}," in Dockerfiles, build configs",{"type":43,"tag":2950,"props":3198,"children":3199},{},[3200],{"type":49,"value":3201},"Graviton migration",{"type":43,"tag":59,"props":3203,"children":3204},{},[3205],{"type":49,"value":3206},"Cross-reference detected signals against TDs from Step 2. Only match TDs that\nactually exist in the user's account.",{"type":43,"tag":59,"props":3208,"children":3209},{},[3210,3211,3216],{"type":49,"value":1313},{"type":43,"tag":160,"props":3212,"children":3214},{"href":3213},"references\u002Frepo-analysis.md",[3215],{"type":49,"value":3213},{"type":49,"value":3217}," for full detection commands.",{"type":43,"tag":305,"props":3219,"children":3221},{"id":3220},"step-4-present-match-report",[3222],{"type":49,"value":3223},"Step 4: Present Match Report",{"type":43,"tag":59,"props":3225,"children":3226},{},[3227],{"type":49,"value":3228},"Format:",{"type":43,"tag":344,"props":3230,"children":3233},{"className":3231,"code":3232,"language":49},[543],"Transformation Match Report\n=============================\nRepository: \u003Cname> (\u003Cpath>)\n  Language: \u003Clang> \u003Cversion>\n  Matching TDs:\n    - \u003Ctd-name> — \u003Cdescription>\n\nSummary: N repos analyzed, M have applicable transformations (T total jobs)\n",[3234],{"type":43,"tag":241,"props":3235,"children":3236},{"__ignoreMap":349},[3237],{"type":49,"value":3232},{"type":43,"tag":59,"props":3239,"children":3240},{},[3241],{"type":49,"value":3242},"Present the match report and wait for user confirmation before proceeding.\nDo NOT start any transformation without explicit user consent.",{"type":43,"tag":305,"props":3244,"children":3246},{"id":3245},"step-5-collect-configuration",[3247],{"type":49,"value":3248},"Step 5: Collect Configuration",{"type":43,"tag":59,"props":3250,"children":3251},{},[3252],{"type":49,"value":3253},"Ask the user for any additional plan context (e.g., target version for upgrade TDs).\nThis is mandatory — always ask, even if the TD doesn't strictly require config.\nThe user may have preferences or constraints the agent doesn't know about.\nSkip only if the user explicitly says no additional context is needed.",{"type":43,"tag":305,"props":3255,"children":3257},{"id":3256},"step-6-verify-runtime-compatibility-remote-and-local",[3258],{"type":49,"value":3259},"Step 6: Verify Runtime Compatibility (Remote and Local)",{"type":43,"tag":1562,"props":3261,"children":3263},{"id":3262},"remote-mode",[3264],{"type":49,"value":274},{"type":43,"tag":59,"props":3266,"children":3267},{},[3268],{"type":49,"value":3269},"Before submitting remote jobs, determine whether the pre-built image covers the\ntarget runtime or if a custom Docker build is needed.",{"type":43,"tag":59,"props":3271,"children":3272},{},[3273],{"type":43,"tag":78,"props":3274,"children":3275},{},[3276],{"type":49,"value":3277},"Pre-built image includes:",{"type":43,"tag":70,"props":3279,"children":3280},{},[3281,3291,3301,3311,3321,3331],{"type":43,"tag":74,"props":3282,"children":3283},{},[3284,3289],{"type":43,"tag":78,"props":3285,"children":3286},{},[3287],{"type":49,"value":3288},"Java",{"type":49,"value":3290},": 8, 11, 17, 21, 25 (Amazon Corretto) with Maven and Gradle 9.4",{"type":43,"tag":74,"props":3292,"children":3293},{},[3294,3299],{"type":43,"tag":78,"props":3295,"children":3296},{},[3297],{"type":49,"value":3298},"Python",{"type":49,"value":3300},": 3.8, 3.9, 3.10, 3.11, 3.12, 3.13, 3.14 (dnf + pyenv)",{"type":43,"tag":74,"props":3302,"children":3303},{},[3304,3309],{"type":43,"tag":78,"props":3305,"children":3306},{},[3307],{"type":49,"value":3308},"Node.js",{"type":49,"value":3310},": 16, 18, 20, 22, 24 (nvm) with yarn, pnpm, TypeScript, ts-node",{"type":43,"tag":74,"props":3312,"children":3313},{},[3314,3319],{"type":43,"tag":78,"props":3315,"children":3316},{},[3317],{"type":49,"value":3318},"Build tools",{"type":49,"value":3320},": gcc, g++, make, patch",{"type":43,"tag":74,"props":3322,"children":3323},{},[3324,3329],{"type":43,"tag":78,"props":3325,"children":3326},{},[3327],{"type":49,"value":3328},"CLI tools",{"type":49,"value":3330},": AWS CLI v2, ATX CLI, git, jq, curl, unzip, tar",{"type":43,"tag":74,"props":3332,"children":3333},{},[3334,3339],{"type":43,"tag":78,"props":3335,"children":3336},{},[3337],{"type":49,"value":3338},"OS",{"type":49,"value":3340},": Amazon Linux 2023 (x86_64)",{"type":43,"tag":59,"props":3342,"children":3343},{},[3344],{"type":43,"tag":78,"props":3345,"children":3346},{},[3347],{"type":49,"value":3348},"Decision logic:",{"type":43,"tag":3350,"props":3351,"children":3352},"ol",{},[3353,3358,3375],{"type":43,"tag":74,"props":3354,"children":3355},{},[3356],{"type":49,"value":3357},"Based on the transformation requirements (source runtime, target runtime,\nbuild tools, and any other dependencies), determine whether everything\nneeded is available in the pre-built image listed above",{"type":43,"tag":74,"props":3359,"children":3360},{},[3361,3363,3368,3370,3374],{"type":49,"value":3362},"If ",{"type":43,"tag":78,"props":3364,"children":3365},{},[3366],{"type":49,"value":3367},"yes",{"type":49,"value":3369}," → use the pre-built image path (no Docker required). Proceed to deployment\nusing the pre-built image instructions in ",{"type":43,"tag":160,"props":3371,"children":3372},{"href":1304},[3373],{"type":49,"value":1304},{"type":49,"value":1308},{"type":43,"tag":74,"props":3376,"children":3377},{},[3378,3379,3384],{"type":49,"value":3362},{"type":43,"tag":78,"props":3380,"children":3381},{},[3382],{"type":49,"value":3383},"no",{"type":49,"value":3385}," → use the custom image path (Docker required). Inform the user:",{"type":43,"tag":317,"props":3387,"children":3388},{},[3389],{"type":43,"tag":59,"props":3390,"children":3391},{},[3392,3394,3399],{"type":49,"value":3393},"The remote container doesn't include ",{"type":43,"tag":355,"props":3395,"children":3396},{},[3397],{"type":49,"value":3398},"language\u002Ftool version",{"type":49,"value":3400},". To run this\ntransformation remotely, I'll need to build a custom container image. This\nrequires Docker installed and running on your machine. It's a one-time change\n— about 5-10 minutes. Want me to proceed?",{"type":43,"tag":59,"props":3402,"children":3403},{},[3404,3406,3410,3412,3418],{"type":49,"value":3405},"If the user confirms, follow the custom image path in\n",{"type":43,"tag":160,"props":3407,"children":3408},{"href":1304},[3409],{"type":49,"value":1304},{"type":49,"value":3411},": clear ",{"type":43,"tag":241,"props":3413,"children":3415},{"className":3414},[],[3416],{"type":49,"value":3417},"prebuiltImageUri",{"type":49,"value":3419},",\ncustomize the Dockerfile, and deploy.",{"type":43,"tag":59,"props":3421,"children":3422},{},[3423],{"type":49,"value":3424},"If the user declines, suggest local mode as an alternative (if the tools are\navailable on their machine).",{"type":43,"tag":59,"props":3426,"children":3427},{},[3428],{"type":43,"tag":78,"props":3429,"children":3430},{},[3431],{"type":49,"value":3432},"Dockerfile customization (custom image path only):",{"type":43,"tag":59,"props":3434,"children":3435},{},[3436],{"type":49,"value":3437},"First, read the Dockerfile to see what's installed:",{"type":43,"tag":344,"props":3439,"children":3441},{"className":346,"code":3440,"language":348,"meta":349,"style":349},"ATX_INFRA_DIR=\"$HOME\u002F.aws\u002Fatx\u002Fcustom\u002Fremote-infra\"\ncat \"$ATX_INFRA_DIR\u002Fcontainer\u002FDockerfile\" 2>\u002Fdev\u002Fnull\n",[3442],{"type":43,"tag":241,"props":3443,"children":3444},{"__ignoreMap":349},[3445,3474],{"type":43,"tag":355,"props":3446,"children":3447},{"class":357,"line":358},[3448,3453,3457,3461,3465,3470],{"type":43,"tag":355,"props":3449,"children":3450},{"style":797},[3451],{"type":49,"value":3452},"ATX_INFRA_DIR",{"type":43,"tag":355,"props":3454,"children":3455},{"style":803},[3456],{"type":49,"value":1647},{"type":43,"tag":355,"props":3458,"children":3459},{"style":803},[3460],{"type":49,"value":874},{"type":43,"tag":355,"props":3462,"children":3463},{"style":797},[3464],{"type":49,"value":2050},{"type":43,"tag":355,"props":3466,"children":3467},{"style":368},[3468],{"type":49,"value":3469},"\u002F.aws\u002Fatx\u002Fcustom\u002Fremote-infra",{"type":43,"tag":355,"props":3471,"children":3472},{"style":803},[3473],{"type":49,"value":1053},{"type":43,"tag":355,"props":3475,"children":3476},{"class":357,"line":630},[3477,3482,3486,3491,3496,3500,3504],{"type":43,"tag":355,"props":3478,"children":3479},{"style":362},[3480],{"type":49,"value":3481},"cat",{"type":43,"tag":355,"props":3483,"children":3484},{"style":803},[3485],{"type":49,"value":864},{"type":43,"tag":355,"props":3487,"children":3488},{"style":797},[3489],{"type":49,"value":3490},"$ATX_INFRA_DIR",{"type":43,"tag":355,"props":3492,"children":3493},{"style":368},[3494],{"type":49,"value":3495},"\u002Fcontainer\u002FDockerfile",{"type":43,"tag":355,"props":3497,"children":3498},{"style":803},[3499],{"type":49,"value":874},{"type":43,"tag":355,"props":3501,"children":3502},{"style":803},[3503],{"type":49,"value":2318},{"type":43,"tag":355,"props":3505,"children":3506},{"style":368},[3507],{"type":49,"value":3508},"\u002Fdev\u002Fnull\n",{"type":43,"tag":3350,"props":3510,"children":3511},{},[3512,3803,4184,4281],{"type":43,"tag":74,"props":3513,"children":3514},{},[3515,3517,3782,3786,3787,3793,3795,3801],{"type":49,"value":3516},"Ensure the infrastructure repo is cloned and up to date:",{"type":43,"tag":344,"props":3518,"children":3520},{"className":346,"code":3519,"language":348,"meta":349,"style":349},"ATX_INFRA_DIR=\"$HOME\u002F.aws\u002Fatx\u002Fcustom\u002Fremote-infra\"\nif [ -d \"$ATX_INFRA_DIR\" ]; then\n  git -C \"$ATX_INFRA_DIR\" add -A\n  git -C \"$ATX_INFRA_DIR\" commit -m \"Local customizations\" -q 2>\u002Fdev\u002Fnull || true\n  git -C \"$ATX_INFRA_DIR\" pull -q\nelse\n  git clone -b atx-remote-infra --single-branch https:\u002F\u002Fgithub.com\u002Faws-samples\u002Faws-transform-custom-samples.git \"$ATX_INFRA_DIR\"\nfi\n",[3521],{"type":43,"tag":241,"props":3522,"children":3523},{"__ignoreMap":349},[3524,3551,3588,3623,3690,3723,3731,3775],{"type":43,"tag":355,"props":3525,"children":3526},{"class":357,"line":358},[3527,3531,3535,3539,3543,3547],{"type":43,"tag":355,"props":3528,"children":3529},{"style":797},[3530],{"type":49,"value":3452},{"type":43,"tag":355,"props":3532,"children":3533},{"style":803},[3534],{"type":49,"value":1647},{"type":43,"tag":355,"props":3536,"children":3537},{"style":803},[3538],{"type":49,"value":874},{"type":43,"tag":355,"props":3540,"children":3541},{"style":797},[3542],{"type":49,"value":2050},{"type":43,"tag":355,"props":3544,"children":3545},{"style":368},[3546],{"type":49,"value":3469},{"type":43,"tag":355,"props":3548,"children":3549},{"style":803},[3550],{"type":49,"value":1053},{"type":43,"tag":355,"props":3552,"children":3553},{"class":357,"line":630},[3554,3558,3563,3567,3571,3575,3579,3584],{"type":43,"tag":355,"props":3555,"children":3556},{"style":850},[3557],{"type":49,"value":853},{"type":43,"tag":355,"props":3559,"children":3560},{"style":803},[3561],{"type":49,"value":3562}," [",{"type":43,"tag":355,"props":3564,"children":3565},{"style":803},[3566],{"type":49,"value":1177},{"type":43,"tag":355,"props":3568,"children":3569},{"style":803},[3570],{"type":49,"value":864},{"type":43,"tag":355,"props":3572,"children":3573},{"style":797},[3574],{"type":49,"value":3490},{"type":43,"tag":355,"props":3576,"children":3577},{"style":803},[3578],{"type":49,"value":874},{"type":43,"tag":355,"props":3580,"children":3581},{"style":803},[3582],{"type":49,"value":3583}," ];",{"type":43,"tag":355,"props":3585,"children":3586},{"style":850},[3587],{"type":49,"value":912},{"type":43,"tag":355,"props":3589,"children":3590},{"class":357,"line":915},[3591,3596,3601,3605,3609,3613,3618],{"type":43,"tag":355,"props":3592,"children":3593},{"style":362},[3594],{"type":49,"value":3595},"  git",{"type":43,"tag":355,"props":3597,"children":3598},{"style":368},[3599],{"type":49,"value":3600}," -C",{"type":43,"tag":355,"props":3602,"children":3603},{"style":803},[3604],{"type":49,"value":864},{"type":43,"tag":355,"props":3606,"children":3607},{"style":797},[3608],{"type":49,"value":3490},{"type":43,"tag":355,"props":3610,"children":3611},{"style":803},[3612],{"type":49,"value":874},{"type":43,"tag":355,"props":3614,"children":3615},{"style":368},[3616],{"type":49,"value":3617}," add",{"type":43,"tag":355,"props":3619,"children":3620},{"style":368},[3621],{"type":49,"value":3622}," -A\n",{"type":43,"tag":355,"props":3624,"children":3625},{"class":357,"line":991},[3626,3630,3634,3638,3642,3646,3651,3656,3660,3665,3669,3673,3677,3681,3685],{"type":43,"tag":355,"props":3627,"children":3628},{"style":362},[3629],{"type":49,"value":3595},{"type":43,"tag":355,"props":3631,"children":3632},{"style":368},[3633],{"type":49,"value":3600},{"type":43,"tag":355,"props":3635,"children":3636},{"style":803},[3637],{"type":49,"value":864},{"type":43,"tag":355,"props":3639,"children":3640},{"style":797},[3641],{"type":49,"value":3490},{"type":43,"tag":355,"props":3643,"children":3644},{"style":803},[3645],{"type":49,"value":874},{"type":43,"tag":355,"props":3647,"children":3648},{"style":368},[3649],{"type":49,"value":3650}," commit",{"type":43,"tag":355,"props":3652,"children":3653},{"style":368},[3654],{"type":49,"value":3655}," -m",{"type":43,"tag":355,"props":3657,"children":3658},{"style":803},[3659],{"type":49,"value":864},{"type":43,"tag":355,"props":3661,"children":3662},{"style":368},[3663],{"type":49,"value":3664},"Local customizations",{"type":43,"tag":355,"props":3666,"children":3667},{"style":803},[3668],{"type":49,"value":874},{"type":43,"tag":355,"props":3670,"children":3671},{"style":368},[3672],{"type":49,"value":889},{"type":43,"tag":355,"props":3674,"children":3675},{"style":803},[3676],{"type":49,"value":2318},{"type":43,"tag":355,"props":3678,"children":3679},{"style":368},[3680],{"type":49,"value":2323},{"type":43,"tag":355,"props":3682,"children":3683},{"style":803},[3684],{"type":49,"value":2357},{"type":43,"tag":355,"props":3686,"children":3687},{"style":856},[3688],{"type":49,"value":3689}," true\n",{"type":43,"tag":355,"props":3691,"children":3692},{"class":357,"line":1033},[3693,3697,3701,3705,3709,3713,3718],{"type":43,"tag":355,"props":3694,"children":3695},{"style":362},[3696],{"type":49,"value":3595},{"type":43,"tag":355,"props":3698,"children":3699},{"style":368},[3700],{"type":49,"value":3600},{"type":43,"tag":355,"props":3702,"children":3703},{"style":803},[3704],{"type":49,"value":864},{"type":43,"tag":355,"props":3706,"children":3707},{"style":797},[3708],{"type":49,"value":3490},{"type":43,"tag":355,"props":3710,"children":3711},{"style":803},[3712],{"type":49,"value":874},{"type":43,"tag":355,"props":3714,"children":3715},{"style":368},[3716],{"type":49,"value":3717}," pull",{"type":43,"tag":355,"props":3719,"children":3720},{"style":368},[3721],{"type":49,"value":3722}," -q\n",{"type":43,"tag":355,"props":3724,"children":3725},{"class":357,"line":1056},[3726],{"type":43,"tag":355,"props":3727,"children":3728},{"style":850},[3729],{"type":49,"value":3730},"else\n",{"type":43,"tag":355,"props":3732,"children":3733},{"class":357,"line":1115},[3734,3738,3743,3748,3753,3758,3763,3767,3771],{"type":43,"tag":355,"props":3735,"children":3736},{"style":362},[3737],{"type":49,"value":3595},{"type":43,"tag":355,"props":3739,"children":3740},{"style":368},[3741],{"type":49,"value":3742}," clone",{"type":43,"tag":355,"props":3744,"children":3745},{"style":368},[3746],{"type":49,"value":3747}," -b",{"type":43,"tag":355,"props":3749,"children":3750},{"style":368},[3751],{"type":49,"value":3752}," atx-remote-infra",{"type":43,"tag":355,"props":3754,"children":3755},{"style":368},[3756],{"type":49,"value":3757}," --single-branch",{"type":43,"tag":355,"props":3759,"children":3760},{"style":368},[3761],{"type":49,"value":3762}," https:\u002F\u002Fgithub.com\u002Faws-samples\u002Faws-transform-custom-samples.git",{"type":43,"tag":355,"props":3764,"children":3765},{"style":803},[3766],{"type":49,"value":864},{"type":43,"tag":355,"props":3768,"children":3769},{"style":797},[3770],{"type":49,"value":3490},{"type":43,"tag":355,"props":3772,"children":3773},{"style":803},[3774],{"type":49,"value":1053},{"type":43,"tag":355,"props":3776,"children":3777},{"class":357,"line":1201},[3778],{"type":43,"tag":355,"props":3779,"children":3780},{"style":850},[3781],{"type":49,"value":1266},{"type":43,"tag":3783,"props":3784,"children":3785},"br",{},[],{"type":49,"value":3362},{"type":43,"tag":241,"props":3788,"children":3790},{"className":3789},[],[3791],{"type":49,"value":3792},"git pull",{"type":49,"value":3794}," reports a merge conflict, resolve it by keeping both upstream\nchanges and the user's customizations in the ",{"type":43,"tag":241,"props":3796,"children":3798},{"className":3797},[],[3799],{"type":49,"value":3800},"CUSTOM LANGUAGES AND TOOLS",{"type":49,"value":3802},"\nsection of the Dockerfile, then commit the merge.",{"type":43,"tag":74,"props":3804,"children":3805},{},[3806,3808,3814,3816,3822,3824,3830,3832,3838,3840,3843,3845,4019,4022,4024,4030,4032,4037,4039],{"type":49,"value":3807},"Edit ",{"type":43,"tag":241,"props":3809,"children":3811},{"className":3810},[],[3812],{"type":49,"value":3813},"$ATX_INFRA_DIR\u002Fcontainer\u002FDockerfile",{"type":49,"value":3815},". Find the section marked\n",{"type":43,"tag":241,"props":3817,"children":3819},{"className":3818},[],[3820],{"type":49,"value":3821},"# CUSTOM LANGUAGES AND TOOLS",{"type":49,"value":3823}," and insert ",{"type":43,"tag":241,"props":3825,"children":3827},{"className":3826},[],[3828],{"type":49,"value":3829},"RUN",{"type":49,"value":3831}," commands after the comment\nblock, before the ",{"type":43,"tag":241,"props":3833,"children":3835},{"className":3834},[],[3836],{"type":49,"value":3837},"USER root",{"type":49,"value":3839}," line.",{"type":43,"tag":3783,"props":3841,"children":3842},{},[],{"type":49,"value":3844},"For missing versions of already-installed languages, add the version in the\ncustom section. Examples:",{"type":43,"tag":344,"props":3846,"children":3850},{"className":3847,"code":3848,"language":3849,"meta":349,"style":349},"language-dockerfile shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Java 23 (Amazon Corretto — direct install, must run as root)\n# Do NOT use dnf in the custom section — pyenv overrides the system python3\n# that dnf depends on, causing \"No module named 'dnf'\" errors.\nUSER root\nRUN curl -fsSL \"https:\u002F\u002Fcorretto.aws\u002Fdownloads\u002Flatest\u002Famazon-corretto-23-x64-linux-jdk.tar.gz\" -o \u002Ftmp\u002Fcorretto23.tar.gz && \\\n    mkdir -p \u002Fusr\u002Flib\u002Fjvm && \\\n    tar -xzf \u002Ftmp\u002Fcorretto23.tar.gz -C \u002Fusr\u002Flib\u002Fjvm && \\\n    rm \u002Ftmp\u002Fcorretto23.tar.gz && \\\n    ln -sfn \u002Fusr\u002Flib\u002Fjvm\u002Famazon-corretto-23.* \u002Fusr\u002Flib\u002Fjvm\u002Fcorretto-23\n\n# Node.js 23 (via nvm — must run as atxuser)\nUSER atxuser\nRUN . \u002Fhome\u002Fatxuser\u002F.nvm\u002Fnvm.sh && nvm install 23\nUSER root\n\n# Python 3.15 (via pyenv — must run as atxuser)\nUSER atxuser\nRUN eval \"$(\u002Fhome\u002Fatxuser\u002F.pyenv\u002Fbin\u002Fpyenv init -)\" && \\\n    MAKE_OPTS=\"-j$(nproc)\" \u002Fhome\u002Fatxuser\u002F.pyenv\u002Fbin\u002Fpyenv install 3.15.0\nUSER root\n","dockerfile",[3851],{"type":43,"tag":241,"props":3852,"children":3853},{"__ignoreMap":349},[3854,3862,3870,3878,3886,3894,3902,3910,3918,3926,3933,3942,3951,3960,3968,3976,3985,3993,4002,4011],{"type":43,"tag":355,"props":3855,"children":3856},{"class":357,"line":358},[3857],{"type":43,"tag":355,"props":3858,"children":3859},{},[3860],{"type":49,"value":3861},"# Java 23 (Amazon Corretto — direct install, must run as root)\n",{"type":43,"tag":355,"props":3863,"children":3864},{"class":357,"line":630},[3865],{"type":43,"tag":355,"props":3866,"children":3867},{},[3868],{"type":49,"value":3869},"# Do NOT use dnf in the custom section — pyenv overrides the system python3\n",{"type":43,"tag":355,"props":3871,"children":3872},{"class":357,"line":915},[3873],{"type":43,"tag":355,"props":3874,"children":3875},{},[3876],{"type":49,"value":3877},"# that dnf depends on, causing \"No module named 'dnf'\" errors.\n",{"type":43,"tag":355,"props":3879,"children":3880},{"class":357,"line":991},[3881],{"type":43,"tag":355,"props":3882,"children":3883},{},[3884],{"type":49,"value":3885},"USER root\n",{"type":43,"tag":355,"props":3887,"children":3888},{"class":357,"line":1033},[3889],{"type":43,"tag":355,"props":3890,"children":3891},{},[3892],{"type":49,"value":3893},"RUN curl -fsSL \"https:\u002F\u002Fcorretto.aws\u002Fdownloads\u002Flatest\u002Famazon-corretto-23-x64-linux-jdk.tar.gz\" -o \u002Ftmp\u002Fcorretto23.tar.gz && \\\n",{"type":43,"tag":355,"props":3895,"children":3896},{"class":357,"line":1056},[3897],{"type":43,"tag":355,"props":3898,"children":3899},{},[3900],{"type":49,"value":3901},"    mkdir -p \u002Fusr\u002Flib\u002Fjvm && \\\n",{"type":43,"tag":355,"props":3903,"children":3904},{"class":357,"line":1115},[3905],{"type":43,"tag":355,"props":3906,"children":3907},{},[3908],{"type":49,"value":3909},"    tar -xzf \u002Ftmp\u002Fcorretto23.tar.gz -C \u002Fusr\u002Flib\u002Fjvm && \\\n",{"type":43,"tag":355,"props":3911,"children":3912},{"class":357,"line":1201},[3913],{"type":43,"tag":355,"props":3914,"children":3915},{},[3916],{"type":49,"value":3917},"    rm \u002Ftmp\u002Fcorretto23.tar.gz && \\\n",{"type":43,"tag":355,"props":3919,"children":3920},{"class":357,"line":1240},[3921],{"type":43,"tag":355,"props":3922,"children":3923},{},[3924],{"type":49,"value":3925},"    ln -sfn \u002Fusr\u002Flib\u002Fjvm\u002Famazon-corretto-23.* \u002Fusr\u002Flib\u002Fjvm\u002Fcorretto-23\n",{"type":43,"tag":355,"props":3927,"children":3928},{"class":357,"line":1260},[3929],{"type":43,"tag":355,"props":3930,"children":3931},{"emptyLinePlaceholder":1676},[3932],{"type":49,"value":1679},{"type":43,"tag":355,"props":3934,"children":3936},{"class":357,"line":3935},11,[3937],{"type":43,"tag":355,"props":3938,"children":3939},{},[3940],{"type":49,"value":3941},"# Node.js 23 (via nvm — must run as atxuser)\n",{"type":43,"tag":355,"props":3943,"children":3945},{"class":357,"line":3944},12,[3946],{"type":43,"tag":355,"props":3947,"children":3948},{},[3949],{"type":49,"value":3950},"USER atxuser\n",{"type":43,"tag":355,"props":3952,"children":3954},{"class":357,"line":3953},13,[3955],{"type":43,"tag":355,"props":3956,"children":3957},{},[3958],{"type":49,"value":3959},"RUN . \u002Fhome\u002Fatxuser\u002F.nvm\u002Fnvm.sh && nvm install 23\n",{"type":43,"tag":355,"props":3961,"children":3963},{"class":357,"line":3962},14,[3964],{"type":43,"tag":355,"props":3965,"children":3966},{},[3967],{"type":49,"value":3885},{"type":43,"tag":355,"props":3969,"children":3971},{"class":357,"line":3970},15,[3972],{"type":43,"tag":355,"props":3973,"children":3974},{"emptyLinePlaceholder":1676},[3975],{"type":49,"value":1679},{"type":43,"tag":355,"props":3977,"children":3979},{"class":357,"line":3978},16,[3980],{"type":43,"tag":355,"props":3981,"children":3982},{},[3983],{"type":49,"value":3984},"# Python 3.15 (via pyenv — must run as atxuser)\n",{"type":43,"tag":355,"props":3986,"children":3988},{"class":357,"line":3987},17,[3989],{"type":43,"tag":355,"props":3990,"children":3991},{},[3992],{"type":49,"value":3950},{"type":43,"tag":355,"props":3994,"children":3996},{"class":357,"line":3995},18,[3997],{"type":43,"tag":355,"props":3998,"children":3999},{},[4000],{"type":49,"value":4001},"RUN eval \"$(\u002Fhome\u002Fatxuser\u002F.pyenv\u002Fbin\u002Fpyenv init -)\" && \\\n",{"type":43,"tag":355,"props":4003,"children":4005},{"class":357,"line":4004},19,[4006],{"type":43,"tag":355,"props":4007,"children":4008},{},[4009],{"type":49,"value":4010},"    MAKE_OPTS=\"-j$(nproc)\" \u002Fhome\u002Fatxuser\u002F.pyenv\u002Fbin\u002Fpyenv install 3.15.0\n",{"type":43,"tag":355,"props":4012,"children":4014},{"class":357,"line":4013},20,[4015],{"type":43,"tag":355,"props":4016,"children":4017},{},[4018],{"type":49,"value":3885},{"type":43,"tag":3783,"props":4020,"children":4021},{},[],{"type":49,"value":4023},"For entirely new languages, avoid ",{"type":43,"tag":241,"props":4025,"children":4027},{"className":4026},[],[4028],{"type":49,"value":4029},"dnf",{"type":49,"value":4031}," in the custom section — pyenv\noverrides the system python3 that ",{"type":43,"tag":241,"props":4033,"children":4035},{"className":4034},[],[4036],{"type":49,"value":4029},{"type":49,"value":4038}," depends on. Use language-specific\ninstallers instead:",{"type":43,"tag":344,"props":4040,"children":4042},{"className":3847,"code":4041,"language":3849,"meta":349,"style":349},"# Go\nRUN curl -fsSL https:\u002F\u002Fgo.dev\u002Fdl\u002Fgo1.22.0.linux-amd64.tar.gz | tar -C \u002Fusr\u002Flocal -xz\nENV PATH=\"\u002Fusr\u002Flocal\u002Fgo\u002Fbin:$PATH\"\n\n# Ruby (via rbenv — must run as atxuser)\nUSER atxuser\nRUN git clone --depth 1 https:\u002F\u002Fgithub.com\u002Frbenv\u002Frbenv.git \u002Fhome\u002Fatxuser\u002F.rbenv && \\\n    git clone --depth 1 https:\u002F\u002Fgithub.com\u002Frbenv\u002Fruby-build.git \u002Fhome\u002Fatxuser\u002F.rbenv\u002Fplugins\u002Fruby-build && \\\n    \u002Fhome\u002Fatxuser\u002F.rbenv\u002Fbin\u002Frbenv install 3.3.0 && \\\n    \u002Fhome\u002Fatxuser\u002F.rbenv\u002Fbin\u002Frbenv global 3.3.0\nENV PATH=\"\u002Fhome\u002Fatxuser\u002F.rbenv\u002Fshims:\u002Fhome\u002Fatxuser\u002F.rbenv\u002Fbin:$PATH\"\nUSER root\n\n# Rust\nUSER atxuser\nRUN curl --proto '=https' --tlsv1.2 -sSf https:\u002F\u002Fsh.rustup.rs | sh -s -- -y\nENV PATH=\"\u002Fhome\u002Fatxuser\u002F.cargo\u002Fbin:$PATH\"\nUSER root\n",[4043],{"type":43,"tag":241,"props":4044,"children":4045},{"__ignoreMap":349},[4046,4054,4062,4070,4077,4085,4092,4100,4108,4116,4124,4132,4139,4146,4154,4161,4169,4177],{"type":43,"tag":355,"props":4047,"children":4048},{"class":357,"line":358},[4049],{"type":43,"tag":355,"props":4050,"children":4051},{},[4052],{"type":49,"value":4053},"# Go\n",{"type":43,"tag":355,"props":4055,"children":4056},{"class":357,"line":630},[4057],{"type":43,"tag":355,"props":4058,"children":4059},{},[4060],{"type":49,"value":4061},"RUN curl -fsSL https:\u002F\u002Fgo.dev\u002Fdl\u002Fgo1.22.0.linux-amd64.tar.gz | tar -C \u002Fusr\u002Flocal -xz\n",{"type":43,"tag":355,"props":4063,"children":4064},{"class":357,"line":915},[4065],{"type":43,"tag":355,"props":4066,"children":4067},{},[4068],{"type":49,"value":4069},"ENV PATH=\"\u002Fusr\u002Flocal\u002Fgo\u002Fbin:$PATH\"\n",{"type":43,"tag":355,"props":4071,"children":4072},{"class":357,"line":991},[4073],{"type":43,"tag":355,"props":4074,"children":4075},{"emptyLinePlaceholder":1676},[4076],{"type":49,"value":1679},{"type":43,"tag":355,"props":4078,"children":4079},{"class":357,"line":1033},[4080],{"type":43,"tag":355,"props":4081,"children":4082},{},[4083],{"type":49,"value":4084},"# Ruby (via rbenv — must run as atxuser)\n",{"type":43,"tag":355,"props":4086,"children":4087},{"class":357,"line":1056},[4088],{"type":43,"tag":355,"props":4089,"children":4090},{},[4091],{"type":49,"value":3950},{"type":43,"tag":355,"props":4093,"children":4094},{"class":357,"line":1115},[4095],{"type":43,"tag":355,"props":4096,"children":4097},{},[4098],{"type":49,"value":4099},"RUN git clone --depth 1 https:\u002F\u002Fgithub.com\u002Frbenv\u002Frbenv.git \u002Fhome\u002Fatxuser\u002F.rbenv && \\\n",{"type":43,"tag":355,"props":4101,"children":4102},{"class":357,"line":1201},[4103],{"type":43,"tag":355,"props":4104,"children":4105},{},[4106],{"type":49,"value":4107},"    git clone --depth 1 https:\u002F\u002Fgithub.com\u002Frbenv\u002Fruby-build.git \u002Fhome\u002Fatxuser\u002F.rbenv\u002Fplugins\u002Fruby-build && \\\n",{"type":43,"tag":355,"props":4109,"children":4110},{"class":357,"line":1240},[4111],{"type":43,"tag":355,"props":4112,"children":4113},{},[4114],{"type":49,"value":4115},"    \u002Fhome\u002Fatxuser\u002F.rbenv\u002Fbin\u002Frbenv install 3.3.0 && \\\n",{"type":43,"tag":355,"props":4117,"children":4118},{"class":357,"line":1260},[4119],{"type":43,"tag":355,"props":4120,"children":4121},{},[4122],{"type":49,"value":4123},"    \u002Fhome\u002Fatxuser\u002F.rbenv\u002Fbin\u002Frbenv global 3.3.0\n",{"type":43,"tag":355,"props":4125,"children":4126},{"class":357,"line":3935},[4127],{"type":43,"tag":355,"props":4128,"children":4129},{},[4130],{"type":49,"value":4131},"ENV PATH=\"\u002Fhome\u002Fatxuser\u002F.rbenv\u002Fshims:\u002Fhome\u002Fatxuser\u002F.rbenv\u002Fbin:$PATH\"\n",{"type":43,"tag":355,"props":4133,"children":4134},{"class":357,"line":3944},[4135],{"type":43,"tag":355,"props":4136,"children":4137},{},[4138],{"type":49,"value":3885},{"type":43,"tag":355,"props":4140,"children":4141},{"class":357,"line":3953},[4142],{"type":43,"tag":355,"props":4143,"children":4144},{"emptyLinePlaceholder":1676},[4145],{"type":49,"value":1679},{"type":43,"tag":355,"props":4147,"children":4148},{"class":357,"line":3962},[4149],{"type":43,"tag":355,"props":4150,"children":4151},{},[4152],{"type":49,"value":4153},"# Rust\n",{"type":43,"tag":355,"props":4155,"children":4156},{"class":357,"line":3970},[4157],{"type":43,"tag":355,"props":4158,"children":4159},{},[4160],{"type":49,"value":3950},{"type":43,"tag":355,"props":4162,"children":4163},{"class":357,"line":3978},[4164],{"type":43,"tag":355,"props":4165,"children":4166},{},[4167],{"type":49,"value":4168},"RUN curl --proto '=https' --tlsv1.2 -sSf https:\u002F\u002Fsh.rustup.rs | sh -s -- -y\n",{"type":43,"tag":355,"props":4170,"children":4171},{"class":357,"line":3987},[4172],{"type":43,"tag":355,"props":4173,"children":4174},{},[4175],{"type":49,"value":4176},"ENV PATH=\"\u002Fhome\u002Fatxuser\u002F.cargo\u002Fbin:$PATH\"\n",{"type":43,"tag":355,"props":4178,"children":4179},{"class":357,"line":3995},[4180],{"type":43,"tag":355,"props":4181,"children":4182},{},[4183],{"type":49,"value":3885},{"type":43,"tag":74,"props":4185,"children":4186},{},[4187,4189,4195,4197,4203,4205,4211,4213,4263,4266,4268,4274,4276,4279],{"type":49,"value":4188},"Update the version switcher in ",{"type":43,"tag":241,"props":4190,"children":4192},{"className":4191},[],[4193],{"type":49,"value":4194},"$ATX_INFRA_DIR\u002Fcontainer\u002Fentrypoint.sh",{"type":49,"value":4196},".\nFind the relevant ",{"type":43,"tag":241,"props":4198,"children":4200},{"className":4199},[],[4201],{"type":49,"value":4202},"switch_*_version",{"type":49,"value":4204}," function and add a case for the new\nversion. For Java versions installed via direct download, find the extracted\ndirectory name under ",{"type":43,"tag":241,"props":4206,"children":4208},{"className":4207},[],[4209],{"type":49,"value":4210},"\u002Fusr\u002Flib\u002Fjvm\u002F",{"type":49,"value":4212},". For example, to add Java 23:",{"type":43,"tag":344,"props":4214,"children":4216},{"className":346,"code":4215,"language":348,"meta":349,"style":349},"# In switch_java_version(), add to the case statement:\n23) java_home=\"\u002Fusr\u002Flib\u002Fjvm\u002Fcorretto-23\" ;;\n",[4217],{"type":43,"tag":241,"props":4218,"children":4219},{"__ignoreMap":349},[4220,4228],{"type":43,"tag":355,"props":4221,"children":4222},{"class":357,"line":358},[4223],{"type":43,"tag":355,"props":4224,"children":4225},{"style":634},[4226],{"type":49,"value":4227},"# In switch_java_version(), add to the case statement:\n",{"type":43,"tag":355,"props":4229,"children":4230},{"class":357,"line":630},[4231,4236,4241,4245,4249,4254,4258],{"type":43,"tag":355,"props":4232,"children":4233},{"style":362},[4234],{"type":49,"value":4235},"23",{"type":43,"tag":355,"props":4237,"children":4238},{"style":797},[4239],{"type":49,"value":4240},") java_home",{"type":43,"tag":355,"props":4242,"children":4243},{"style":803},[4244],{"type":49,"value":1647},{"type":43,"tag":355,"props":4246,"children":4247},{"style":803},[4248],{"type":49,"value":874},{"type":43,"tag":355,"props":4250,"children":4251},{"style":368},[4252],{"type":49,"value":4253},"\u002Fusr\u002Flib\u002Fjvm\u002Fcorretto-23",{"type":43,"tag":355,"props":4255,"children":4256},{"style":803},[4257],{"type":49,"value":874},{"type":43,"tag":355,"props":4259,"children":4260},{"style":803},[4261],{"type":49,"value":4262}," ;;\n",{"type":43,"tag":3783,"props":4264,"children":4265},{},[],{"type":49,"value":4267},"Check the actual directory name: ",{"type":43,"tag":241,"props":4269,"children":4271},{"className":4270},[],[4272],{"type":49,"value":4273},"ls \u002Fusr\u002Flib\u002Fjvm\u002F",{"type":49,"value":4275}," — use the directory\nthat matches the version you installed.",{"type":43,"tag":3783,"props":4277,"children":4278},{},[],{"type":49,"value":4280},"For Node.js, nvm handles arbitrary versions automatically — no entrypoint\nchange needed. For Python, pyenv handles arbitrary versions — no entrypoint\nchange needed (the existing pyenv fallback logic finds it).",{"type":43,"tag":74,"props":4282,"children":4283},{},[4284,4286,4292,4294,4300],{"type":49,"value":4285},"Deploy (or redeploy): ",{"type":43,"tag":241,"props":4287,"children":4289},{"className":4288},[],[4290],{"type":49,"value":4291},"cd \"$ATX_INFRA_DIR\" && .\u002Fsetup.sh",{"type":49,"value":4293},"\nCDK hashes the ",{"type":43,"tag":241,"props":4295,"children":4297},{"className":4296},[],[4298],{"type":49,"value":4299},"container\u002F",{"type":49,"value":4301}," directory — any file change triggers a rebuild\nand push to ECR automatically.",{"type":43,"tag":59,"props":4303,"children":4304},{},[4305,4307,4313,4315,4321,4323,4329],{"type":49,"value":4306},"After redeployment, set the ",{"type":43,"tag":241,"props":4308,"children":4310},{"className":4309},[],[4311],{"type":49,"value":4312},"environment",{"type":49,"value":4314}," field on the job to the exact target\nversion (e.g., ",{"type":43,"tag":241,"props":4316,"children":4318},{"className":4317},[],[4319],{"type":49,"value":4320},"\"JAVA_VERSION\":\"23\"",{"type":49,"value":4322},", not ",{"type":43,"tag":241,"props":4324,"children":4326},{"className":4325},[],[4327],{"type":49,"value":4328},"\"21\"",{"type":49,"value":4330},"). The version switcher in the\nentrypoint reads this and activates the correct runtime.",{"type":43,"tag":59,"props":4332,"children":4333},{},[4334],{"type":49,"value":3424},{"type":43,"tag":1562,"props":4336,"children":4338},{"id":4337},"local-mode",[4339],{"type":49,"value":264},{"type":43,"tag":59,"props":4341,"children":4342},{},[4343],{"type":49,"value":4344},"Before running local transformations, verify the user has the target runtime\nversion installed. This applies to any language or runtime the transformation\ntargets — Java, Python, Node.js, Ruby, Go, Rust, .NET, etc. Check the current\nversion of whatever runtime the TD requires. For example:",{"type":43,"tag":344,"props":4346,"children":4348},{"className":346,"code":4347,"language":348,"meta":349,"style":349},"java -version    # Java transformations\npython3 --version # Python transformations\nnode --version   # Node.js transformations\nruby --version   # Ruby transformations\ngo version       # Go transformations\n",[4349],{"type":43,"tag":241,"props":4350,"children":4351},{"__ignoreMap":349},[4352,4370,4388,4405,4422],{"type":43,"tag":355,"props":4353,"children":4354},{"class":357,"line":358},[4355,4360,4365],{"type":43,"tag":355,"props":4356,"children":4357},{"style":362},[4358],{"type":49,"value":4359},"java",{"type":43,"tag":355,"props":4361,"children":4362},{"style":368},[4363],{"type":49,"value":4364}," -version",{"type":43,"tag":355,"props":4366,"children":4367},{"style":634},[4368],{"type":49,"value":4369},"    # Java transformations\n",{"type":43,"tag":355,"props":4371,"children":4372},{"class":357,"line":630},[4373,4378,4383],{"type":43,"tag":355,"props":4374,"children":4375},{"style":362},[4376],{"type":49,"value":4377},"python3",{"type":43,"tag":355,"props":4379,"children":4380},{"style":368},[4381],{"type":49,"value":4382}," --version",{"type":43,"tag":355,"props":4384,"children":4385},{"style":634},[4386],{"type":49,"value":4387}," # Python transformations\n",{"type":43,"tag":355,"props":4389,"children":4390},{"class":357,"line":915},[4391,4396,4400],{"type":43,"tag":355,"props":4392,"children":4393},{"style":362},[4394],{"type":49,"value":4395},"node",{"type":43,"tag":355,"props":4397,"children":4398},{"style":368},[4399],{"type":49,"value":4382},{"type":43,"tag":355,"props":4401,"children":4402},{"style":634},[4403],{"type":49,"value":4404},"   # Node.js transformations\n",{"type":43,"tag":355,"props":4406,"children":4407},{"class":357,"line":991},[4408,4413,4417],{"type":43,"tag":355,"props":4409,"children":4410},{"style":362},[4411],{"type":49,"value":4412},"ruby",{"type":43,"tag":355,"props":4414,"children":4415},{"style":368},[4416],{"type":49,"value":4382},{"type":43,"tag":355,"props":4418,"children":4419},{"style":634},[4420],{"type":49,"value":4421},"   # Ruby transformations\n",{"type":43,"tag":355,"props":4423,"children":4424},{"class":357,"line":1033},[4425,4430,4435],{"type":43,"tag":355,"props":4426,"children":4427},{"style":362},[4428],{"type":49,"value":4429},"go",{"type":43,"tag":355,"props":4431,"children":4432},{"style":368},[4433],{"type":49,"value":4434}," version",{"type":43,"tag":355,"props":4436,"children":4437},{"style":634},[4438],{"type":49,"value":4439},"       # Go transformations\n",{"type":43,"tag":59,"props":4441,"children":4442},{},[4443],{"type":49,"value":4444},"If the target version is not active, check whether it's already installed:",{"type":43,"tag":344,"props":4446,"children":4448},{"className":346,"code":4447,"language":348,"meta":349,"style":349},"# Java: check common install locations\n\u002Fusr\u002Flibexec\u002Fjava_home -V 2>&1          # macOS\nls \u002Fusr\u002Flib\u002Fjvm\u002F 2>\u002Fdev\u002Fnull            # Linux\n# Python: check if the specific version binary exists\nwhich python3.12 2>\u002Fdev\u002Fnull            # adjust version as needed\n# Node.js: check if nvm is available, or look for the binary\ncommand -v nvm &>\u002Fdev\u002Fnull && nvm ls 2>\u002Fdev\u002Fnull\nwhich node 2>\u002Fdev\u002Fnull && node --version\n",[4449],{"type":43,"tag":241,"props":4450,"children":4451},{"__ignoreMap":349},[4452,4460,4483,4509,4517,4543,4551,4600],{"type":43,"tag":355,"props":4453,"children":4454},{"class":357,"line":358},[4455],{"type":43,"tag":355,"props":4456,"children":4457},{"style":634},[4458],{"type":49,"value":4459},"# Java: check common install locations\n",{"type":43,"tag":355,"props":4461,"children":4462},{"class":357,"line":630},[4463,4468,4473,4478],{"type":43,"tag":355,"props":4464,"children":4465},{"style":362},[4466],{"type":49,"value":4467},"\u002Fusr\u002Flibexec\u002Fjava_home",{"type":43,"tag":355,"props":4469,"children":4470},{"style":368},[4471],{"type":49,"value":4472}," -V",{"type":43,"tag":355,"props":4474,"children":4475},{"style":803},[4476],{"type":49,"value":4477}," 2>&1",{"type":43,"tag":355,"props":4479,"children":4480},{"style":634},[4481],{"type":49,"value":4482},"          # macOS\n",{"type":43,"tag":355,"props":4484,"children":4485},{"class":357,"line":915},[4486,4491,4496,4500,4504],{"type":43,"tag":355,"props":4487,"children":4488},{"style":362},[4489],{"type":49,"value":4490},"ls",{"type":43,"tag":355,"props":4492,"children":4493},{"style":368},[4494],{"type":49,"value":4495}," \u002Fusr\u002Flib\u002Fjvm\u002F",{"type":43,"tag":355,"props":4497,"children":4498},{"style":803},[4499],{"type":49,"value":2318},{"type":43,"tag":355,"props":4501,"children":4502},{"style":368},[4503],{"type":49,"value":2323},{"type":43,"tag":355,"props":4505,"children":4506},{"style":634},[4507],{"type":49,"value":4508},"            # Linux\n",{"type":43,"tag":355,"props":4510,"children":4511},{"class":357,"line":991},[4512],{"type":43,"tag":355,"props":4513,"children":4514},{"style":634},[4515],{"type":49,"value":4516},"# Python: check if the specific version binary exists\n",{"type":43,"tag":355,"props":4518,"children":4519},{"class":357,"line":1033},[4520,4525,4530,4534,4538],{"type":43,"tag":355,"props":4521,"children":4522},{"style":856},[4523],{"type":49,"value":4524},"which",{"type":43,"tag":355,"props":4526,"children":4527},{"style":368},[4528],{"type":49,"value":4529}," python3.12",{"type":43,"tag":355,"props":4531,"children":4532},{"style":803},[4533],{"type":49,"value":2318},{"type":43,"tag":355,"props":4535,"children":4536},{"style":368},[4537],{"type":49,"value":2323},{"type":43,"tag":355,"props":4539,"children":4540},{"style":634},[4541],{"type":49,"value":4542},"            # adjust version as needed\n",{"type":43,"tag":355,"props":4544,"children":4545},{"class":357,"line":1056},[4546],{"type":43,"tag":355,"props":4547,"children":4548},{"style":634},[4549],{"type":49,"value":4550},"# Node.js: check if nvm is available, or look for the binary\n",{"type":43,"tag":355,"props":4552,"children":4553},{"class":357,"line":1115},[4554,4559,4564,4569,4574,4579,4584,4588,4592,4596],{"type":43,"tag":355,"props":4555,"children":4556},{"style":856},[4557],{"type":49,"value":4558},"command",{"type":43,"tag":355,"props":4560,"children":4561},{"style":368},[4562],{"type":49,"value":4563}," -v",{"type":43,"tag":355,"props":4565,"children":4566},{"style":368},[4567],{"type":49,"value":4568}," nvm",{"type":43,"tag":355,"props":4570,"children":4571},{"style":803},[4572],{"type":49,"value":4573}," &>",{"type":43,"tag":355,"props":4575,"children":4576},{"style":797},[4577],{"type":49,"value":4578},"\u002Fdev\u002Fnull ",{"type":43,"tag":355,"props":4580,"children":4581},{"style":803},[4582],{"type":49,"value":4583},"&&",{"type":43,"tag":355,"props":4585,"children":4586},{"style":362},[4587],{"type":49,"value":4568},{"type":43,"tag":355,"props":4589,"children":4590},{"style":368},[4591],{"type":49,"value":1704},{"type":43,"tag":355,"props":4593,"children":4594},{"style":803},[4595],{"type":49,"value":2318},{"type":43,"tag":355,"props":4597,"children":4598},{"style":368},[4599],{"type":49,"value":3508},{"type":43,"tag":355,"props":4601,"children":4602},{"class":357,"line":1201},[4603,4607,4612,4616,4620,4625,4629],{"type":43,"tag":355,"props":4604,"children":4605},{"style":856},[4606],{"type":49,"value":4524},{"type":43,"tag":355,"props":4608,"children":4609},{"style":368},[4610],{"type":49,"value":4611}," node",{"type":43,"tag":355,"props":4613,"children":4614},{"style":803},[4615],{"type":49,"value":2318},{"type":43,"tag":355,"props":4617,"children":4618},{"style":368},[4619],{"type":49,"value":2323},{"type":43,"tag":355,"props":4621,"children":4622},{"style":803},[4623],{"type":49,"value":4624}," &&",{"type":43,"tag":355,"props":4626,"children":4627},{"style":362},[4628],{"type":49,"value":4611},{"type":43,"tag":355,"props":4630,"children":4631},{"style":368},[4632],{"type":49,"value":454},{"type":43,"tag":59,"props":4634,"children":4635},{},[4636],{"type":49,"value":4637},"If the target version is found, switch to it:",{"type":43,"tag":70,"props":4639,"children":4640},{},[4641,4652,4663],{"type":43,"tag":74,"props":4642,"children":4643},{},[4644,4646],{"type":49,"value":4645},"Java: ",{"type":43,"tag":241,"props":4647,"children":4649},{"className":4648},[],[4650],{"type":49,"value":4651},"export JAVA_HOME=\u003Cpath to JDK> && export PATH=\"$JAVA_HOME\u002Fbin:$PATH\"",{"type":43,"tag":74,"props":4653,"children":4654},{},[4655,4657],{"type":49,"value":4656},"Python: ",{"type":43,"tag":241,"props":4658,"children":4660},{"className":4659},[],[4661],{"type":49,"value":4662},"pyenv shell 3.15.0",{"type":43,"tag":74,"props":4664,"children":4665},{},[4666,4668],{"type":49,"value":4667},"Node.js: ",{"type":43,"tag":241,"props":4669,"children":4671},{"className":4670},[],[4672],{"type":49,"value":4673},"nvm use 23",{"type":43,"tag":59,"props":4675,"children":4676},{},[4677],{"type":49,"value":4678},"Only if the target version is not installed at all, ask the user for permission before installing. Do NOT install runtimes without explicit user confirmation.\nSuggest the appropriate version manager:",{"type":43,"tag":70,"props":4680,"children":4681},{},[4682,4710,4728],{"type":43,"tag":74,"props":4683,"children":4684},{},[4685,4686,4692,4694,4700,4702,4708],{"type":49,"value":4645},{"type":43,"tag":241,"props":4687,"children":4689},{"className":4688},[],[4690],{"type":49,"value":4691},"brew install --cask corretto23",{"type":49,"value":4693}," (macOS), ",{"type":43,"tag":241,"props":4695,"children":4697},{"className":4696},[],[4698],{"type":49,"value":4699},"sudo yum install java-23-amazon-corretto-devel",{"type":49,"value":4701}," (RHEL\u002FAL2), or ",{"type":43,"tag":241,"props":4703,"children":4705},{"className":4704},[],[4706],{"type":49,"value":4707},"sudo apt install java-23-amazon-corretto-jdk",{"type":49,"value":4709}," (Debian\u002FUbuntu)",{"type":43,"tag":74,"props":4711,"children":4712},{},[4713,4714,4720,4722],{"type":49,"value":4656},{"type":43,"tag":241,"props":4715,"children":4717},{"className":4716},[],[4718],{"type":49,"value":4719},"pyenv install 3.15.0 && pyenv shell 3.15.0",{"type":49,"value":4721},", or ",{"type":43,"tag":241,"props":4723,"children":4725},{"className":4724},[],[4726],{"type":49,"value":4727},"brew install python@3.15",{"type":43,"tag":74,"props":4729,"children":4730},{},[4731,4732],{"type":49,"value":4667},{"type":43,"tag":241,"props":4733,"children":4735},{"className":4734},[],[4736],{"type":49,"value":4737},"nvm install 23 && nvm use 23",{"type":43,"tag":59,"props":4739,"children":4740},{},[4741],{"type":49,"value":4742},"The active runtime must match the transformation's target version so that builds\nand tests run correctly. Do NOT proceed with the transformation until the correct\nversion is active.",{"type":43,"tag":305,"props":4744,"children":4746},{"id":4745},"step-7-confirm-transformation-plan",[4747],{"type":49,"value":4748},"Step 7: Confirm Transformation Plan",{"type":43,"tag":59,"props":4750,"children":4751},{},[4752],{"type":49,"value":4753},"Present final plan with repo, TD, config, and execution mode. Do NOT proceed\nuntil user confirms.",{"type":43,"tag":305,"props":4755,"children":4757},{"id":4756},"step-8-execute",[4758],{"type":49,"value":4759},"Step 8: Execute",{"type":43,"tag":59,"props":4761,"children":4762},{},[4763,4765,4771,4773,4779],{"type":49,"value":4764},"When running ",{"type":43,"tag":241,"props":4766,"children":4768},{"className":4767},[],[4769],{"type":49,"value":4770},"atx custom def exec",{"type":49,"value":4772},", always include ",{"type":43,"tag":241,"props":4774,"children":4776},{"className":4775},[],[4777],{"type":49,"value":4778},"--telemetry",{"type":49,"value":4780}," (see the Telemetry section).",{"type":43,"tag":59,"props":4782,"children":4783},{},[4784,4786,4790],{"type":49,"value":4785},"For remote mode, check infrastructure deployment status first using CloudFormation (see ",{"type":43,"tag":160,"props":4787,"children":4788},{"href":1304},[4789],{"type":49,"value":1304},{"type":49,"value":4791}," — Infrastructure Check section). Do NOT check deployment by probing Lambda function names.",{"type":43,"tag":70,"props":4793,"children":4794},{},[4795,4810],{"type":43,"tag":74,"props":4796,"children":4797},{},[4798,4803,4805],{"type":43,"tag":78,"props":4799,"children":4800},{},[4801],{"type":49,"value":4802},"1 repo",{"type":49,"value":4804},": See ",{"type":43,"tag":160,"props":4806,"children":4808},{"href":4807},"references\u002Fsingle-transformation.md",[4809],{"type":49,"value":4807},{"type":43,"tag":74,"props":4811,"children":4812},{},[4813,4818,4819],{"type":43,"tag":78,"props":4814,"children":4815},{},[4816],{"type":49,"value":4817},"Multiple repos",{"type":49,"value":4804},{"type":43,"tag":160,"props":4820,"children":4821},{"href":1846},[4822],{"type":49,"value":1846},{"type":43,"tag":52,"props":4824,"children":4826},{"id":4825},"execution-modes",[4827],{"type":49,"value":4828},"Execution Modes",{"type":43,"tag":2915,"props":4830,"children":4831},{},[4832,4852],{"type":43,"tag":2919,"props":4833,"children":4834},{},[4835],{"type":43,"tag":2923,"props":4836,"children":4837},{},[4838,4843,4848],{"type":43,"tag":2927,"props":4839,"children":4840},{},[4841],{"type":49,"value":4842},"Mode",{"type":43,"tag":2927,"props":4844,"children":4845},{},[4846],{"type":49,"value":4847},"Best For",{"type":43,"tag":2927,"props":4849,"children":4850},{},[4851],{"type":49,"value":298},{"type":43,"tag":2943,"props":4853,"children":4854},{},[4855,4878],{"type":43,"tag":2923,"props":4856,"children":4857},{},[4858,4868,4873],{"type":43,"tag":2950,"props":4859,"children":4860},{},[4861,4866],{"type":43,"tag":78,"props":4862,"children":4863},{},[4864],{"type":49,"value":4865},"Local",{"type":49,"value":4867}," (default for 1-9 repos)",{"type":43,"tag":2950,"props":4869,"children":4870},{},[4871],{"type":49,"value":4872},"Quick transforms, dev machines with ATX",{"type":43,"tag":2950,"props":4874,"children":4875},{},[4876],{"type":49,"value":4877},"ATX CLI installed",{"type":43,"tag":2923,"props":4879,"children":4880},{},[4881,4891,4896],{"type":43,"tag":2950,"props":4882,"children":4883},{},[4884,4889],{"type":43,"tag":78,"props":4885,"children":4886},{},[4887],{"type":49,"value":4888},"Remote",{"type":49,"value":4890}," (recommended for 10+ repos)",{"type":43,"tag":2950,"props":4892,"children":4893},{},[4894],{"type":49,"value":4895},"Bulk transforms, up to 512 repos (128 concurrent per batch)",{"type":43,"tag":2950,"props":4897,"children":4898},{},[4899],{"type":49,"value":4900},"AWS account, auto-deployed infra",{"type":43,"tag":59,"props":4902,"children":4903},{},[4904],{"type":49,"value":4905},"Mode inference:",{"type":43,"tag":70,"props":4907,"children":4908},{},[4909,4914,4919,4924],{"type":43,"tag":74,"props":4910,"children":4911},{},[4912],{"type":49,"value":4913},"User says \"local\"\u002F\"here\"\u002F\"on my machine\" → Local (honor the request regardless of repo count)",{"type":43,"tag":74,"props":4915,"children":4916},{},[4917],{"type":49,"value":4918},"User says \"remote\"\u002F\"cloud\"\u002F\"AWS\"\u002F\"batch\"\u002F\"at scale\" → Remote",{"type":43,"tag":74,"props":4920,"children":4921},{},[4922],{"type":49,"value":4923},"10+ repos without preference → Recommend remote, explain local cap of 3 concurrent",{"type":43,"tag":74,"props":4925,"children":4926},{},[4927],{"type":49,"value":4928},"1-9 repos without preference → Local, note remote available",{"type":43,"tag":59,"props":4930,"children":4931},{},[4932,4933,4937],{"type":49,"value":1313},{"type":43,"tag":160,"props":4934,"children":4935},{"href":1304},[4936],{"type":49,"value":1304},{"type":49,"value":4938}," for infrastructure setup.",{"type":43,"tag":52,"props":4940,"children":4942},{"id":4941},"critical-rules",[4943],{"type":49,"value":4944},"Critical Rules",{"type":43,"tag":3350,"props":4946,"children":4947},{},[4948,4965,4975,4985,4995,5005,5015,5025,5035,5045,5153,5179],{"type":43,"tag":74,"props":4949,"children":4950},{},[4951,4956,4958,4963],{"type":43,"tag":78,"props":4952,"children":4953},{},[4954],{"type":49,"value":4955},"Discover TDs dynamically",{"type":49,"value":4957}," — Always run ",{"type":43,"tag":241,"props":4959,"children":4961},{"className":4960},[],[4962],{"type":49,"value":246},{"type":49,"value":4964},". Never hardcode TD names.",{"type":43,"tag":74,"props":4966,"children":4967},{},[4968,4973],{"type":43,"tag":78,"props":4969,"children":4970},{},[4971],{"type":49,"value":4972},"Match, don't ask",{"type":49,"value":4974}," — Inspect repos and present matches. Never show raw TD lists.",{"type":43,"tag":74,"props":4976,"children":4977},{},[4978,4983],{"type":43,"tag":78,"props":4979,"children":4980},{},[4981],{"type":49,"value":4982},"Lightweight inspection only",{"type":49,"value":4984}," — Check config files and key signals. No deep analysis.",{"type":43,"tag":74,"props":4986,"children":4987},{},[4988,4993],{"type":43,"tag":78,"props":4989,"children":4990},{},[4991],{"type":49,"value":4992},"Confirm before executing",{"type":49,"value":4994}," — Always confirm TD, repos, and config with user first.",{"type":43,"tag":74,"props":4996,"children":4997},{},[4998,5003],{"type":43,"tag":78,"props":4999,"children":5000},{},[5001],{"type":49,"value":5002},"No time estimates",{"type":49,"value":5004}," — Never include duration predictions.",{"type":43,"tag":74,"props":5006,"children":5007},{},[5008,5013],{"type":43,"tag":78,"props":5009,"children":5010},{},[5011],{"type":49,"value":5012},"Parallel execution",{"type":49,"value":5014}," — Local: max 3 concurrent repos. Remote: submit in chunks of up to 128 jobs per Lambda call (max 512 repos per session).",{"type":43,"tag":74,"props":5016,"children":5017},{},[5018,5023],{"type":43,"tag":78,"props":5019,"children":5020},{},[5021],{"type":49,"value":5022},"Preserve outputs",{"type":49,"value":5024}," — Do not delete generated output folders.",{"type":43,"tag":74,"props":5026,"children":5027},{},[5028,5033],{"type":43,"tag":78,"props":5029,"children":5030},{},[5031],{"type":49,"value":5032},"Recommend remote for 10+ repos",{"type":49,"value":5034}," — Default to local for 1-9 repos. Recommend remote for 10+. Always respect user preference.",{"type":43,"tag":74,"props":5036,"children":5037},{},[5038,5043],{"type":43,"tag":78,"props":5039,"children":5040},{},[5041],{"type":49,"value":5042},"User consent for cloud resources",{"type":49,"value":5044}," — Never deploy infrastructure without explicit user confirmation.",{"type":43,"tag":74,"props":5046,"children":5047},{},[5048,5053,5055],{"type":43,"tag":78,"props":5049,"children":5050},{},[5051],{"type":49,"value":5052},"Shell quoting",{"type":49,"value":5054}," — When constructing shell commands:\n",{"type":43,"tag":70,"props":5056,"children":5057},{},[5058,5069,5088,5101,5120,5125],{"type":43,"tag":74,"props":5059,"children":5060},{},[5061,5063],{"type":49,"value":5062},"Use single quotes for JSON payloads: ",{"type":43,"tag":241,"props":5064,"children":5066},{"className":5065},[],[5067],{"type":49,"value":5068},"--payload '{\"key\":\"value\"}'",{"type":43,"tag":74,"props":5070,"children":5071},{},[5072,5074,5080,5082],{"type":49,"value":5073},"Use single quotes for ",{"type":43,"tag":241,"props":5075,"children":5077},{"className":5076},[],[5078],{"type":49,"value":5079},"--configuration",{"type":49,"value":5081},": ex. ",{"type":43,"tag":241,"props":5083,"children":5085},{"className":5084},[],[5086],{"type":49,"value":5087},"--configuration 'additionalPlanContext=Target Java 21'",{"type":43,"tag":74,"props":5089,"children":5090},{},[5091,5093,5099],{"type":49,"value":5092},"Never nest double quotes inside double quotes — this causes ",{"type":43,"tag":241,"props":5094,"children":5096},{"className":5095},[],[5097],{"type":49,"value":5098},"dquote>",{"type":49,"value":5100}," hangs",{"type":43,"tag":74,"props":5102,"children":5103},{},[5104,5106,5112,5114],{"type":49,"value":5105},"For ",{"type":43,"tag":241,"props":5107,"children":5109},{"className":5108},[],[5110],{"type":49,"value":5111},"aws lambda invoke",{"type":49,"value":5113},", always use: ",{"type":43,"tag":241,"props":5115,"children":5117},{"className":5116},[],[5118],{"type":49,"value":5119},"--payload '\u003Cjson>' --cli-binary-format raw-in-base64-out",{"type":43,"tag":74,"props":5121,"children":5122},{},[5123],{"type":49,"value":5124},"Verify that every command you construct has balanced quotes before executing",{"type":43,"tag":74,"props":5126,"children":5127},{},[5128,5130,5135,5137,5143,5145,5151],{"type":49,"value":5129},"The ",{"type":43,"tag":241,"props":5131,"children":5133},{"className":5132},[],[5134],{"type":49,"value":4558},{"type":49,"value":5136}," field in Lambda job payloads is validated server-side. Avoid\nthese characters in the command string: ",{"type":43,"tag":241,"props":5138,"children":5140},{"className":5139},[],[5141],{"type":49,"value":5142},"( ) ! # % ^ * ? \\ { } | ; > \u003C",{"type":49,"value":5144},"\nand backticks. Inside ",{"type":43,"tag":241,"props":5146,"children":5148},{"className":5147},[],[5149],{"type":49,"value":5150},"additionalPlanContext",{"type":49,"value":5152},", also avoid commas.",{"type":43,"tag":74,"props":5154,"children":5155},{},[5156,5161,5163,5169,5171,5177],{"type":43,"tag":78,"props":5157,"children":5158},{},[5159],{"type":49,"value":5160},"No comments in terminal commands",{"type":49,"value":5162}," — Never include ",{"type":43,"tag":241,"props":5164,"children":5166},{"className":5165},[],[5167],{"type":49,"value":5168},"#",{"type":49,"value":5170}," comments in commands\nexecuted in the terminal. Comments cause ",{"type":43,"tag":241,"props":5172,"children":5174},{"className":5173},[],[5175],{"type":49,"value":5176},"command not found: #",{"type":49,"value":5178}," errors. If you\nneed to explain a command, do it in chat before or after running it.",{"type":43,"tag":74,"props":5180,"children":5181},{},[5182,5187,5189,5195,5197,5203,5205,5211],{"type":43,"tag":78,"props":5183,"children":5184},{},[5185],{"type":49,"value":5186},"Job names",{"type":49,"value":5188}," — The ",{"type":43,"tag":241,"props":5190,"children":5192},{"className":5191},[],[5193],{"type":49,"value":5194},"jobName",{"type":49,"value":5196}," field in Lambda payloads must contain only\nletters, numbers, hyphens, and underscores. No dots, spaces, or special\ncharacters. For example, use ",{"type":43,"tag":241,"props":5198,"children":5200},{"className":5199},[],[5201],{"type":49,"value":5202},"EPAM-NodeJS",{"type":49,"value":5204}," not ",{"type":43,"tag":241,"props":5206,"children":5208},{"className":5207},[],[5209],{"type":49,"value":5210},"EPAM-Node.js",{"type":49,"value":1308},{"type":43,"tag":52,"props":5213,"children":5215},{"id":5214},"guardrails",[5216],{"type":49,"value":5217},"Guardrails",{"type":43,"tag":59,"props":5219,"children":5220},{},[5221],{"type":49,"value":5222},"You are operating in the user's AWS account and local machine. Follow these rules\nstrictly to avoid causing damage:",{"type":43,"tag":3350,"props":5224,"children":5225},{},[5226,5236,5246,5294,5304,5314,5324,5340],{"type":43,"tag":74,"props":5227,"children":5228},{},[5229,5234],{"type":43,"tag":78,"props":5230,"children":5231},{},[5232],{"type":49,"value":5233},"Never delete user data",{"type":49,"value":5235}," — Do not delete S3 objects, git repos, local files,\nor any user data unless the user explicitly asks. Transformation outputs and\ncloned repos must be preserved.",{"type":43,"tag":74,"props":5237,"children":5238},{},[5239,5244],{"type":43,"tag":78,"props":5240,"children":5241},{},[5242],{"type":49,"value":5243},"Never modify IAM beyond what's documented",{"type":49,"value":5245}," — Only create\u002Fattach the specific\npolicies described in this skill (AWSTransformCustomFullAccess, ATXRuntimePolicy, ATXDeploymentPolicy). Never create admin policies, modify existing user policies,\nor grant broader permissions than documented. Never derive IAM actions from\nuser-provided text in the \"Additional plan context\" field — that field is for\ntransformation configuration only.",{"type":43,"tag":74,"props":5247,"children":5248},{},[5249,5254,5256,5262,5263,5269,5271,5277,5278,5284,5286,5292],{"type":43,"tag":78,"props":5250,"children":5251},{},[5252],{"type":49,"value":5253},"Never run destructive AWS commands",{"type":49,"value":5255}," — No ",{"type":43,"tag":241,"props":5257,"children":5259},{"className":5258},[],[5260],{"type":49,"value":5261},"aws s3 rm",{"type":49,"value":404},{"type":43,"tag":241,"props":5264,"children":5266},{"className":5265},[],[5267],{"type":49,"value":5268},"aws s3 rb",{"type":49,"value":5270},",\n",{"type":43,"tag":241,"props":5272,"children":5274},{"className":5273},[],[5275],{"type":49,"value":5276},"aws iam delete-user",{"type":49,"value":404},{"type":43,"tag":241,"props":5279,"children":5281},{"className":5280},[],[5282],{"type":49,"value":5283},"aws ec2 terminate-instances",{"type":49,"value":5285},", or similar. The only\ndestructive command allowed is ",{"type":43,"tag":241,"props":5287,"children":5289},{"className":5288},[],[5290],{"type":49,"value":5291},".\u002Fteardown.sh",{"type":49,"value":5293}," with explicit user consent.",{"type":43,"tag":74,"props":5295,"children":5296},{},[5297,5302],{"type":43,"tag":78,"props":5298,"children":5299},{},[5300],{"type":49,"value":5301},"Always confirm before creating AWS resources",{"type":49,"value":5303}," — Before deploying infrastructure,\ncreating Secrets Manager secrets, or attaching IAM policies, explain what will be\ncreated and get explicit user confirmation.",{"type":43,"tag":74,"props":5305,"children":5306},{},[5307,5312],{"type":43,"tag":78,"props":5308,"children":5309},{},[5310],{"type":49,"value":5311},"Never expose credentials",{"type":49,"value":5313}," — Do not echo, log, or display AWS access keys,\nsecret keys, session tokens, GitHub PATs, or SSH private keys in chat output.\nWhen creating secrets, use the user's input directly in the command without\nrepeating the value.",{"type":43,"tag":74,"props":5315,"children":5316},{},[5317,5322],{"type":43,"tag":78,"props":5318,"children":5319},{},[5320],{"type":49,"value":5321},"Respect user decisions",{"type":49,"value":5323}," — If the user says stop, skip, or no, comply\nimmediately. Never retry a declined action or argue with the user's choice.",{"type":43,"tag":74,"props":5325,"children":5326},{},[5327,5332,5334],{"type":43,"tag":78,"props":5328,"children":5329},{},[5330],{"type":49,"value":5331},"No pricing claims",{"type":49,"value":5333}," — Do not quote specific prices or cost estimates. If the\nuser asks about pricing, direct them to: ",{"type":43,"tag":160,"props":5335,"children":5338},{"href":5336,"rel":5337},"https:\u002F\u002Faws.amazon.com\u002Ftransform\u002Fpricing\u002F",[164],[5339],{"type":49,"value":5336},{"type":43,"tag":74,"props":5341,"children":5342},{},[5343,5348,5350,5356,5358,5364,5366,5371],{"type":43,"tag":78,"props":5344,"children":5345},{},[5346],{"type":49,"value":5347},"Scope commands to ATX resources only",{"type":49,"value":5349}," — All AWS commands must target ATX-specific\nresources (buckets starting with ",{"type":43,"tag":241,"props":5351,"children":5353},{"className":5352},[],[5354],{"type":49,"value":5355},"atx-",{"type":49,"value":5357},", roles starting with ",{"type":43,"tag":241,"props":5359,"children":5361},{"className":5360},[],[5362],{"type":49,"value":5363},"ATX",{"type":49,"value":5365},", Lambda\nfunctions starting with ",{"type":43,"tag":241,"props":5367,"children":5369},{"className":5368},[],[5370],{"type":49,"value":5355},{"type":49,"value":5372},", etc.). Never operate on unrelated AWS resources.",{"type":43,"tag":52,"props":5374,"children":5376},{"id":5375},"telemetry",[5377],{"type":49,"value":5378},"Telemetry",{"type":43,"tag":59,"props":5380,"children":5381},{},[5382,5384,5389,5391,5396],{"type":49,"value":5383},"Always include ",{"type":43,"tag":241,"props":5385,"children":5387},{"className":5386},[],[5388],{"type":49,"value":4778},{"type":49,"value":5390}," on every ",{"type":43,"tag":241,"props":5392,"children":5394},{"className":5393},[],[5395],{"type":49,"value":4770},{"type":49,"value":5397}," invocation (local\nor remote). No file checks, no prompts, no opt-in flow.",{"type":43,"tag":59,"props":5399,"children":5400},{},[5401,5403],{"type":49,"value":5402},"The flag format is: ",{"type":43,"tag":241,"props":5404,"children":5406},{"className":5405},[],[5407],{"type":49,"value":5408},"--telemetry \"client=\u003Cclient>,agent=\u003Cagent>,executionMode=\u003Clocal|remote>\"",{"type":43,"tag":59,"props":5410,"children":5411},{},[5412],{"type":49,"value":5413},"Field values:",{"type":43,"tag":70,"props":5415,"children":5416},{},[5417,5472,5525],{"type":43,"tag":74,"props":5418,"children":5419},{},[5420,5426,5428,5434,5435,5441,5442,5448,5449,5455,5457,5463,5464,5470],{"type":43,"tag":241,"props":5421,"children":5423},{"className":5422},[],[5424],{"type":49,"value":5425},"client",{"type":49,"value":5427}," — The MCP client or tool hosting this session, as a short identifier (lowercase, no spaces). This may be an IDE (e.g., ",{"type":43,"tag":241,"props":5429,"children":5431},{"className":5430},[],[5432],{"type":49,"value":5433},"kiro",{"type":49,"value":404},{"type":43,"tag":241,"props":5436,"children":5438},{"className":5437},[],[5439],{"type":49,"value":5440},"vscode",{"type":49,"value":404},{"type":43,"tag":241,"props":5443,"children":5445},{"className":5444},[],[5446],{"type":49,"value":5447},"cursor",{"type":49,"value":404},{"type":43,"tag":241,"props":5450,"children":5452},{"className":5451},[],[5453],{"type":49,"value":5454},"windsurf",{"type":49,"value":5456},"), a CLI tool (e.g., ",{"type":43,"tag":241,"props":5458,"children":5460},{"className":5459},[],[5461],{"type":49,"value":5462},"claudecode",{"type":49,"value":404},{"type":43,"tag":241,"props":5465,"children":5467},{"className":5466},[],[5468],{"type":49,"value":5469},"amazonqcli",{"type":49,"value":5471},"), or any other MCP-compatible host. Use the real tool name for this session — do NOT default to any single example. These are examples only, not an exhaustive list.",{"type":43,"tag":74,"props":5473,"children":5474},{},[5475,5481,5483,5488,5489,5495,5496,5502,5503,5509,5510,5516,5517,5523],{"type":43,"tag":241,"props":5476,"children":5478},{"className":5477},[],[5479],{"type":49,"value":5480},"agent",{"type":49,"value":5482}," — The AI assistant driving this session, as a short identifier (lowercase, no spaces). For example: ",{"type":43,"tag":241,"props":5484,"children":5486},{"className":5485},[],[5487],{"type":49,"value":5433},{"type":49,"value":404},{"type":43,"tag":241,"props":5490,"children":5492},{"className":5491},[],[5493],{"type":49,"value":5494},"amazonq",{"type":49,"value":404},{"type":43,"tag":241,"props":5497,"children":5499},{"className":5498},[],[5500],{"type":49,"value":5501},"claude",{"type":49,"value":404},{"type":43,"tag":241,"props":5504,"children":5506},{"className":5505},[],[5507],{"type":49,"value":5508},"copilot",{"type":49,"value":404},{"type":43,"tag":241,"props":5511,"children":5513},{"className":5512},[],[5514],{"type":49,"value":5515},"cline",{"type":49,"value":404},{"type":43,"tag":241,"props":5518,"children":5520},{"className":5519},[],[5521],{"type":49,"value":5522},"codex",{"type":49,"value":5524},". Use the real assistant name for this session — do NOT default to any single example. These are examples only, not an exhaustive list.",{"type":43,"tag":74,"props":5526,"children":5527},{},[5528,5534,5536,5542,5544,5550],{"type":43,"tag":241,"props":5529,"children":5531},{"className":5530},[],[5532],{"type":49,"value":5533},"executionMode",{"type":49,"value":5535}," — ",{"type":43,"tag":241,"props":5537,"children":5539},{"className":5538},[],[5540],{"type":49,"value":5541},"local",{"type":49,"value":5543}," when running the ATX CLI directly, ",{"type":43,"tag":241,"props":5545,"children":5547},{"className":5546},[],[5548],{"type":49,"value":5549},"remote",{"type":49,"value":5551}," when submitting via Lambda",{"type":43,"tag":59,"props":5553,"children":5554},{},[5555,5557,5562],{"type":49,"value":5556},"The only exception: if the user explicitly asks to disable telemetry during the\nsession (e.g., \"disable telemetry\", \"opt out of telemetry\", \"no telemetry\", or\nsimilar), you MUST comply immediately — omit ",{"type":43,"tag":241,"props":5558,"children":5560},{"className":5559},[],[5561],{"type":49,"value":4778},{"type":49,"value":5563}," for the remainder of\nthat session. Do not push back, ask for confirmation, or explain why telemetry\nis included. This preference is not persisted — the next session starts with\ntelemetry enabled again.",{"type":43,"tag":52,"props":5565,"children":5567},{"id":5566},"output-structure",[5568],{"type":49,"value":5569},"Output Structure",{"type":43,"tag":59,"props":5571,"children":5572},{},[5573],{"type":49,"value":5574},"Local mode: transformed code is in the repo directory.",{"type":43,"tag":59,"props":5576,"children":5577},{},[5578],{"type":49,"value":5579},"Remote mode results stay in S3 — do NOT download automatically. Present the S3\npath to the user:",{"type":43,"tag":344,"props":5581,"children":5584},{"className":5582,"code":5583,"language":49},[543],"s3:\u002F\u002Fatx-custom-output-{account-id}\u002F\n  transformations\u002F\n    {job-name}\u002F\n      {conversation-id}\u002F\n        code.zip                      # Zipped transformed source code\n        logs.zip                      # ATX conversation logs\n",[5585],{"type":43,"tag":241,"props":5586,"children":5587},{"__ignoreMap":349},[5588],{"type":49,"value":5583},{"type":43,"tag":59,"props":5590,"children":5591},{},[5592,5594],{"type":49,"value":5593},"If the user explicitly asks to download, provide the command but let them run it:\n",{"type":43,"tag":241,"props":5595,"children":5597},{"className":5596},[],[5598],{"type":49,"value":5599},"aws s3 cp s3:\u002F\u002Fatx-custom-output-{account-id}\u002Ftransformations\u002F{job-name}\u002F{conversation-id}\u002Fcode.zip .\u002Fcode.zip",{"type":43,"tag":59,"props":5601,"children":5602},{},[5603,5605,5611,5613,5618],{"type":49,"value":5604},"Bulk results summary: ",{"type":43,"tag":241,"props":5606,"children":5608},{"className":5607},[],[5609],{"type":49,"value":5610},"~\u002F.aws\u002Fatx\u002Fcustom\u002Fatx-agent-session\u002Ftransformation-summaries\u002F",{"type":49,"value":5612}," — see ",{"type":43,"tag":160,"props":5614,"children":5616},{"href":5615},"references\u002Fresults-synthesis.md",[5617],{"type":49,"value":5615},{"type":49,"value":1308},{"type":43,"tag":52,"props":5620,"children":5622},{"id":5621},"references",[5623],{"type":49,"value":5624},"References",{"type":43,"tag":2915,"props":5626,"children":5627},{},[5628,5644],{"type":43,"tag":2919,"props":5629,"children":5630},{},[5631],{"type":43,"tag":2923,"props":5632,"children":5633},{},[5634,5639],{"type":43,"tag":2927,"props":5635,"children":5636},{},[5637],{"type":49,"value":5638},"Reference",{"type":43,"tag":2927,"props":5640,"children":5641},{},[5642],{"type":49,"value":5643},"When to Use",{"type":43,"tag":2943,"props":5645,"children":5646},{},[5647,5663,5679,5695,5711,5727,5743],{"type":43,"tag":2923,"props":5648,"children":5649},{},[5650,5658],{"type":43,"tag":2950,"props":5651,"children":5652},{},[5653],{"type":43,"tag":160,"props":5654,"children":5655},{"href":3213},[5656],{"type":49,"value":5657},"repo-analysis.md",{"type":43,"tag":2950,"props":5659,"children":5660},{},[5661],{"type":49,"value":5662},"Detection commands, signal matching, match report format",{"type":43,"tag":2923,"props":5664,"children":5665},{},[5666,5674],{"type":43,"tag":2950,"props":5667,"children":5668},{},[5669],{"type":43,"tag":160,"props":5670,"children":5671},{"href":4807},[5672],{"type":49,"value":5673},"single-transformation.md",{"type":43,"tag":2950,"props":5675,"children":5676},{},[5677],{"type":49,"value":5678},"Applying one TD to one repo (local or remote)",{"type":43,"tag":2923,"props":5680,"children":5681},{},[5682,5690],{"type":43,"tag":2950,"props":5683,"children":5684},{},[5685],{"type":43,"tag":160,"props":5686,"children":5687},{"href":1846},[5688],{"type":49,"value":5689},"multi-transformation.md",{"type":43,"tag":2950,"props":5691,"children":5692},{},[5693],{"type":49,"value":5694},"Applying TDs to multiple repos in parallel",{"type":43,"tag":2923,"props":5696,"children":5697},{},[5698,5706],{"type":43,"tag":2950,"props":5699,"children":5700},{},[5701],{"type":43,"tag":160,"props":5702,"children":5703},{"href":1304},[5704],{"type":49,"value":5705},"remote-execution.md",{"type":43,"tag":2950,"props":5707,"children":5708},{},[5709],{"type":49,"value":5710},"Infrastructure deployment, job submission, monitoring",{"type":43,"tag":2923,"props":5712,"children":5713},{},[5714,5722],{"type":43,"tag":2950,"props":5715,"children":5716},{},[5717],{"type":43,"tag":160,"props":5718,"children":5719},{"href":5615},[5720],{"type":49,"value":5721},"results-synthesis.md",{"type":43,"tag":2950,"props":5723,"children":5724},{},[5725],{"type":49,"value":5726},"Generating consolidated reports after bulk transforms",{"type":43,"tag":2923,"props":5728,"children":5729},{},[5730,5738],{"type":43,"tag":2950,"props":5731,"children":5732},{},[5733],{"type":43,"tag":160,"props":5734,"children":5735},{"href":1316},[5736],{"type":49,"value":5737},"cli-reference.md",{"type":43,"tag":2950,"props":5739,"children":5740},{},[5741],{"type":49,"value":5742},"ATX CLI flags, commands, env vars, IAM permissions",{"type":43,"tag":2923,"props":5744,"children":5745},{},[5746,5755],{"type":43,"tag":2950,"props":5747,"children":5748},{},[5749],{"type":43,"tag":160,"props":5750,"children":5752},{"href":5751},"references\u002Ftroubleshooting.md",[5753],{"type":49,"value":5754},"troubleshooting.md",{"type":43,"tag":2950,"props":5756,"children":5757},{},[5758],{"type":49,"value":5759},"Error resolution, debugging, quality improvement",{"type":43,"tag":52,"props":5761,"children":5763},{"id":5762},"license",[5764],{"type":49,"value":5765},"License",{"type":43,"tag":59,"props":5767,"children":5768},{},[5769],{"type":49,"value":5770},"AWS Service Terms. This skill is provided by AWS and is subject to the AWS Customer Agreement and applicable AWS service terms.",{"type":43,"tag":52,"props":5772,"children":5774},{"id":5773},"changelog",[5775],{"type":49,"value":5776},"Changelog",{"type":43,"tag":59,"props":5778,"children":5779},{},[5780],{"type":49,"value":5781},"Share if the user asks what changed, what's new, etc.",{"type":43,"tag":305,"props":5783,"children":5785},{"id":5784},"_100-2026-04-30",[5786,5790],{"type":43,"tag":355,"props":5787,"children":5788},{},[5789],{"type":49,"value":38},{"type":49,"value":5791}," - 2026-04-30",{"type":43,"tag":70,"props":5793,"children":5794},{},[5795,5800],{"type":43,"tag":74,"props":5796,"children":5797},{},[5798],{"type":49,"value":5799},"Initial release of the AWS Transform Agent Skill",{"type":43,"tag":74,"props":5801,"children":5802},{},[5803,5805],{"type":49,"value":5804},"Supported TDs:\n",{"type":43,"tag":70,"props":5806,"children":5807},{},[5808,5813,5818,5823,5828,5833,5838,5843,5848,5853,5858,5863,5868],{"type":43,"tag":74,"props":5809,"children":5810},{},[5811],{"type":49,"value":5812},"AWS\u002Fjava-version-upgrade",{"type":43,"tag":74,"props":5814,"children":5815},{},[5816],{"type":49,"value":5817},"AWS\u002Fpython-version-upgrade",{"type":43,"tag":74,"props":5819,"children":5820},{},[5821],{"type":49,"value":5822},"AWS\u002Fnodejs-version-upgrade",{"type":43,"tag":74,"props":5824,"children":5825},{},[5826],{"type":49,"value":5827},"AWS\u002Fjava-aws-sdk-v1-to-v2",{"type":43,"tag":74,"props":5829,"children":5830},{},[5831],{"type":49,"value":5832},"AWS\u002Fnodejs-aws-sdk-v2-to-v3",{"type":43,"tag":74,"props":5834,"children":5835},{},[5836],{"type":49,"value":5837},"AWS\u002Fpython-boto2-to-boto3",{"type":43,"tag":74,"props":5839,"children":5840},{},[5841],{"type":49,"value":5842},"AWS\u002Fcomprehensive-codebase-analysis",{"type":43,"tag":74,"props":5844,"children":5845},{},[5846],{"type":49,"value":5847},"AWS\u002Fjava-performance-optimization",{"type":43,"tag":74,"props":5849,"children":5850},{},[5851],{"type":49,"value":5852},"AWS\u002Fangular-version-upgrade",{"type":43,"tag":74,"props":5854,"children":5855},{},[5856],{"type":49,"value":5857},"AWS\u002Fvue.js-version-upgrade",{"type":43,"tag":74,"props":5859,"children":5860},{},[5861],{"type":49,"value":5862},"AWS\u002Fearly-access-java-x86-to-graviton",{"type":43,"tag":74,"props":5864,"children":5865},{},[5866],{"type":49,"value":5867},"AWS\u002Fearly-access-angular-to-react-migration",{"type":43,"tag":74,"props":5869,"children":5870},{},[5871],{"type":49,"value":5872},"AWS\u002Fearly-access-log4j-to-slf4j-migration",{"type":43,"tag":5874,"props":5875,"children":5876},"style",{},[5877],{"type":49,"value":5878},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":5880,"total":5982},[5881,5896,5911,5926,5941,5951,5966],{"slug":5882,"name":5882,"fn":5883,"description":5884,"org":5885,"tags":5886,"stars":24,"repoUrl":25,"updatedAt":5895},"agents-build","add capabilities to existing agent projects","Use when adding capabilities to an existing agent project — memory, app integration, VPC, multi-agent, migration, model changes, browser, code interpreter, or resource removal. Triggers on: \"add memory\", \"remember across sessions\", \"call agent from app\", \"invoke agent from code\", \"auth to call agent\", \"streaming responses\", \"VPC\", \"VPC connectivity\", \"VPC error\", \"can't reach from VPC\", \"multi-agent\", \"A2A\", \"A2A auth\", \"orchestrator not delegating\", \"specialist not called\", \"migrate Bedrock Agent\", \"after import\", \"migration issue\", \"framework for migration\", \"change model\", \"browser tool\", \"code interpreter\", \"delete agent\", \"tear down\", \"agentcore remove\", \"cross-account memory\", \"resource-based policy on memory\", \"pay for x402 content\", \"402 Payment Required\", \"microtransactions\", \"paid API or tool\". Not for connecting to external APIs via Gateway — use agents-connect. Not for scaffolding a new project — use agents-get-started. Not for CLI\u002Fdev server errors — use agents-debug. Strands vs LangGraph in a migration context routes here.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5887,5890,5893,5894],{"name":5888,"slug":5889,"type":15},"Agents","agents",{"name":5891,"slug":5892,"type":15},"Automation","automation",{"name":23,"slug":8,"type":15},{"name":20,"slug":21,"type":15},"2026-07-12T08:42:53.812877",{"slug":5897,"name":5897,"fn":5898,"description":5899,"org":5900,"tags":5901,"stars":24,"repoUrl":25,"updatedAt":5910},"agents-connect","connect agents to external services","Use when connecting your agent to external APIs, tools, or services via Gateway, or restricting tool access with Cedar policies. Handles gateway setup, target types, outbound auth (OAuth, API key, IAM), credentials, and Cedar policy authoring. Triggers on: \"connect to API\", \"add gateway\", \"connect to MCP server\", \"Lambda tools\", \"OpenAPI\", \"gateway target\", \"Cedar policy\", \"restrict tools\", \"policy engine\", \"gateway auth error\", \"store API key\", \"outbound credential\", \"env var API key\", \"API key None after deploy\", \"credential not available after deploy\", \"should this be a gateway target\", \"give my agent tools\", \"add tools to agent\". Not for inbound auth (who can call your agent) — use agents-harden. Not for debugging agent behavior — use agents-debug. Not for VPC networking errors (agent can't reach APIs due to VPC) — use agents-build. Not for creating or hosting a new MCP server project — use agents-get-started.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5902,5903,5906,5909],{"name":5888,"slug":5889,"type":15},{"name":5904,"slug":5905,"type":15},"API Development","api-development",{"name":5907,"slug":5908,"type":15},"Authentication","authentication",{"name":23,"slug":8,"type":15},"2026-07-16T06:00:38.866147",{"slug":5912,"name":5912,"fn":5913,"description":5914,"org":5915,"tags":5916,"stars":24,"repoUrl":25,"updatedAt":5925},"agents-debug","debug agent and environment issues","Use when your agent or environment is broken — wrong answers, errors, timeouts, tool failures, or CLI issues. Reads traces and logs to diagnose root causes. Also checks prerequisites when the CLI itself isn't working. Triggers on: \"agent not working\", \"wrong answer\", \"agent error\", \"tool call failing\", \"debug agent\", \"check logs\", \"read traces\", \"broken\", \"500 error\", \"424 error\", \"model access denied\", \"command not found\", \"stuck in DELETING\", \"maxVms exceeded\", \"cold start diagnosis\", \"cold start slow\", \"agentcore create error\", \"create failed\", \"exit code 7\", \"connection refused local dev\". Not for deploy failures — use agents-deploy. Not for performance tuning without errors — use agents-optimize. Not for VPC configuration — use agents-build. Not for observability setup or missing logs — use agents-optimize.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5917,5918,5919,5922],{"name":5888,"slug":5889,"type":15},{"name":23,"slug":8,"type":15},{"name":5920,"slug":5921,"type":15},"Debugging","debugging",{"name":5923,"slug":5924,"type":15},"Observability","observability","2026-07-16T06:00:44.679093",{"slug":5927,"name":5927,"fn":5928,"description":5929,"org":5930,"tags":5931,"stars":24,"repoUrl":25,"updatedAt":5940},"agents-deploy","deploy AI agents to AWS","Use when deploying your agent to AWS, or when a deploy has failed. Handles pre-flight validation, CDK\u002FIAM\u002Fquota error diagnosis, version management, rollback, and canary deployments. Triggers on: \"deploy my agent\", \"agentcore deploy\", \"deploy failed\", \"CDK error\", \"rollback\", \"canary deploy\", \"pin version\", \"redeploy\", \"deploy stuck\". Not for production hardening — use agents-harden. Not for adding capabilities before deploy — use agents-build or agents-connect. Not for VPC configuration errors — use agents-build.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5932,5933,5934,5937],{"name":5888,"slug":5889,"type":15},{"name":23,"slug":8,"type":15},{"name":5935,"slug":5936,"type":15},"CI\u002FCD","ci-cd",{"name":5938,"slug":5939,"type":15},"Deployment","deployment","2026-07-12T08:42:55.059577",{"slug":5942,"name":5942,"fn":5943,"description":5944,"org":5945,"tags":5946,"stars":24,"repoUrl":25,"updatedAt":5950},"agents-get-started","scaffold and deploy new agent projects","Use when a developer wants to create a new agent project or get started with AgentCore. Handles framework selection, project scaffolding, first deploy, and first invocation. Triggers on: \"build an agent\", \"create an agent\", \"get started\", \"new project\", \"agentcore create\", \"which framework\", \"Strands vs LangGraph\", \"hello world agent\", \"first agent\", \"create MCP server\", \"host MCP server\", \"agentcore dev\", \"dev server\", \"what port\", \"local development\". Not for adding capabilities to existing projects — use agents-build or agents-connect. Strands vs LangGraph in a migration context routes to agents-build, not here. Connecting to an existing MCP server routes to agents-connect, not here.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5947,5948,5949],{"name":5888,"slug":5889,"type":15},{"name":23,"slug":8,"type":15},{"name":5938,"slug":5939,"type":15},"2026-07-12T08:42:51.963247",{"slug":5952,"name":5952,"fn":5953,"description":5954,"org":5955,"tags":5956,"stars":24,"repoUrl":25,"updatedAt":5965},"agents-harden","harden agents for production","Use when preparing your agent for production — IAM scoping, inbound auth (JWT, SigV4), secrets management, cold start optimization, session lifecycle, rate limiting, input validation, and quota guidance. Triggers on: \"production checklist\", \"harden agent\", \"production ready\", \"secure agent\", \"inbound auth\", \"going live\", \"cold start optimization\", \"session lifecycle\", \"StopRuntimeSession\", \"quota\", \"throttling\", \"maxVms\", \"rate limit\", \"security audit of outbound API calls\", \"gateway target audit for production\", \"restrict who can call\", \"lock down endpoint\", \"only our app can call\". Not for Cedar tool-restriction policies — use agents-connect. Not for quality measurement — use agents-optimize. Not for outbound credential storage or API key wiring — use agents-connect. Not for A2A agent-to-agent auth — use agents-build. Cold start observation and diagnosis (not optimization) routes to agents-debug.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5957,5958,5959,5962],{"name":5888,"slug":5889,"type":15},{"name":23,"slug":8,"type":15},{"name":5960,"slug":5961,"type":15},"Best Practices","best-practices",{"name":5963,"slug":5964,"type":15},"Security","security","2026-07-16T06:00:42.174705",{"slug":5967,"name":5967,"fn":5968,"description":5969,"org":5970,"tags":5971,"stars":24,"repoUrl":25,"updatedAt":5981},"agents-optimize","optimize agent quality and performance","Use when measuring or improving agent quality and performance — set up evaluators, online monitoring, CI\u002FCD quality gates, observability, or cost optimization. Triggers on: \"evaluate my agent\", \"add evaluator\", \"measure quality\", \"quality gate\", \"run evals\", \"agent too slow\", \"why is it slow\", \"reduce latency\", \"set up observability\", \"CloudWatch dashboard\", \"how much does my agent cost\", \"cost optimization\", \"logs not showing up\", \"logs missing\", \"spans not found\", \"eval failing\", \"eval error\", \"dev traces\", \"local traces\", \"agentcore dev traces\", \"traces to CloudWatch\". Not for debugging errors or crashes — use agents-debug. Slow but correct routes here; broken routes to debug.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5972,5973,5974,5977,5978],{"name":5888,"slug":5889,"type":15},{"name":23,"slug":8,"type":15},{"name":5975,"slug":5976,"type":15},"Evals","evals",{"name":5923,"slug":5924,"type":15},{"name":5979,"slug":5980,"type":15},"Performance","performance","2026-07-12T08:42:56.488105",114,{"items":5984,"total":6101},[5985,5992,5999,6006,6013,6019,6026,6034,6051,6064,6076,6091],{"slug":5882,"name":5882,"fn":5883,"description":5884,"org":5986,"tags":5987,"stars":24,"repoUrl":25,"updatedAt":5895},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5988,5989,5990,5991],{"name":5888,"slug":5889,"type":15},{"name":5891,"slug":5892,"type":15},{"name":23,"slug":8,"type":15},{"name":20,"slug":21,"type":15},{"slug":5897,"name":5897,"fn":5898,"description":5899,"org":5993,"tags":5994,"stars":24,"repoUrl":25,"updatedAt":5910},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5995,5996,5997,5998],{"name":5888,"slug":5889,"type":15},{"name":5904,"slug":5905,"type":15},{"name":5907,"slug":5908,"type":15},{"name":23,"slug":8,"type":15},{"slug":5912,"name":5912,"fn":5913,"description":5914,"org":6000,"tags":6001,"stars":24,"repoUrl":25,"updatedAt":5925},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6002,6003,6004,6005],{"name":5888,"slug":5889,"type":15},{"name":23,"slug":8,"type":15},{"name":5920,"slug":5921,"type":15},{"name":5923,"slug":5924,"type":15},{"slug":5927,"name":5927,"fn":5928,"description":5929,"org":6007,"tags":6008,"stars":24,"repoUrl":25,"updatedAt":5940},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6009,6010,6011,6012],{"name":5888,"slug":5889,"type":15},{"name":23,"slug":8,"type":15},{"name":5935,"slug":5936,"type":15},{"name":5938,"slug":5939,"type":15},{"slug":5942,"name":5942,"fn":5943,"description":5944,"org":6014,"tags":6015,"stars":24,"repoUrl":25,"updatedAt":5950},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6016,6017,6018],{"name":5888,"slug":5889,"type":15},{"name":23,"slug":8,"type":15},{"name":5938,"slug":5939,"type":15},{"slug":5952,"name":5952,"fn":5953,"description":5954,"org":6020,"tags":6021,"stars":24,"repoUrl":25,"updatedAt":5965},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6022,6023,6024,6025],{"name":5888,"slug":5889,"type":15},{"name":23,"slug":8,"type":15},{"name":5960,"slug":5961,"type":15},{"name":5963,"slug":5964,"type":15},{"slug":5967,"name":5967,"fn":5968,"description":5969,"org":6027,"tags":6028,"stars":24,"repoUrl":25,"updatedAt":5981},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6029,6030,6031,6032,6033],{"name":5888,"slug":5889,"type":15},{"name":23,"slug":8,"type":15},{"name":5975,"slug":5976,"type":15},{"name":5923,"slug":5924,"type":15},{"name":5979,"slug":5980,"type":15},{"slug":6035,"name":6035,"fn":6036,"description":6037,"org":6038,"tags":6039,"stars":24,"repoUrl":25,"updatedAt":6050},"amazon-aurora-mysql","manage Amazon Aurora MySQL clusters","Amazon Aurora MySQL — creates, modifies, and advises on Aurora MySQL clusters specifically (MySQL-compatible engine, Aurora serverless, parallel query). Trigger for Aurora MySQL cluster operations, ACU sizing, I\u002FO-Optimized storage, commitment pricing, or MySQL upgrade planning. Aurora MySQL uses full (VPC-based) configuration — express configuration is PostgreSQL-only. For Aurora PostgreSQL, use amazon-aurora-postgresql instead. Contains safety guardrails and response templates that override defaults.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6040,6041,6044,6047],{"name":23,"slug":8,"type":15},{"name":6042,"slug":6043,"type":15},"Database","database",{"name":6045,"slug":6046,"type":15},"MySQL","mysql",{"name":6048,"slug":6049,"type":15},"Serverless","serverless","2026-07-12T08:43:13.27939",{"slug":6052,"name":6052,"fn":6053,"description":6054,"org":6055,"tags":6056,"stars":24,"repoUrl":25,"updatedAt":6063},"amazon-aurora-postgresql","configure Amazon Aurora PostgreSQL clusters","Amazon Aurora PostgreSQL — creates, modifies, and advises on Aurora PostgreSQL clusters specifically (PostgreSQL-compatible engine, Aurora serverless, express configuration, pgvector, Babelfish). Trigger for Aurora PostgreSQL cluster operations, express-configuration quick-start, ACU sizing, I\u002FO-Optimized storage, commitment pricing, or PostgreSQL upgrade planning. For Aurora MySQL, use amazon-aurora-mysql instead. Contains safety guardrails, express-first routing, and response templates that override defaults.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6057,6058,6059,6062],{"name":23,"slug":8,"type":15},{"name":6042,"slug":6043,"type":15},{"name":6060,"slug":6061,"type":15},"PostgreSQL","postgresql",{"name":6048,"slug":6049,"type":15},"2026-07-16T06:00:34.789624",{"slug":6065,"name":6065,"fn":6066,"description":6067,"org":6068,"tags":6069,"stars":24,"repoUrl":25,"updatedAt":6075},"amazon-bedrock","build generative AI apps with Amazon Bedrock","Builds generative AI applications on Amazon Bedrock. Covers model invocation (Converse API, InvokeModel), RAG with Knowledge Bases, Bedrock Agents, Guardrails, and AgentCore. Use when invoking models, setting up Knowledge Bases, creating agents, applying guardrails, deploying to AgentCore, migrating\u002Fporting\u002Fconverting a Bedrock Agent (including inline agents) to an AgentCore Harness, troubleshooting Bedrock errors (ThrottlingException, AccessDeniedException), or choosing models (Claude, Llama, Nova, Titan). ALSO USE for prompt caching setup and debugging, quota health checks and throttling diagnosis, cost attribution and tracking, migrating between Claude model generations (4.5 to 4.6 to 4.7), chunking strategies, API selection (Converse vs InvokeModel), guardrail capabilities, and model selection. Also covers AgentCore Payments setup (x402, microtransactions, Payment Manager, Connector, Instrument, Coinbase CDP, Stripe Privy, 402 Payment Required, pay for content, paid endpoint, agent payments). NOT for custom model training, Rekognition, or Comprehend.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6070,6071,6072],{"name":5888,"slug":5889,"type":15},{"name":23,"slug":8,"type":15},{"name":6073,"slug":6074,"type":15},"LLM","llm","2026-07-25T05:30:35.20899",{"slug":6077,"name":6077,"fn":6078,"description":6079,"org":6080,"tags":6081,"stars":24,"repoUrl":25,"updatedAt":6090},"amazon-documentdb","manage Amazon DocumentDB clusters","Manages Amazon DocumentDB end-to-end — serverless-on-8.0 cluster setup, TLS\u002FVPC\u002Fdriver config, flexible-schema and vector-search data modeling, MongoDB compatibility assessment, DMS-based migration, slow-query diagnosis, major version upgrades (4.0→5.0→8.0), Well-Architected reviews (41-check wa_review.py), cost estimation, and security hardening. Retrieve for every DocumentDB question and when the user asks to set up or migrate MongoDB to AWS — DocumentDB is AWS's MongoDB-compatible managed database. Triggers: JSON document store, document database, MongoDB on AWS, Nested fields, Lambda cannot connect, TLS handshake, VPC port 27017, IAM auth, Secrets Manager, encryption at rest, $graphLookup, flexible schema, COLLSCAN, compound index, DMS migration, CDC cutover, $vectorSearch, RAG, Global Clusters, DR replication, cost sizing, audit, health check, production-readiness.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6082,6083,6084,6087],{"name":23,"slug":8,"type":15},{"name":6042,"slug":6043,"type":15},{"name":6085,"slug":6086,"type":15},"MongoDB","mongodb",{"name":6088,"slug":6089,"type":15},"NoSQL","nosql","2026-07-12T08:43:00.455878",{"slug":6092,"name":6092,"fn":6093,"description":6094,"org":6095,"tags":6096,"stars":24,"repoUrl":25,"updatedAt":6100},"amazon-dynamodb","design and debug DynamoDB data layers","Designs, reviews, and debugs DynamoDB data layers from design axioms — enumerates access patterns, chooses partition\u002Fsort keys and GSIs, decides single-table vs. multi-table, configures Streams, Global Tables, TTL, and zero-ETL integrations to OpenSearch\u002FRedshift\u002FSageMaker Lakehouse, and produces a defensible data-layer design with a monthly cost estimate and optional live validation. Applies whenever a user is designing, reviewing, or refactoring anything backed by DynamoDB — schemas, access patterns, GSIs, single- vs. multi-table choices, Streams consumers, transactional outboxes, Global Tables, zero-ETL pipelines — even when they don't say \"axioms\" or \"design review.\" Also applies when debugging hot partitions, throttling, unbounded Scans, LWW conflicts, or surprise bills on DynamoDB workloads.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6097,6098,6099],{"name":23,"slug":8,"type":15},{"name":6042,"slug":6043,"type":15},{"name":6088,"slug":6089,"type":15},"2026-07-16T06:00:37.690386",115]