AWS Transform
AWS LabsOfficialPublished by AWS Labs
- Skill
- Workflow
- Software development
- Apache-2.0
- Medium risk
- Has scripts
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
AWS Transform provides a structured approach to modernizing legacy applications and migrating them to AWS. It supports complex transformations such as .NET Framework to .NET 8/10, mainframe COBOL to Java, and database migrations to Aurora. The skill orchestrates the entire lifecycle from discovery and assessment to planning and execution, utilizing both MCP-based agents and the AWS Transform CLI for continuous modernization analysis.
What it does
- Analyzes repositories for tech debt, security vulnerabilities, and modernization opportunities.
- Transforms legacy codebases including .NET Framework, COBOL, and various database engines.
- Upgrades language versions and AWS SDKs to modern standards.
- Orchestrates migration workflows through discovery, assessment, and execution phases.
- Provides continuous modernization analysis via the AWS Transform CLI.
- Supports remote execution modes including AWS-managed, EC2, and Batch.
When to use it
- When migrating legacy applications like .NET or mainframe systems to AWS.
- When you need to assess a codebase for security vulnerabilities or technical debt.
- When upgrading outdated language versions or AWS SDKs.
- When converting database platforms like SQL Server to Amazon Aurora.
- When you require a continuous, automated approach to monitoring modernization readiness.
Advantages
- Provides a standardized, repeatable workflow for complex migrations.
- Reduces manual effort in identifying and remediating technical debt.
- Supports diverse migration paths from legacy infrastructure to modern AWS services.
- Offers flexible execution modes including fully managed options with no infrastructure overhead.
- Integrates deep analysis capabilities directly into the development lifecycle.
Usage examples
- “Migrate my .NET Framework application to .NET 8.”
- The agent will initiate the discovery and assessment phase to scope the migration and generate a modernization plan.
- “Analyze my repository for security vulnerabilities and tech debt.”
- The agent will route to the continuous modernization analysis tool to scan the codebase and report findings.
- “Convert my SQL Server database to Aurora.”
- The agent will guide you through the database migration workflow, starting with an assessment of your current schema.
- “Modernize my mainframe COBOL code to Java.”
- The agent will begin the discovery process to evaluate the mainframe workload and prepare for transformation.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/awslabs/aws-transform/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip aws-transform.zip -d .agents/skills
Documentation by AWS Labs
AWS Transform
CRITICAL: Route Before Anything Else
STOP. Before reading files, analyzing code, or starting any workflow, identify the workload first, then route.
Step A: Identify the workload
Look for an explicit workload signal in the user's request — a named technology (.NET, VMware, SQL Server/Aurora/Oracle/MySQL, mainframe/COBOL), workload-specific terminology (Hyper-V, EC2 rehost, stored procs, CICS, JCL), or file/project signals already in the conversation. If no signal is present, treat the request as workload-unspecified.
Step B: Apply workload-specific routing
Workload-specific rules ALWAYS win over the keyword list in Step C. Do not let "analysis" or "tech debt" phrasing override these.
| Workload | Route |
|---|---|
| .NET | Ask the user via AskUserQuestion: "For your .NET work, are you looking to modernize to .NET 8/10 (port the code, change targets), run an assessment for modernization (scope the work, identify blockers, plan the port), or analyze your repos for tech debt, security vulnerabilities, or CVEs?" → "Modernize" or "Assessment for modernization" → proceed to the Overview section (the .NET workload handles both). → "Analyze for tech debt / security / CVEs" → route to continuous modernization (see Step D). |
| VMware | Proceed to the Overview section. NEVER route VMware requests to continuous modernization — even if the user uses words like "analyze", "assess", "find issues". VMware assessment is handled by the VMware workload agent, see vmware. |
| SQL / Database | Proceed to the Overview section. NEVER route SQL/database requests to continuous modernization — SQL Server, Oracle, MySQL, and Aurora migrations are handled by the SQL workload agent, see sql. |
| Mainframe / COBOL | Proceed to the Overview section. NEVER route mainframe requests to continuous modernization — COBOL/CICS/JCL transformations are handled by the mainframe workload agent, see mainframe. |
| Workload-unspecified | Continue to Step C. |
Step C: Keyword-based routing (workload-unspecified only)
This list applies only when the user has not named a workload. If any of the workload rules in Step B matched, you have already routed — do not re-evaluate against this list.
If the user's workload-unspecified request matches any of these intents, route to continuous modernization — do NOT scan files yourself:
"analysis", "analyze", "find issues", "what's wrong", "tech debt", "security vulnerabilities", "CVEs"
"what should I fix", "where do I start"
"report", "dashboard", "compare", "trend"
"remediate findings", "remediation", "fix what you found"
"custom transform"
"continuous modernization", "AWS Transform - continuous modernization"
Step D: For continuous modernization requests
First-response telemetry notice (once per session). The first time a request routes here in this session, ALWAYS prepend this line exactly to your reply to the user before doing anything else:
Note: this skill and the continuous modernization CLI, (
atx ct), collect usage telemetry by default during transformation execution. The telemetry consists of different data points, such as, the IDE name (for example, VS Code or Kiro), the AI agent name (for example, Claude Code or OpenAI Codex), and the execution mode (local or remote). This data is used by AWS Transform to prioritize compatibility testing, as well as latency and reliability. To opt out, see here.Show it exactly once per session. Do NOT repeat it on subsequent continuous modernization requests in the same session.
Telemetry opt-out. If the user explicitly asks to disable telemetry during the chat session:
Omit
--telemetryfor the rest of the session (see each sub-skill's Telemetry section for the flag format).Prepend
ATX_DISABLE_TELEMETRY=trueinline on everyatx ctcommand for the rest of the session — not onlyanalysis/remediation, but also setup and diagnostic commands likeatx ct status,atx ct source ..., andatx ct setup .... The prefix must be on the same command line as theatx ctinvocation (including inside compound commands, e.g.which atx && ATX_DISABLE_TELEMETRY=true atx ct ...), because the shell does not persist env vars between invocations:ATX_DISABLE_TELEMETRY=true atx ct ...
When invoking AWS Transform - continuous modernization (continuous modernization) commands, use
atx ct(with a space).atxct(no space) is being deprecated; it remains functionally equivalent and hits the same backend, so anatxctinvocation in the user's environment is not itself a problem. Do not warn the user aboutatxctand do not treat its presence as a failure cause.Verify local CLI dispatch before checking versions or AWS configuration. Run this without redirecting stderr:
atx ct --versionClassify failures before continuing:
If the shell reports
atx: command not found, install the AWS Transform CLI:curl -fsSL https://transform-cli.awsstatic.com/install.sh | bash, then restart the shell or source its profile.If an
atxprocess runs but reportsunknown command 'ct', do NOT reinstall blindly or investigate AWS credentials/region. Follow the command-resolution troubleshooting first.If the command succeeds, continue with the version comparison.
Check whether the working CLI is up to date:
INSTALLED=$(atx ct --version | head -1); LATEST=$(curl -fsSL "https://transform-cli.awsstatic.com/index.json" 2>/dev/null | grep -o '"latest"[[:space:]]*:[[:space:]]*"[^"]*"' | sed 's/.*"latest"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/'); echo "Installed: ${INSTALLED:-not found}, Latest: ${LATEST:-unknown}"If
LATESTis known and newer thanINSTALLED, update withcurl -fsSL https://transform-cli.awsstatic.com/install.sh | bash, then restart the shell or source its profile.Credential preflight. Validate AWS credentials before starting any analysis or remediation — at minimum on the first continuous modernization request of the session (new or returning users), and again before any later run in a long session, since credentials can lapse mid-session:
aws sts get-caller-identityIf it fails or the credentials are expired, refresh them before continuing. Do NOT start any long-running work on expired or soon-to-expire credentials — an analysis started on credentials about to expire can strand the run mid-flight. Run the preflight silently; surface it to the user only if the credentials need refreshing.
If local
atx ctdispatch succeeded but a later command fails, then check runtime configuration:AWS_PROFILEpoints at a valid account with refreshed credentialsAWS_REGIONis set to a supported regionATX_CUSTOM_ENDPOINTis set in the environment (only if you use a custom endpoint)
An
unknown command 'ct'failure is a local command-resolution problem, not an AWS configuration problem; return to Step 3 instead.Ensure a supported region has been selected (see continuous-modernization-setup.md "Choose your region") and prefixed inline (
AWS_REGION=$ATX_REGION) on everyatx ctcommand.Then use the appropriate continuous modernization skill — see continuous-modernization. Recurring/scheduled intent ("weekly scan", "every Monday", "on a schedule", "cron") routes to continuous-modernization-schedule: scheduling is a real, shipped capability (
atx ct schedule create/list/get/enable/disable/delete) that runs remotely ONLY — either an EventBridge schedule on the customer's EC2/Batch stack, or an AWS-managed server-side schedule (--mode aws-managed, no customer infrastructure). For recurring intent with no infrastructure ("no infra", "don't want to manage/provision anything"), the answer isatx ct schedule create --mode aws-managed --execution-role <arn>(server-side, nothing to provision) — offer this; do NOT tell the user that recurring analyses require deploying infrastructure. Never claim it doesn't exist, and never offer a local cron/systemd/launchd entry as a substitute or fallback.Remote analysis has THREE compute modes (
atx ct remote analysis --mode <ec2|batch|aws-managed>).aws-managedruns on the AWS-managed fleet with NO customer infrastructure — no VPC, no CloudFormation, no EC2/Batch stack, no provisioning or permission-consent step. When the user asks to run remotely/on AWS but says "no infrastructure", "don't want to set up / manage / provision anything", "no EC2", "no Batch stack", "fully managed", or "just run it for me", the answer is--mode aws-managed— route to continuous-modernization-aws-managed-execution and read that file before answering.--mode aws-managedis real and shipped; NEVER tell the user it doesn't exist or that "all remote options require infrastructure", and do NOT probe--helpto decide — the reference file documents it.ec2/batchare the customer-owned options (they DO deploy a stack); Batch/Fargate is not the no-infrastructure option.
When in doubt for a workload-unspecified request → continuous modernization. This default applies ONLY after Step B has cleared — VMware, SQL, and mainframe never fall through to continuous modernization regardless of how the question is phrased; .NET only routes to continuous modernization after the user picks "analyze for tech debt / security / CVEs" in Step B's intent question (both "modernize" and "assessment for modernization" stay in the .NET workload). Once routed, do NOT manually read source files to find issues — that's what atx ct analysis run does.
CRITICAL: Never Show Pricing or Timing Estimates
Do NOT quote specific dollar amounts, hourly rates, or time estimates for AWS resources or analyses. This includes:
❌ "
$0.20/hr", "$5/day", "$X per analysis"❌ "takes ~30 min", "completes in 2-5 hours", "~30s startup"
❌ "ETA: 30 min – 2 hours"
Instead:
For pricing: redirect to https://aws.amazon.com/ec2/pricing/, https://aws.amazon.com/transform/pricing/, etc.
If asked directly: "I can't give specific cost or time estimates — pricing depends on your usage and AWS quotas. Check the AWS pricing pages for current rates."
This applies to all responses, all skills, and all situations.
Overview
Domain expertise for migrating and modernizing workloads using AWS Transform. Covers .NET Framework to .NET 8/10, mainframe COBOL to Java, VMware to EC2, SQL Server to Aurora PostgreSQL, and custom code transformations (Java, Python, Node.js version upgrades, SDK migrations). Orchestrates assessment, planning, and execution through Managed Agents and AWS Transform CLI with human-in-the-loop checkpoints.
Prerequisites
This skill requires the AWS Transform MCP server (aws-transform-mcp). Configure it in your agent's MCP settings:
{
"mcpServers": {
"aws-transform-mcp": {
"command": "uvx",
"args": [
"awslabs.aws-transform-mcp-server@latest"
]
}
}
}The AWS Transform CLI is also required for custom transformations. Install via:
curl -fsSL https://transform-cli.awsstatic.com/install.sh | bashMandatory workflow
Follow these phases in order. Do NOT skip ahead. Authentication is handled just-in-time — only when a chosen action actually needs it. Do NOT probe auth before the user has declared an intent.
Resume → Check .atx/context.json
Intent → Ask user what they want to do
Discovery → Scan workspace + query available agents
Scope → User selects what to modernize (GATE 1)
Assessment → Run workload assessment (NOT optional)
Requirements → Draft from assessment report
Approval → User approves requirements (GATE 2)
Tasks → Generate tasks.md
Execute → Run transforms, monitor, review diffsDiscovery finds opportunities. Assessment produces detailed findings. Requirements come from the assessment — NOT from discovery.
You MUST NOT create requirements without an assessment report. You MUST NOT start execution without requirements.md and tasks.md.
Resuming a prior session
Check for .atx/context.json (workspace-relative). NEVER read ~/.aws/atx/kiro-power-context.json.
This check is an internal bookkeeping operation. The user must never see it happen. Do not announce the check, do not narrate what you are doing. No phrases like "checking for prior sessions", "let me check", "check for a prior session", "context file". On a fresh install, the first visible output must be the intent question — no preamble of any kind.
No context found: Proceed directly to intent. Produce no user-visible output for this step.
Context found: If the context has an active job (
assessment.jobIdor entries inexecution.activeJobIds), try to refresh live state from the service, but do so invisibly:Check auth first (no-auth-required). If sign-in is NOT configured, skip the refresh entirely — do not attempt service calls. Use local context only.
If sign-in is configured, fetch each resource your resume message depends on — at minimum the job itself and all pending user tasks. Surface every pending task to the user; do not cherry-pick one and omit the others.
BLOCKINGHITL tasks hold up progress even when the job status is active;NON_BLOCKINGtasks still need attention but don't stall the job. Name every pending task; flag blocking ones. Don't infer one resource from another.If any call fails for any reason, silently fall back to local context. Do NOT reveal your reasoning about the refresh to the user — no "sign-in isn't configured so I'll skip", no "the service isn't reachable". The user should see only the resume message. Do NOT demand auth or block the flow.
Then tell the user about their prior session. Frame the offer explicitly as a continuation of that same session — not a new one. The message should make clear:
This is the specific session they previously worked on. Mention the phase reached, workspace/job identifiers if relevant.
Refresh succeeded → speak in present tense about live state ("your assessment job is running", "I need your input on X to continue"). If there is a pending HITL task, surface it — don't bury it under "your job is running."
Refresh failed or was skipped → use prior-session framing: "last time", "when you paused", "previously", "your last session had finished assessment." Do NOT present-tense claims about job state — local context may be stale. Offer sign-in as the path to current status ("sign in to see the latest status"), not as a gate.
Resume = continue where you left off, reusing the existing assessment report, workspace, and prior progress.
Start fresh = discard the prior session (local artifacts deleted) and begin a brand-new migration.
Use language like "continue where you left off" or "pick up from where you stopped" — not ambiguous phrasing like "start a similar session." If user chooses start fresh, delete
.atx/context.json,.atx/discovery.json,.atx/assessment-report/, and.atx/specs/, then proceed to intent. Otherwise follow the resume logic in workflow reference.
Determining user intent
If Step A/B routed the request to continuous modernization, skip this entire section. continuous modernization has its own self-contained onboarding flow — hand off directly to continuous-modernization-guide. Its own first prompt (Mode selection: Local vs. AWS Infrastructure) is the user's first visible question. Do NOT show the generic intent menu first, and do NOT mix in non-continuous modernization options like "Browse My Jobs" or "Start a Specific Transform" — those are AWS Transform top-level capabilities, not continuous modernization features.
For every other route — VMware, SQL, Mainframe, and .NET (modernize or assessment-for-modernization) — use the generic intent menu below. The menu's options (Discover Workspace, Browse Jobs, Start Specific Transform, Analyze for findings) are how those workloads enter the standard MANDATORY workflow's Discovery → Scope → Assessment phases.
Generic intent menu
Ask the user: "What would you like to focus on?" The first user-visible action in this phase is the question — no auth-probing tool calls precede it, no auth lecture precedes it.
With projects: [Discover This Workspace] [Browse My Jobs] [Start a Specific Transform] [Analyze for findings] No projects: [Browse My Jobs] [Open a Project Folder] [Start from Scratch] [Analyze for findings]
Custom vs continuous modernization routing. When the user's intent is clear, route to the correct skill set using the decision table in continuous-modernization reference. Key rule: named transformation AND no prior continuous modernization findings → Custom. Analysis/reporting/remediation of existing findings → continuous modernization. When in doubt → continuous modernization.
Just-in-time auth. Once the user picks an intent, the next tool that action needs may require auth. If so, prompt for auth then, framed around the action the user just chose ("to browse your jobs, sign in to AWS Transform"). Which auth each MCP tool needs is reported by the MCP server — read it from the tool's description, get_status, or the error the tool returns. CLI transforms use AWS credentials only — do NOT prompt for sign-in for CLI-only intents, even when sign-in is unconfigured. If the user picks something that needs no service call (e.g., "Open a Project Folder"), do not probe auth.
See auth reference for the MCP-vs-CLI auth split and how to present sign-in options.
Discovery
Fast scan (~10 sec). Three things happen in parallel:
Scan the workspace — detect languages, frameworks, file types, and dependencies present in the project.
Query available agents — call
list_resourceswithresource: "agents"(MCP). Skip if sign-in is not configured or the user's intent is CLI-only. This is a paginated API — fetch all pages to get the complete set. The results contain two levels:Orchestrator agents — top-level agents you create jobs with. Each orchestrator may have sub-agents that provide deeper workload-specific capabilities.
Sub-agents — invoked through their orchestrator, not directly. They represent specialized skills within a workload type.
Some agents may not belong to a known orchestrator — treat these as standalone capabilities.
List available transformation definitions — call
atx custom def list(CLI) to get the current set and what they transform. Skip if CLI is not available or the user's intent is MCP-only.
For the "Discover This Workspace" intent, Discovery is where sign-in is first required (other intents like "Browse My Jobs" need sign-in even earlier, per the just-in-time rule — handle those there). If list_resources returns NOT_CONFIGURED, prompt the user to sign in for the auth system needed — do not demand both.
Then match workspace signals against orchestrator capabilities and available transformation definitions. Before selecting an orchestratorAgent for any workload, read the matched workload's reference file — it may specify the exact agent to use. Save the matched results to .atx/discovery.json — include the orchestrator → sub-agent hierarchy so later steps know what deeper capabilities are available.
See workflow reference for the workspace scanning framework.
Discovery is NOT assessment. Discovery identifies opportunities and matches them to available agents. Assessment produces the detailed findings.
Scoping (GATE 1)
For each matched workload type, read ALL reference files with its prefix (e.g., dotnet). These contain the workload's capabilities, workflow, agent details, example requirements, and known limitations. The file prefix comes from the agent match in Discovery — not from a hardcoded list.
Show migration table, then let the user select with multiSelect:
| Risk | Why | Component | Current | Target | AWS Target | Recommended Approach |Always explain risk in plain language in the "Why" column — use the user-facing phrases from the Risk Classification table in workflow reference. Never show a bare HIGH/MED/LOW label without explanation.
User selects what to modernize.
Assessment
This is NOT optional. Run the workload's assessment BEFORE creating requirements.
Tell the user: "I'll assess your workload. The assessment report drives the migration plan."
How assessment runs depends on the workload's reference files. Each workload type defines its own assessment approach — the agent to use, the objective format, and how to collect results. Consult the matched workload's reference files for specifics.
General pattern for agent-based assessment:
Confirm the plan — tell the user what you will do (create workspace, create job with which agent, what the objective is). WAIT for approval before calling any tools.
Create/select workspace
Create job with a clear objective — the workload's reference files define what a good objective looks like
Start the job (already started by
create_job; usecontrol_jobto restart if stopped)Send a detailed follow-up message with project specifics
Ask before uploading — ask how the user wants to share source code. WAIT. Then upload with
categoryType: "CUSTOMER_INPUT".Handle agent requests (checkpoints, decisions) — always present to user, WAIT for user response
When assessment completes, download the report:
get_resource resource="artifact"Save report to
.atx/assessment-report/
Rule: NEVER batch workspace creation, job creation, and uploads into a single turn without user confirmation at each decision point.
Use the orchestrator agent or transformation definition identified during Discovery. The match comes from list_resources (with resource: "agents") and atx custom def list, not a hardcoded mapping. When creating a job, specify the orchestrator — sub-agents are invoked by the orchestrator as needed.
Update .atx/context.json with phase: "assessed", workspace ID, job ID.
Requirements (from assessment report)
Now create .atx/specs/requirements.md using the assessment report — NOT discovery findings.
Read
.atx/assessment-report/for detailed findingsLoad workload reference files for context
Draft requirements grounded in the assessment (specific blockers, LOC, complexity, migration paths)
Each requirement says WHO handles it: AWS Transform CLI / Managed Agents / IDE
Multi-module: group by module with Module Overview table
See workflow reference for format
Do NOT create tasks.md yet.
Show requirements summary and let the user choose: [Looks Good] [Edit] [Add Component]
Approval (GATE 2)
Ask the user: "Requirements finalized. Ready to create the execution plan?" [Create Plan] [Edit More]
Task generation
Generate tasks.md from approved requirements:
Module Status table + per-module sections
Sized: max 100 files/task
Parallel groups verified
Review-diffs after every code change
See workflow reference for format
Present options: [Start Execution] [Review Tasks] [Modify]
Execution
See workflow reference for full details.
How execution runs depends on the workload's reference files. Each workload type defines its own execution tooling — which agent or CLI command to use, how to parallelize, and how to collect results. Consult the matched workload's reference files.
General pattern for agent-based execution:
When creating new jobs, always:
Clear objective in
create_job— what to transform, from what, to whatDetailed follow-up message via
send_message— project specifics, discovery findings, blockersUpload artifacts if agent needs code — ask user first,
categoryType: "CUSTOMER_INPUT"
Every agent request → user decides (NEVER auto-handle)
When the AWS Transform agent asks for input, needs files, or hits a checkpoint:
Read the task/message
Present to user
WAIT for user response
Relay user's decision back to agent
Uploading artifacts to agents
Always use categoryType: "CUSTOMER_INPUT" when uploading files to an agent:
upload_artifact(
workspaceId="...", jobId="...",
content="/path/to/source.zip",
fileType="ZIP",
categoryType="CUSTOMER_INPUT"
)| categoryType | When to Use |
|---|---|
CUSTOMER_INPUT | Uploading files TO the agent (source code, configs, data) |
CUSTOMER_OUTPUT | Downloading files FROM the agent (reports, migrated code) |
HITL_FROM_USER | User responses to agent HITL tasks |
See workflow reference for agent request handling patterns.
Progress
Review diffs after every code change. User must approve.
Update tasks.md checkboxes + .atx/context.json after every step.
Context persistence (.atx/context.json)
Save .atx/context.json IMMEDIATELY after completing each phase — before presenting results to the user. Every phase transition must have a context save between them. Top-level keys: phase, discovery, assessment, spec, workStyle, execution, updatedAt. See workflow reference for the full schema.
Resume: read phase, pick up from that phase.
Constraints
MUST use product, capability, and step names exactly as defined in this document. Never paraphrase or invent terminology. When describing this skill's capabilities, use: "Migrate, modernize, and upgrade codebases — .NET, mainframe COBOL, VMware, databases, and language/SDK upgrades — using AWS Transform CLI and Managed Agents, directly from your IDE."
MUST present user choices as an explicit selectable list — never bury options in prose or proceed on an inferred answer
MUST run CLI commands in background — never block the conversation
MUST discover agents dynamically via
list_resourceswithresource: "agents"(paginated) — do not hardcode agent namesMUST create jobs with orchestrator agents — sub-agents are invoked by the orchestrator, not directly
MUST refer to resources by name, not ID. When referencing a workspace, job, agent, or artifact in user-facing messages, use its human-readable name. Never surface raw UUIDs in prose. If a resource has no name, use a descriptive phrase ("your .NET modernization job") rather than the ID.
MUST NOT expose internal mechanics to the user — do not name tools (get_status, list_resources), do not cite step numbers, do not reference files you are reading, and do not narrate what you are about to do. Just do it silently and present the outcome in user terms.
MUST NOT mix workflow descriptions with actual questions in the same numbered list, and never use count language like "two questions" when some items are informational steps rather than questions. Keep what-I-will-do separate from what-I-need-from-you.
MUST NOT frame HITL checkpoints, agent questions, or pending decisions as coming from "the web app", "the webapp", "the web UI", or a third-party "the agent is asking / the agent needs / the agent wants". The user is working with you in the IDE — you own the interaction. Present every checkpoint as your own first-person request, not a relayed message from elsewhere. Wrong: "The web app is asking how you want to deploy the landing zone." / "The agent is now asking about the replication subnet configuration." Right: "The next step is to choose how to deploy the landing zone." / "I need the replication subnet configuration to continue."
MUST NOT explain what this skill does
MUST NOT create requirements from discovery — wait for assessment
MUST NOT skip from discovery to execution
MUST NOT modify code, upgrade dependencies, or run analysis manually — always use AWS Transform tooling
MUST NOT probe
--helpto figure out a CLI invocation that the reference files already document. The capability-specific reference files inreferences/(e.g.continuous-modernization-source.md,continuous-modernization-analysis.md,continuous-modernization-remediation.md,custom-cli-reference.md) contain the canonicalatx ct …andatx custom …commands with every required flag and example invocations — read the matching file and lift the command verbatim. The orchestrating files (continuous-modernization-guide.md,continuous-modernization-setup.md) explicitly point at them ("Use the/sourceskill for the exact commands").--helpis a fallback used ONLY when (a) no reference file covers the capability, or (b) a documented command demonstrably fails because the installed CLI version diverges from the reference. Treat--helpprobes the user can see as a signal that the agent didn't read its own skill — that is the failure mode this rule prevents.MUST NOT make decisions on behalf of the user
MUST NOT editorialize or use subjective language — no "interesting", "fascinating", "notably", "impressive", "remarkable". State findings as facts.
MUST NOT prompt for authentication before the user has declared an intent. Auth prompts come from the tool a chosen action needs, framed around that action.
MUST NOT overclaim freshness. If you did NOT fetch a resource this turn, lead with "last I checked" (past tense throughout) and offer to refresh. Never promise proactive surfacing ("I'll let you know when…") unless actively polling — make the reactive model explicit.
MUST NOT infer one resource's state from another — each MCP resource (job, tasks, artifacts) is its own source of truth. A job in an active state does NOT imply no pending user tasks. Fetch each resource directly when relevant. See workflow reference.
MUST NOT mix unrelated transformation goals in the same chat without warning. On every shift to a different goal, suggest the user start a new chat session (they start it themselves). Keep re-offers terse. If the user declines, proceed to answer their question about the other job — do not refuse or redirect back to the original goal. Just avoid mixing cached state (e.g., don't apply VMware findings to the .NET question).
MUST store state in
.atx/context.json
Reference
Core
| Topic | File |
|---|---|
| Authentication (sign-in, AWS credentials, CLI credentials, errors) | references/auth.md |
| Tools (MCP tools, CLI commands, connectors, HITL, troubleshooting) | references/tools.md |
| Workflow (discovery, transforms, execution, planning, context, display) | references/workflow.md |
Workload Types
| Workload | Files |
|---|---|
| .NET | references/dotnet*.md |
| SQL/Database | references/sql*.md |
| Mainframe | references/mainframe*.md |
| VMware | references/vmware*.md |
| continuous modernization | references/continuous-modernization*.md |
Each workload type has a root reference file with its capabilities, workflow, and agent details. Additional files with the same prefix provide deeper guidance (e.g., continuous-modernization-setup.md, continuous-modernization-discovery.md).
Files
- ATTRIBUTION.mdAdded by AutoGineer911 B
- LICENSELicence file added by AutoGineer9.9 KiB
- NOTICELicence file added by AutoGineer89 B
- SKILL.md35.4 KiB
- references/AWSTransformInfrastructureExecutorAccessEC2.json5.7 KiB
- references/AWSTransformSecurityAgentExecutorAccess.json1.8 KiB
- references/auth.md4.0 KiB
- references/continuous-modernization-analysis.md20.9 KiB
- references/continuous-modernization-aws-managed-execution.md9.8 KiB
- references/continuous-modernization-batch-execution.md11.1 KiB
- references/continuous-modernization-discovery.md2.6 KiB
- references/continuous-modernization-ec2-execution.md13.1 KiB
- references/continuous-modernization-findings.md7.7 KiB
- references/continuous-modernization-guide.md16.4 KiB
- references/continuous-modernization-remediation.md14.8 KiB
- references/continuous-modernization-reporting.md17.8 KiB
- references/continuous-modernization-schedule.md21.6 KiB
- references/continuous-modernization-security-agent.md8.5 KiB
- references/continuous-modernization-setup.md4.9 KiB
- references/continuous-modernization-source.md12.5 KiB
- references/continuous-modernization-status.md2.0 KiB
- references/continuous-modernization-troubleshooting.md10.3 KiB
- references/continuous-modernization.md15.3 KiB
- references/custom-cli-reference.md9.4 KiB
- references/custom-multi-transformation.md10.3 KiB
- references/custom-remote-execution.md23.4 KiB
- references/custom-repo-analysis.md7.3 KiB
- references/custom-results-synthesis.md1.6 KiB
- references/custom-single-transformation.md15.3 KiB
- references/custom-troubleshooting.md9.2 KiB
- references/custom.md37.1 KiB
- references/dotnet-bulk.md17.1 KiB
- references/dotnet.md37.7 KiB
- references/mainframe-reimagine-analysis.md22.7 KiB
- references/mainframe-reimagine-ddd.md13.2 KiB
- references/mainframe-reimagine-modern-traceability.md19.4 KiB
- references/mainframe-reimagine-specgen.md21.4 KiB
- references/mainframe-reimagine-verify.md9.7 KiB
- references/mainframe-reimagine.md12.8 KiB
- references/mainframe.md11.2 KiB
- references/sql.md49.3 KiB
- references/tools.md10.8 KiB
- references/vmware-containerization.md6.9 KiB
- references/vmware-landing-zone.md8.1 KiB
- references/vmware-network.md31.5 KiB
- references/vmware-server.md8.9 KiB
- references/vmware.md14.5 KiB
- references/workflow.md26.5 KiB
- scripts/verify-traceability.pyScript26.0 KiB
references/custom-remote-execution.md
Remote Execution
Deploy and manage AWS Batch/Fargate infrastructure for running AWS Transform custom transformations at scale. All Lambda calls are executed by you — users never interact with Lambdas directly.
Remote mode deploys to the user's own AWS account. Key resources:
Results stored in S3 (
atx-custom-output-{accountId}) with KMS encryption, 30-day lifecycleSource code uploaded to S3 (
atx-source-code-{accountId}) with 7-day lifecycleCloudWatch dashboard:
ATX-Transform-CLI-Dashboardfor monitoring jobs8 Lambda functions for job management (trigger, status, terminate, list)
AWS Batch/Fargate for container execution — costs nothing when idle
To find the account:
aws sts get-caller-identity --query Account --output text
Table of Contents
Infrastructure Check
User Consent Prompt
Deployment
Lambda Function Names
MCP Configuration (Optional)
Job Submission
SSH URL Handling
Polling
Results Location
Private Repository Access
Monitoring
Container Customization
Pricing
Cleanup
Infrastructure Check
Before checking, determine the active AWS region (from AWS_REGION, AWS_DEFAULT_REGION,
or aws configure get region) and tell the user which region is being used.
Then check deployment status:
aws cloudformation describe-stacks --stack-name AtxInfrastructureStack \
--query 'Stacks[0].StackStatus' --output text || echo "NOT_DEPLOYED"If deployed (CREATE_COMPLETE or UPDATE_COMPLETE): proceed to job submission.
If NOT_DEPLOYED or any other status: get explicit user consent before deploying.
User Consent Prompt
Explain what gets created: AWS Batch (Fargate), 8 Lambda functions, S3 buckets (KMS encrypted), CloudWatch dashboard, IAM roles. If using the pre-built image, no Docker is needed and no ECR repository is created in their account. If using a custom image, an ECR repository is created and the container is built locally. One-time setup. Do NOT deploy until user confirms.
Deployment
Pre-built vs Custom Image
The infrastructure supports two container modes:
Pre-built image (default): A public ECR image with Java (8, 11, 17, 21, 25), Python (3.8-3.14), Node.js (16-24), Maven, Gradle, and common build tools. No Docker required on the user's machine. Use this when the pre-built image has everything the transformation needs (source runtime, target runtime, build tools, and any other dependencies).
Custom image (fallback): If the transformation requires a language, tool, or version not in the pre-built image, you clone the infrastructure repo, customize the Dockerfile, and build locally. This requires Docker on the user's machine.
You determine which mode to use during the Verify Runtime Compatibility step in custom. Do NOT ask the user to choose — you decide automatically based on whether the pre-built image has everything needed for the transformation.
Pre-built Image Runtimes
The pre-built image includes:
Java: 8, 11, 17, 21, 25 (Amazon Corretto) with Maven and Gradle 9.4
Python: 3.8, 3.9, 3.10, 3.11, 3.12, 3.13, 3.14 (dnf + pyenv)
Node.js: 16, 18, 20, 22, 24 (nvm) with yarn, pnpm, TypeScript, ts-node
Build tools: gcc, g++, make, patch
CLI tools: AWS CLI v2, AWS Transform CLI, git, jq, curl, unzip, tar
OS: Amazon Linux 2023 (x86_64)
If the transformation target is in this list, use the pre-built image path.
Pre-built Image Path (No Docker Required)
Clone the repo, collect and validate network config, then HAND the deploy to the user.
Network contract: AWS Transform creates Batch, Lambdas, S3, KMS, IAM, and security groups via CloudFormation. It does NOT create VPCs, subnets, NAT gateways, or internet gateways — you provide those. If you don't specify a VPC, deployment will fail rather than auto-provision.
Constraints:
You MUST clone/update the repo as before (unchanged commands).
You MUST collect
existingVpcId/existingSubnetIds/existingSecurityGroupIdfrom the user and write them intocdk.jsoncontextBEFORE deploy. This is MANDATORY for ALL sources (not just internal/self-hosted). There is no default VPC fallback —setup.shwill fail if these are empty.You MUST first discover available VPCs by running:
aws ec2 describe-vpcs --query 'Vpcs[*].[VpcId,IsDefault,Tags[?Key==`Name`].Value|[0]]' --output tableShow the results, let the user pick, then show private subnets for the chosen VPC:
aws ec2 describe-subnets --filters "Name=vpc-id,Values=<vpcId>" "Name=map-public-ip-on-launch,Values=false" \ --query 'Subnets[*].[SubnetId,AvailabilityZone,Tags[?Key==`Name`].Value|[0]]' --output tableOnly private subnets are shown. The CDK stack sets
assignPublicIp: DISABLEDon Fargate tasks, so public subnets cannot provide outbound connectivity. If none remain after filtering, tell the user: "No private subnets found in this VPC. This stack does not support public subnets — Fargate tasks require private subnets with NAT gateway for outbound connectivity." Then direct them tocreate-vpc.sh. If public subnets were filtered out, note: "Some subnets in this VPC were not shown because they are public (auto-assign public IP enabled). This stack does not support public subnets — Fargate tasks require private subnets with NAT gateway for outbound connectivity."After the user selects subnets, verify their route tables do not have a default route to an internet gateway (
0.0.0.0/0 → igw-*). Check both explicit subnet associations and the VPC's main route table. If an IGW route is found, reject: "Subnet<id>has a default route to an internet gateway (igw-...). This stack does not support public subnets — Fargate tasks deployed here would have no outbound network path."Refuse to proceed without an explicit selection. You MUST NOT recommend or guide the user toward any VPC (including the default). Present all VPCs neutrally. You MUST NOT choose on the user's behalf even if one option appears obvious — always ask and wait for explicit confirmation before writing to cdk.json.
You MUST NOT run
./setup.shyourself, because it creates IAM roles and requires admin / role-creation permissions. Instead You MUST present it for the user to run:! cd "$HOME/.aws/atx/custom/remote-infra" && AWS_PROFILE=<your-admin-profile> ./setup.shYou MUST tell the user that deploy requires an admin identity and that ReadOnly / runtime credentials suffice afterward.
You MUST NEVER run
aws ec2 create-default-vpcor create any VPC, subnet, NAT gateway, internet gateway, or route on the user's behalf. If the account has no suitable VPC or a precondition is missing, surface it to the user and refuse to proceed.
ATX_INFRA_DIR="$HOME/.aws/atx/custom/remote-infra"
if [ -d "$ATX_INFRA_DIR" ]; then
git -C "$ATX_INFRA_DIR" add -A
git -C "$ATX_INFRA_DIR" commit -m "Local customizations" -q 2>/dev/null || true
git -C "$ATX_INFRA_DIR" pull -q
else
git clone -b atx-remote-infra --single-branch https://github.com/aws-samples/aws-transform-custom-samples.git "$ATX_INFRA_DIR"
fiIf git pull reports a merge conflict, resolve it by keeping both the upstream
changes and the user's customizations in the CUSTOM LANGUAGES AND TOOLS section
of the Dockerfile, then commit the merge.
Ensure prebuiltImageUri is set in cdk.json (it should be set to "public.ecr.aws/d9h8z6l7/aws-transform:latest" by default). Then present the deploy command for the user to run:
! cd "$HOME/.aws/atx/custom/remote-infra" && AWS_PROFILE=<your-admin-profile> ./setup.shThe setup script skips the Docker prerequisite check and container build when
prebuiltImageUri is configured. First deploy takes ~3-5 minutes (no image build).
Custom Image Path (Docker Required)
If the transformation requires a runtime (source or target) or any other software not in the pre-built image, clone/update the repo, clear the pre-built URI, customize the Dockerfile, and deploy:
ATX_INFRA_DIR="$HOME/.aws/atx/custom/remote-infra"
if [ -d "$ATX_INFRA_DIR" ]; then
git -C "$ATX_INFRA_DIR" add -A
git -C "$ATX_INFRA_DIR" commit -m "Local customizations" -q 2>/dev/null || true
git -C "$ATX_INFRA_DIR" pull -q
else
git clone -b atx-remote-infra --single-branch https://github.com/aws-samples/aws-transform-custom-samples.git "$ATX_INFRA_DIR"
fi
cd "$ATX_INFRA_DIR" && sed -i.bak 's|"prebuiltImageUri": ".*"|"prebuiltImageUri": ""|' cdk.jsonCustomize the Dockerfile (see Container Customization below), then deploy:
cd "$ATX_INFRA_DIR" && ./setup.shThis path requires Docker installed and running. First deploy takes ~5-10 minutes (container build). CDK auto-detects Dockerfile changes and rebuilds the image.
Deployment Failures
If setup.sh fails, it prints the specific prerequisite that's missing. Fix that
one thing and re-run — the script is idempotent.
If deployment fails partway through (e.g., CloudFormation stack stuck in
ROLLBACK_COMPLETE or UPDATE_ROLLBACK_FAILED), run teardown first, then retry:
cd "$ATX_INFRA_DIR" && rm -f cdk.context.json && ./teardown.sh && ./setup.shThis cleans up the half-deployed state, clears cached CDK context, and starts fresh. The teardown script handles stacks in any state, including failed rollbacks.
Attach IAM Policies
After deployment, generate and attach the runtime policy so the caller has permissions to invoke Lambdas, upload/download from S3, use KMS, etc.:
cd "$ATX_INFRA_DIR" && npx ts-node generate-caller-policy.tsThis produces two JSON files in $ATX_INFRA_DIR:
atx-runtime-policy.json— Day-to-day operations (Lambda invoke, S3, KMS, Secrets Manager, logs)atx-deployment-policy.json— One-time CDK deploy/destroy (CloudFormation, ECR, IAM, Batch, VPC)
Attach the runtime policy to the caller:
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
CALLER_ARN=$(aws sts get-caller-identity --query Arn --output text)
# Create the managed policy (ignore EntityAlreadyExists, fail on other errors)
if ! create_output=$(aws iam create-policy --policy-name ATXRuntimePolicy \
--policy-document "file://$ATX_INFRA_DIR/atx-runtime-policy.json" 2>&1); then
echo "$create_output" | grep -q "EntityAlreadyExists" \
|| { echo "Failed to create policy: $create_output" >&2; exit 1; }
fi
# Attach to the caller (handles IAM users, IAM roles, and SSO/assumed roles)
if echo "$CALLER_ARN" | grep -q ":user/"; then
IDENTITY_NAME=$(echo "$CALLER_ARN" | awk -F'/' '{print $NF}')
aws iam attach-user-policy --user-name "$IDENTITY_NAME" \
--policy-arn "arn:aws:iam::${ACCOUNT_ID}:policy/ATXRuntimePolicy"
elif echo "$CALLER_ARN" | grep -Eq ":assumed-role/|:role/"; then
ROLE_NAME=$(echo "$CALLER_ARN" | sed 's/.*:\(assumed-\)\{0,1\}role\///' | cut -d'/' -f1)
aws iam attach-role-policy --role-name "$ROLE_NAME" \
--policy-arn "arn:aws:iam::${ACCOUNT_ID}:policy/ATXRuntimePolicy"
fiIf the attachment fails (insufficient IAM permissions, or an SSO-managed role with
name starting with AWSReservedSSO_), inform the user:
The policy JSON is at
$ATX_INFRA_DIR/atx-runtime-policy.jsonThey need their AWS administrator to create and attach it to their identity
For SSO users, it must be added to their IAM Identity Center permission set
Verify the policy is working by invoking a Lambda:
aws lambda invoke --function-name atx-list-jobs --payload '{}' \
--cli-binary-format raw-in-base64-out /dev/stdoutIf this succeeds, the runtime policy is active. If not, the attachment hasn't taken effect yet — wait a few seconds and retry.
If the caller also needs to deploy/destroy infrastructure (not just run jobs),
repeat the above with atx-deployment-policy.json and policy name ATXDeploymentPolicy.
Lambda Function Names
After deployment, the Lambda functions are available with these names:
atx-trigger-job— Submit a single transformation jobatx-get-job-status— Get status of a single jobatx-terminate-job— Terminate a running jobatx-list-jobs— List all jobsatx-trigger-batch-jobs— Submit a batch of jobsatx-get-batch-status— Get batch statusatx-terminate-batch-jobs— Terminate all jobs in a batchatx-list-batches— List all batches
MCP Configuration (Optional)
If the user has a local AWS Transform MCP configuration, include it inline with job submissions so the containers can use it. Check for a local config:
cat ~/.aws/atx/mcp.json 2>/dev/nullIf it exists, include the contents as the mcpConfig field in the atx-trigger-job
or atx-trigger-batch-jobs payload. For example:
aws lambda invoke --function-name atx-trigger-job \
--payload '{"source":"...","command":"...","jobName":"...","mcpConfig":<contents of mcp.json>}' \
--cli-binary-format raw-in-base64-out /dev/stdoutThe MCP config travels with the job request — do NOT upload it separately via
atx-configure-mcp. Skip this step if no local MCP config exists.
Job Submission
Limits: Maximum 512 repositories per session. Submit in batches of up to 128
jobs each via atx-trigger-batch-jobs. If you have more than 128 jobs, split them
into multiple Lambda calls (e.g., 500 repos = 4 calls of 128 + 128 + 128 + 116).
Each call returns its own batchId — track all of them for monitoring. AWS Batch
runs all jobs in a batch concurrently. If the total repo count exceeds 512, stop
and ask the user to reduce the list.
Repo analysis: Do NOT scan or inspect repository contents locally in remote mode. The repos may not be available on the local machine. Let the user specify which transformation definitions to apply, or use the one already selected in the plugin.
Deployment failures: If setup.sh or cdk deploy fails for any reason, run
./teardown.sh first to clean up the partial state, then retry ./setup.sh.
Do not try to manually fix individual CloudFormation errors.
Source restrictions: The source field accepts HTTPS git URLs, SSH git URLs
(with atx/ssh-key configured), or S3 paths within the CDK-managed source bucket
(atx-source-code-{account}). The container's IAM role cannot read from arbitrary
S3 buckets. If the user provides zips in their own S3 bucket, copy them to the
managed source bucket first (see the Collect Repositories step in custom).
Single job:
aws lambda invoke --function-name atx-trigger-job \
--payload '{"source":"<url-or-s3>","command":"atx custom def exec -n <td> -p /source/<project> -x -t","jobName":"<name>"}' \
--cli-binary-format raw-in-base64-out /dev/stdoutBatch:
aws lambda invoke --function-name atx-trigger-batch-jobs \
--payload '{"batchName":"<name>","jobs":[{"source":"<url>","command":"atx custom def exec -n <td> -p /source/<project> -x -t","jobName":"<name>"}]}' \
--cli-binary-format raw-in-base64-out /dev/stdoutSSH URL Handling
SSH git URLs ([email protected]:org/repo.git or ssh://[email protected]/org/repo.git)
are passed directly to the Lambda — the container clones them remotely. This requires
an SSH private key stored in Secrets Manager as atx/ssh-key. See the Collect Repositories step in custom
for setup instructions.
If the SSH key is not configured, the clone will fail inside the container. Do NOT fall back to cloning locally — guide the user through SSH key setup instead.
Polling
Poll every 60 seconds for the first 10 polls, then every 5 minutes after. Report only on status change.
aws lambda invoke --function-name atx-get-job-status \
--payload '{"jobId":"<id>"}' \
--cli-binary-format raw-in-base64-out /dev/stdout
aws lambda invoke --function-name atx-get-batch-status \
--payload '{"batchId":"<id>"}' \
--cli-binary-format raw-in-base64-out /dev/stdoutResults Location
Do NOT download results locally. Results stay in S3. Present the S3 path to the user:
Results: s3://atx-custom-output-{account-id}/transformations/<job-name>/<conversation-id>/
code.zip — zipped transformed source code
logs.zip — AWS Transform conversation logsIf the user explicitly asks to download, provide the command but let them run it:
aws s3 cp s3://atx-custom-output-{account-id}/transformations/<job-name>/<conversation-id>/code.zip ./code.zipPrivate Repository Access
Note: If the user has private repos, credentials should already be configured during the Collect Repositories step in custom. This section documents the mechanism for reference.
The container fetches credentials from AWS Secrets Manager at startup. Three secret types:
atx/github-token — plain string GitHub PAT for private HTTPS repo cloning:
aws secretsmanager create-secret --name "atx/github-token" --secret-string "<token>"atx/ssh-key — plain string SSH private key for private SSH repo cloning:
aws secretsmanager create-secret --name "atx/ssh-key" --secret-string "$(cat <path-to-your-private-key>)"atx/credentials — JSON array of credential files for any tool/registry (see Container Customization below).
Setup (requires user consent):
Explain which secrets will be created in their AWS account
Get explicit confirmation from the user, then give them the
create-secretcommand to run in their own terminal — do not ask them to paste the credential value into this chatWait for the user to confirm they ran the command, then verify the secret exists with
aws secretsmanager describe-secretContainer entrypoint auto-fetches at startup — no image rebuild needed
User can delete anytime:
aws secretsmanager delete-secret --secret-id "atx/github-token" --region "$REGION" --force-delete-without-recovery
AWS credentials for AWS Transform CLI are handled automatically by the IAM task role (refreshed every 45 min).
Monitoring
CloudWatch dashboard: ATX-Transform-CLI-Dashboard
Job Tracking: completion rates, success/failure trends
Lambda Metrics: invocation counts, duration, errors
Real-time Logs: stream transformation progress
Dashboard URL (construct dynamically using the caller's region):
REGION=${AWS_REGION:-${AWS_DEFAULT_REGION:-$(aws configure get region 2>/dev/null)}}
REGION=${REGION:-us-east-1}
echo "https://${REGION}.console.aws.amazon.com/cloudwatch/home#dashboards/dashboard/ATX-Transform-CLI-Dashboard"Include this link in the final output when remote execution completes.
Container Customization
The default container includes Java (8, 11, 17, 21, 25), Python (3.8-3.14), Node.js (16-24), Maven, Gradle, gcc/g++, make, and common build tools.
If a transformation requires a language or tool not included, you handle this
automatically during the Verify Container Compatibility step — see custom. The
Dockerfile has a clearly marked CUSTOM LANGUAGES AND TOOLS section where new
RUN commands should be inserted. After editing, redeploy with cd "$ATX_INFRA_DIR" && ./setup.sh — CDK
auto-detects Dockerfile changes and rebuilds the image.
Adding Languages or Tools
# Example: Add Rust (install as atxuser so binaries land in /home/atxuser/.cargo)
USER atxuser
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
USER root
ENV PATH="/home/atxuser/.cargo/bin:$PATH"Private Package Registries
Credentials are fetched from AWS Secrets Manager at container startup — never baked into the image.
atx/github-token (plain string) — GitHub PAT for private repo cloning.
atx/credentials (JSON array) — Generic credential files for any tool or registry. Each entry writes a file into the container at startup:
[
{ "path": "/home/atxuser/.npmrc", "content": "//npm.company.com/:_authToken=TOKEN" },
{ "path": "/home/atxuser/.m2/settings.xml", "content": "<settings>...</settings>" },
{
"path": "/home/atxuser/.config/pip/pip.conf",
"content": "[global]\nindex-url = https://pypi.company.com/simple"
},
{
"path": "/home/atxuser/.gem/credentials",
"content": "---\n:rubygems_api_key: KEY",
"mode": "0600"
},
{ "path": "/home/atxuser/.cargo/credentials.toml", "content": "[registry]\ntoken = \"TOKEN\"" },
{ "path": "/home/atxuser/.nuget/NuGet.Config", "content": "<?xml version=\"1.0\"?>..." }
]Create the secret:
aws secretsmanager create-secret --name "atx/credentials" \
--secret-string '[{"path":"/home/atxuser/.npmrc","content":"//npm.company.com/:_authToken=TOKEN"}]'This works for any language or tool added to the Dockerfile — npm, Maven, pip, RubyGems, Cargo, NuGet, etc. The mode field is optional (defaults to 0644).
Version Switching at Runtime
The container supports runtime version switching via environment variables passed as container overrides.
The environment field on the job MUST match the exact target version of the
transformation — not the closest available version. For example, if upgrading to
Java 23, set "JAVA_VERSION":"23" (not "21"). If the target version was added
to the Dockerfile and entrypoint per the Verify Runtime Compatibility step, the switcher will activate it.
Via Lambda (recommended):
aws lambda invoke --function-name atx-trigger-job \
--payload '{"source":"...","jobName":"...","command":"atx ...","environment":{"JAVA_VERSION":"23","NODE_VERSION":"22","PYTHON_VERSION":"3.13"}}' \
--cli-binary-format raw-in-base64-out /dev/stdoutVia direct Batch submission:
aws batch submit-job \
--container-overrides '{
"environment": [
{"name": "JAVA_VERSION", "value": "23"},
{"name": "PYTHON_VERSION", "value": "3.13"},
{"name": "NODE_VERSION", "value": "22"}
]
}' ...Available: Java 8/11/17/21/25, Python 3.8-3.14, Node.js 16/18/20/22/24.
Python accepts both short (13) and full (3.13) formats.
See $ATX_INFRA_DIR/container/README.md for full customization reference including Docker BuildKit secrets for secure credential handling.
Pricing
Do NOT quote specific prices or cost estimates to the user. If the user asks about pricing, direct them to: https://aws.amazon.com/transform/pricing/
The remote infrastructure (Batch, Lambda, S3) has no fixed costs — all services are pay-per-use and cost nothing when idle.
Cleanup
The remote infrastructure costs nothing when idle — Fargate is pay-per-task, Lambdas are pay-per-invoke, and S3 storage is minimal.
After every remote execution completes (all jobs finished or failed), prompt the user with the following:
Your remote infrastructure is still deployed in your AWS account. All services are pay-per-use only — there are no fixed costs when idle. You can leave it in place for future transformations, or tear it down now.
For pricing details: https://aws.amazon.com/transform/pricing/
If you tear down:
All AWS Transform resources are completely removed from your account
KMS key deletion is scheduled (7-day AWS minimum wait)
S3 buckets, secrets, IAM policies, log groups — all deleted
You'll need to re-run setup (~5-10 min) next time you use remote mode
Would you like to keep the infrastructure or tear it down?
If the user chooses to tear down:
cd "$ATX_INFRA_DIR" && ./teardown.shIf the user chooses to keep it, confirm: "Infrastructure will stay deployed. Next time you run remote transformations, everything will be ready immediately."
Requirements and compatibility
Written for: Claude Code
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Names Claude Code tools, Needs an MCP server, Needs network access, Needs a command-line tool, Needs Python
Security
What our scanner noticed· Medium risk
- Phrasing that asks for actions without confirmation
- References to credential files
- Instructions that use the network
- Downloads piped into a shell
- Scripts that your agent may run
This skill includes scripts that your agent may run. Read them before you use it.
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- AWS Labs
- Publisher
- AWS Labs (Official)
- Source
- awslabs/agent-plugins · plugins/aws-transform/skills/aws-transform · commit fbefb37
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- NOTICE (added by AutoGineer from NOTICE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by AWS Labs.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download aws-transform.zip