@aws/nx-plugin 1.3.2 → 1.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/LICENSE-THIRD-PARTY +21421 -10904
  2. package/migrations.json +12 -12
  3. package/package.json +4 -4
  4. package/src/agentcore-gateway/__snapshots__/generator.spec.ts.snap +1 -1
  5. package/src/greengrass/component/python/__snapshots__/generator.spec.ts.snap +2 -2
  6. package/src/infra/app/__snapshots__/generator.spec.ts.snap +3 -3
  7. package/src/migrations/v1.0.15/0001-py-agent-pillow-override/migration.d.ts +5 -5
  8. package/src/migrations/v1.0.15/0001-py-agent-pillow-override/migration.js +75 -3
  9. package/src/migrations/v1.0.15/0001-py-agent-pillow-override/migration.js.map +1 -1
  10. package/src/migrations/v1.3.1/0001-biome-markdown-yaml-formatter-off/migration.js.map +1 -0
  11. package/src/migrations/v1.3.2/0001-py-agentcore-launcher/migration.js.map +1 -0
  12. package/src/preset/__snapshots__/generator.spec.ts.snap +2 -2
  13. package/src/py/agent/__snapshots__/generator.constructs.spec.ts.snap +6 -6
  14. package/src/py/agent/__snapshots__/generator.frameworks.spec.ts.snap +7 -7
  15. package/src/py/agent/__snapshots__/generator.protocols.spec.ts.snap +4 -4
  16. package/src/py/agent/guardrails/__snapshots__/generator.spec.ts.snap +6 -6
  17. package/src/py/dynamodb/__snapshots__/generator.spec.ts.snap +2 -2
  18. package/src/py/fast-api/__snapshots__/generator.terraform.spec.ts.snap +12 -12
  19. package/src/py/lambda-function/__snapshots__/generator.spec.ts.snap +2 -2
  20. package/src/py/mcp-server/__snapshots__/generator.spec.ts.snap +5 -5
  21. package/src/py/rdb/__snapshots__/generator.spec.ts.snap +3 -3
  22. package/src/smithy/project/__snapshots__/generator.spec.ts.snap +7 -7
  23. package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +8 -8
  24. package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +12 -12
  25. package/src/ts/agent/__snapshots__/generator.spec.ts.snap +4 -4
  26. package/src/ts/agent/guardrails/__snapshots__/generator.spec.ts.snap +3 -3
  27. package/src/ts/dcr-proxy/__snapshots__/generator.spec.ts.snap +1 -1
  28. package/src/ts/dynamodb/__snapshots__/generator.spec.ts.snap +2 -2
  29. package/src/ts/lambda-function/__snapshots__/generator.spec.ts.snap +2 -2
  30. package/src/ts/mcp-server/__snapshots__/generator.spec.ts.snap +2 -2
  31. package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +4 -4
  32. package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +14 -14
  33. package/src/ts/react-website/cognito-auth/__snapshots__/generator.terraform.spec.ts.snap +2 -2
  34. package/src/utils/docker.d.ts +1 -1
  35. package/src/utils/py.d.ts +0 -10
  36. package/src/utils/py.js +2 -59
  37. package/src/utils/py.js.map +1 -1
  38. package/src/utils/versions.d.ts +63 -71
  39. package/src/utils/versions.js +61 -74
  40. package/src/utils/versions.js.map +1 -1
  41. package/src/migrations/latest/biome-markdown-yaml-formatter-off/migration.js.map +0 -1
  42. package/src/migrations/latest/py-agentcore-launcher/migration.js.map +0 -1
  43. /package/src/migrations/{latest/biome-markdown-yaml-formatter-off → v1.3.1/0001-biome-markdown-yaml-formatter-off}/metadata.json +0 -0
  44. /package/src/migrations/{latest/biome-markdown-yaml-formatter-off → v1.3.1/0001-biome-markdown-yaml-formatter-off}/migration.d.ts +0 -0
  45. /package/src/migrations/{latest/biome-markdown-yaml-formatter-off → v1.3.1/0001-biome-markdown-yaml-formatter-off}/migration.js +0 -0
  46. /package/src/migrations/{latest/py-agentcore-launcher → v1.3.2/0001-py-agentcore-launcher}/metadata.json +0 -0
  47. /package/src/migrations/{latest/py-agentcore-launcher → v1.3.2/0001-py-agentcore-launcher}/migration.d.ts +0 -0
  48. /package/src/migrations/{latest/py-agentcore-launcher → v1.3.2/0001-py-agentcore-launcher}/migration.js +0 -0
package/migrations.json CHANGED
@@ -2,16 +2,6 @@
2
2
  "$schema": "http://json-schema.org/schema",
3
3
  "name": "@aws/nx-plugin",
4
4
  "generators": {
5
- "latest-biome-markdown-yaml-formatter-off": {
6
- "version": "1.3.1",
7
- "description": "Turn off Biome 2.6's Markdown and YAML formatting in biome.json, which formats them by default",
8
- "implementation": "./src/migrations/latest/biome-markdown-yaml-formatter-off/migration"
9
- },
10
- "latest-py-agentcore-launcher": {
11
- "version": "1.3.2",
12
- "description": "Launch Python AgentCore code with the managed interpreter",
13
- "implementation": "./src/migrations/latest/py-agentcore-launcher/migration"
14
- },
15
5
  "v1.0.0-rc.50-0001-modernize-function-props-cast": {
16
6
  "version": "1.0.0-rc.50",
17
7
  "description": "Replace the legacy angle-bracket FunctionProps type assertion with the modern as syntax in generated API constructs",
@@ -442,8 +432,18 @@
442
432
  "description": "Keep a replaced guardrail version in each Terraform guardrail module of a TypeScript agent for 15 seconds after the runtime-config deployment, so agents' 5-second runtime-config cache never points at a deleted version",
443
433
  "implementation": "./src/migrations/v1.3.0/0001-ts-agent-guardrails-terraform-version-retention/migration"
444
434
  },
445
- "sync-vended-versions": {
435
+ "v1.3.1-0001-biome-markdown-yaml-formatter-off": {
436
+ "version": "1.3.1",
437
+ "description": "Turn off Biome 2.6's Markdown and YAML formatting in biome.json, which formats them by default",
438
+ "implementation": "./src/migrations/v1.3.1/0001-biome-markdown-yaml-formatter-off/migration"
439
+ },
440
+ "v1.3.2-0001-py-agentcore-launcher": {
446
441
  "version": "1.3.2",
442
+ "description": "Launch Python AgentCore code with the managed interpreter",
443
+ "implementation": "./src/migrations/v1.3.2/0001-py-agentcore-launcher/migration"
444
+ },
445
+ "sync-vended-versions": {
446
+ "version": "1.3.4",
447
447
  "description": "Sync vended dependency versions and the tracked plugin version to those vended by this release",
448
448
  "implementation": "./src/utils/version-upgrade-migration/migration"
449
449
  }
@@ -615,7 +615,7 @@
615
615
  }
616
616
  },
617
617
  "nx-23.3.1-nx-packages": {
618
- "version": "1.3.2",
618
+ "version": "1.3.1",
619
619
  "packages": {
620
620
  "nx": {
621
621
  "version": "23.3.1",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aws/nx-plugin",
3
- "version": "1.3.2",
3
+ "version": "1.3.4",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/awslabs/nx-plugin-for-aws.git",
@@ -40,9 +40,9 @@
40
40
  },
41
41
  "dependencies": {
42
42
  "@apidevtools/swagger-parser": "12.1.0",
43
- "@astral-sh/ruff-wasm-nodejs": "0.17.2",
43
+ "@astral-sh/ruff-wasm-nodejs": "0.17.3",
44
44
  "@biomejs/js-api": "6.1.0",
45
- "@biomejs/wasm-nodejs": "2.6.3",
45
+ "@biomejs/wasm-nodejs": "2.6.4",
46
46
  "@getgrit/gritql": "0.0.3",
47
47
  "@iarna/toml": "2.2.5",
48
48
  "@modelcontextprotocol/sdk": "1.32.2",
@@ -52,7 +52,7 @@
52
52
  "@nx/vite": "23.3.1",
53
53
  "@nxlv/python": "23.3.1",
54
54
  "@phenomnomnominal/tsquery": "6.2.0",
55
- "@types/estree": "1.0.9",
55
+ "@types/estree": "1.0.10",
56
56
  "@types/js-yaml": "4.0.9",
57
57
  "@types/mdast": "4.0.4",
58
58
  "enquirer": "2.4.1",
@@ -7,7 +7,7 @@ exports[`agentcore-gateway generator > protocol: http > omits protocol_type from
7
7
  required_providers {
8
8
  aws = {
9
9
  source = "hashicorp/aws"
10
- version = "6.70.0"
10
+ version = "6.71.0"
11
11
  }
12
12
  time = {
13
13
  source = "hashicorp/time"
@@ -216,7 +216,7 @@ def test_run_once_does_not_raise():
216
216
  - packages/*
217
217
  - packages/common/*
218
218
  catalog:
219
- '@types/node': 26.6.5
219
+ '@types/node': 26.6.6
220
220
  vite: 8.3.5
221
221
  vitest: 5.0.5
222
222
  '@vitest/coverage-v8': 5.0.5
@@ -435,7 +435,7 @@ def test_run_once_does_not_raise():
435
435
  - packages/*
436
436
  - packages/common/*
437
437
  catalog:
438
- '@types/node': 26.6.5
438
+ '@types/node': 26.6.6
439
439
  vite: 8.3.5
440
440
  vitest: 5.0.5
441
441
  '@vitest/coverage-v8': 5.0.5
@@ -50,7 +50,7 @@ exports[`infra generator > should configure Checkov target correctly > checkov-t
50
50
  "default",
51
51
  ],
52
52
  "options": {
53
- "command": "uvx --from checkov==3.3.30 checkov --config-file {projectRoot}/checkov.yml --directory dist/{projectRoot}/cdk.out --framework cloudformation",
53
+ "command": "uvx --from checkov==3.4.0 checkov --config-file {projectRoot}/checkov.yml --directory dist/{projectRoot}/cdk.out --framework cloudformation",
54
54
  },
55
55
  "outputs": [
56
56
  "{workspaceRoot}/dist/{projectRoot}/checkov",
@@ -150,7 +150,7 @@ exports[`infra generator > should configure project.json with correct targets >
150
150
  "default",
151
151
  ],
152
152
  "options": {
153
- "command": "uvx --from checkov==3.3.30 checkov --config-file {projectRoot}/checkov.yml --directory dist/{projectRoot}/cdk.out --framework cloudformation",
153
+ "command": "uvx --from checkov==3.4.0 checkov --config-file {projectRoot}/checkov.yml --directory dist/{projectRoot}/cdk.out --framework cloudformation",
154
154
  },
155
155
  "outputs": [
156
156
  "{workspaceRoot}/dist/{projectRoot}/checkov",
@@ -767,7 +767,7 @@ exports[`infra generator > should handle custom project names correctly > custom
767
767
  "default",
768
768
  ],
769
769
  "options": {
770
- "command": "uvx --from checkov==3.3.30 checkov --config-file {projectRoot}/checkov.yml --directory dist/{projectRoot}/cdk.out --framework cloudformation",
770
+ "command": "uvx --from checkov==3.4.0 checkov --config-file {projectRoot}/checkov.yml --directory dist/{projectRoot}/cdk.out --framework cloudformation",
771
771
  },
772
772
  "outputs": [
773
773
  "{workspaceRoot}/dist/{projectRoot}/checkov",
@@ -1,7 +1,3 @@
1
- /**
2
- * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
- * SPDX-License-Identifier: Apache-2.0
4
- */
5
1
  import { type MigrationReturnObject, type Tree } from '@nx/devkit';
6
2
  /**
7
3
  * Add the strands-agents-tools pillow override to the workspace root
@@ -9,10 +5,14 @@ import { type MigrationReturnObject, type Tree } from '@nx/devkit';
9
5
  *
10
6
  * strands-agents-tools caps pillow below the release that fixes its current
11
7
  * CVEs, and uv reads `[tool.uv] override-dependencies` only from the workspace
12
- * root, so the root carries the override (`PY_UV_OVERRIDES`). It applies when
8
+ * root, so the root carries the override (`UV_OVERRIDES`). It applies when
13
9
  * any project's `[project].dependencies` names strands-agents-tools. A user
14
10
  * override for the same package is kept as written. `uv.lock` is left to the
15
11
  * user, as the version sync leaves it, so `nextSteps` asks for `uv sync` when
16
12
  * the root changes.
13
+ *
14
+ * Released in v1.0.15 and frozen. Generators stopped writing the override
15
+ * once strands-agents-tools 0.8.11 allowed pillow 13. The override is still
16
+ * satisfiable with 0.8.11 (`pillow<14`), so this migration keeps writing it.
17
17
  */
18
18
  export default function migration(tree: Tree): Promise<MigrationReturnObject>;
@@ -1,21 +1,93 @@
1
1
  /**
2
2
  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
3
  * SPDX-License-Identifier: Apache-2.0
4
- */ import { getProjects, joinPathFragments } from "@nx/devkit";
4
+ */ import { stringify } from "@iarna/toml";
5
+ import { getProjects, joinPathFragments } from "@nx/devkit";
6
+ import { parsePipRequirementsLine } from "pip-requirements-js";
5
7
  import { formatFilesInSubtree } from "../../../utils/format.js";
6
- import { addUvOverrideDependencies } from "../../../utils/py.js";
8
+ import { normalizeDistributionName } from "../../../utils/names.js";
7
9
  import { tryReadToml } from "../../../utils/toml.js";
10
+ /**
11
+ * The overrides this migration shipped with in v1.0.15, keyed by the vended
12
+ * package whose own requirement they override. Kept here, not in versions.ts,
13
+ * so the released behaviour does not change when the generators stop writing
14
+ * the override.
15
+ */ const UV_OVERRIDES = {
16
+ 'strands-agents-tools': [
17
+ 'pillow>=13.0.0'
18
+ ]
19
+ };
20
+ // PEP 503 name of a requirement, or undefined for one that names no package or
21
+ // cannot be parsed.
22
+ const requirementName = (requirement)=>{
23
+ if (typeof requirement !== 'string') {
24
+ return undefined;
25
+ }
26
+ try {
27
+ const parsed = parsePipRequirementsLine(requirement);
28
+ return parsed?.type === 'ProjectName' || parsed?.type === 'ProjectURL' ? normalizeDistributionName(parsed.name) : undefined;
29
+ } catch {
30
+ return undefined;
31
+ }
32
+ };
33
+ /**
34
+ * Add the `UV_OVERRIDES` entries for the packages named in `requirements` to
35
+ * the workspace root `[tool.uv] override-dependencies`, which is the only place
36
+ * uv reads overrides from.
37
+ *
38
+ * Existing entries keep their order, and a package the list already overrides
39
+ * is left as the user wrote it. The root file is written only when an entry is
40
+ * added. Returns whether it was.
41
+ */ const addUvOverrideDependencies = (tree, requirements)=>{
42
+ const rootPyprojectPath = 'pyproject.toml';
43
+ const toml = tryReadToml(tree, rootPyprojectPath);
44
+ if (!toml) {
45
+ return false;
46
+ }
47
+ const names = new Set(requirements.map(requirementName));
48
+ const overrides = Object.entries(UV_OVERRIDES).flatMap(([dependency, entries])=>names.has(normalizeDistributionName(dependency)) ? entries : []);
49
+ if (overrides.length === 0) {
50
+ return false;
51
+ }
52
+ const existing = toml.tool?.uv?.['override-dependencies'];
53
+ if (existing !== undefined && !Array.isArray(existing)) {
54
+ return false;
55
+ }
56
+ const merged = [
57
+ ...existing ?? []
58
+ ];
59
+ const overridden = new Set(merged.map(requirementName));
60
+ for (const entry of overrides){
61
+ const name = requirementName(entry);
62
+ if (!overridden.has(name)) {
63
+ merged.push(entry);
64
+ overridden.add(name);
65
+ }
66
+ }
67
+ if (merged.length === (existing ?? []).length) {
68
+ return false;
69
+ }
70
+ toml.tool ??= {};
71
+ toml.tool.uv ??= {};
72
+ toml.tool.uv['override-dependencies'] = merged;
73
+ tree.write(rootPyprojectPath, stringify(toml));
74
+ return true;
75
+ };
8
76
  /**
9
77
  * Add the strands-agents-tools pillow override to the workspace root
10
78
  * pyproject.toml uv override-dependencies.
11
79
  *
12
80
  * strands-agents-tools caps pillow below the release that fixes its current
13
81
  * CVEs, and uv reads `[tool.uv] override-dependencies` only from the workspace
14
- * root, so the root carries the override (`PY_UV_OVERRIDES`). It applies when
82
+ * root, so the root carries the override (`UV_OVERRIDES`). It applies when
15
83
  * any project's `[project].dependencies` names strands-agents-tools. A user
16
84
  * override for the same package is kept as written. `uv.lock` is left to the
17
85
  * user, as the version sync leaves it, so `nextSteps` asks for `uv sync` when
18
86
  * the root changes.
87
+ *
88
+ * Released in v1.0.15 and frozen. Generators stopped writing the override
89
+ * once strands-agents-tools 0.8.11 allowed pillow 13. The override is still
90
+ * satisfiable with 0.8.11 (`pillow<14`), so this migration keeps writing it.
19
91
  */ export default async function migration(tree) {
20
92
  const nextSteps = [];
21
93
  if (tree.exists('pyproject.toml')) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../packages/nx-plugin/src/migrations/v1.0.15/0001-py-agent-pillow-override/migration.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n getProjects,\n joinPathFragments,\n type MigrationReturnObject,\n type Tree,\n} from '@nx/devkit';\nimport { formatFilesInSubtree } from '../../../utils/format.js';\nimport type { UVPyprojectToml } from '../../../utils/nxlv-python.js';\nimport { addUvOverrideDependencies } from '../../../utils/py.js';\nimport { tryReadToml } from '../../../utils/toml.js';\n\n/**\n * Add the strands-agents-tools pillow override to the workspace root\n * pyproject.toml uv override-dependencies.\n *\n * strands-agents-tools caps pillow below the release that fixes its current\n * CVEs, and uv reads `[tool.uv] override-dependencies` only from the workspace\n * root, so the root carries the override (`PY_UV_OVERRIDES`). It applies when\n * any project's `[project].dependencies` names strands-agents-tools. A user\n * override for the same package is kept as written. `uv.lock` is left to the\n * user, as the version sync leaves it, so `nextSteps` asks for `uv sync` when\n * the root changes.\n */\nexport default async function migration(\n tree: Tree,\n): Promise<MigrationReturnObject> {\n const nextSteps: string[] = [];\n\n if (tree.exists('pyproject.toml')) {\n const requirements = [...getProjects(tree).values()].flatMap(({ root }) => {\n const dependencies = (\n tryReadToml(tree, joinPathFragments(root, 'pyproject.toml')) as\n | UVPyprojectToml\n | undefined\n )?.project?.dependencies;\n return Array.isArray(dependencies) ? dependencies : [];\n });\n if (addUvOverrideDependencies(tree, requirements)) {\n nextSteps.push(\n 'The workspace root pyproject.toml now overrides a dependency of strands-agents-tools. Run `uv sync` to update uv.lock.',\n );\n }\n }\n\n await formatFilesInSubtree(tree);\n\n return { nextSteps };\n}\n"],"names":["getProjects","joinPathFragments","formatFilesInSubtree","addUvOverrideDependencies","tryReadToml","migration","tree","nextSteps","exists","requirements","values","flatMap","root","dependencies","project","Array","isArray","push"],"mappings":"AAAA;;;CAGC,GACD,SACEA,WAAW,EACXC,iBAAiB,QAGZ,aAAa;AACpB,SAASC,oBAAoB,QAAQ,2BAA2B;AAEhE,SAASC,yBAAyB,QAAQ,uBAAuB;AACjE,SAASC,WAAW,QAAQ,yBAAyB;AAErD;;;;;;;;;;;CAWC,GACD,eAAe,eAAeC,UAC5BC,IAAU;IAEV,MAAMC,YAAsB,EAAE;IAE9B,IAAID,KAAKE,MAAM,CAAC,mBAAmB;QACjC,MAAMC,eAAe;eAAIT,YAAYM,MAAMI,MAAM;SAAG,CAACC,OAAO,CAAC,CAAC,EAAEC,IAAI,EAAE;YACpE,MAAMC,eACJT,YAAYE,MAAML,kBAAkBW,MAAM,oBAGzCE,SAASD;YACZ,OAAOE,MAAMC,OAAO,CAACH,gBAAgBA,eAAe,EAAE;QACxD;QACA,IAAIV,0BAA0BG,MAAMG,eAAe;YACjDF,UAAUU,IAAI,CACZ;QAEJ;IACF;IAEA,MAAMf,qBAAqBI;IAE3B,OAAO;QAAEC;IAAU;AACrB"}
1
+ {"version":3,"sources":["../../../../../../../packages/nx-plugin/src/migrations/v1.0.15/0001-py-agent-pillow-override/migration.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { type JsonMap, stringify } from '@iarna/toml';\nimport {\n getProjects,\n joinPathFragments,\n type MigrationReturnObject,\n type Tree,\n} from '@nx/devkit';\nimport { parsePipRequirementsLine } from 'pip-requirements-js';\nimport { formatFilesInSubtree } from '../../../utils/format.js';\nimport { normalizeDistributionName } from '../../../utils/names.js';\nimport type { UVPyprojectToml } from '../../../utils/nxlv-python.js';\nimport { tryReadToml } from '../../../utils/toml.js';\n\n/**\n * The overrides this migration shipped with in v1.0.15, keyed by the vended\n * package whose own requirement they override. Kept here, not in versions.ts,\n * so the released behaviour does not change when the generators stop writing\n * the override.\n */\nconst UV_OVERRIDES: Readonly<Record<string, readonly string[]>> = {\n 'strands-agents-tools': ['pillow>=13.0.0'],\n};\n\n// PEP 503 name of a requirement, or undefined for one that names no package or\n// cannot be parsed.\nconst requirementName = (requirement: unknown): string | undefined => {\n if (typeof requirement !== 'string') {\n return undefined;\n }\n try {\n const parsed = parsePipRequirementsLine(requirement);\n return parsed?.type === 'ProjectName' || parsed?.type === 'ProjectURL'\n ? normalizeDistributionName(parsed.name)\n : undefined;\n } catch {\n return undefined;\n }\n};\n\n/**\n * Add the `UV_OVERRIDES` entries for the packages named in `requirements` to\n * the workspace root `[tool.uv] override-dependencies`, which is the only place\n * uv reads overrides from.\n *\n * Existing entries keep their order, and a package the list already overrides\n * is left as the user wrote it. The root file is written only when an entry is\n * added. Returns whether it was.\n */\nconst addUvOverrideDependencies = (\n tree: Tree,\n requirements: readonly string[],\n): boolean => {\n const rootPyprojectPath = 'pyproject.toml';\n const toml = tryReadToml(tree, rootPyprojectPath) as\n | UVPyprojectToml\n | undefined;\n if (!toml) {\n return false;\n }\n const names = new Set(requirements.map(requirementName));\n const overrides = Object.entries(UV_OVERRIDES).flatMap(\n ([dependency, entries]) =>\n names.has(normalizeDistributionName(dependency)) ? entries : [],\n );\n if (overrides.length === 0) {\n return false;\n }\n\n const existing = toml.tool?.uv?.['override-dependencies'];\n if (existing !== undefined && !Array.isArray(existing)) {\n return false;\n }\n const merged = [...(existing ?? [])];\n const overridden = new Set(merged.map(requirementName));\n for (const entry of overrides) {\n const name = requirementName(entry);\n if (!overridden.has(name)) {\n merged.push(entry);\n overridden.add(name);\n }\n }\n if (merged.length === (existing ?? []).length) {\n return false;\n }\n\n toml.tool ??= {};\n toml.tool.uv ??= {};\n toml.tool.uv['override-dependencies'] = merged;\n tree.write(rootPyprojectPath, stringify(toml as JsonMap));\n return true;\n};\n\n/**\n * Add the strands-agents-tools pillow override to the workspace root\n * pyproject.toml uv override-dependencies.\n *\n * strands-agents-tools caps pillow below the release that fixes its current\n * CVEs, and uv reads `[tool.uv] override-dependencies` only from the workspace\n * root, so the root carries the override (`UV_OVERRIDES`). It applies when\n * any project's `[project].dependencies` names strands-agents-tools. A user\n * override for the same package is kept as written. `uv.lock` is left to the\n * user, as the version sync leaves it, so `nextSteps` asks for `uv sync` when\n * the root changes.\n *\n * Released in v1.0.15 and frozen. Generators stopped writing the override\n * once strands-agents-tools 0.8.11 allowed pillow 13. The override is still\n * satisfiable with 0.8.11 (`pillow<14`), so this migration keeps writing it.\n */\nexport default async function migration(\n tree: Tree,\n): Promise<MigrationReturnObject> {\n const nextSteps: string[] = [];\n\n if (tree.exists('pyproject.toml')) {\n const requirements = [...getProjects(tree).values()].flatMap(({ root }) => {\n const dependencies = (\n tryReadToml(tree, joinPathFragments(root, 'pyproject.toml')) as\n | UVPyprojectToml\n | undefined\n )?.project?.dependencies;\n return Array.isArray(dependencies) ? dependencies : [];\n });\n if (addUvOverrideDependencies(tree, requirements)) {\n nextSteps.push(\n 'The workspace root pyproject.toml now overrides a dependency of strands-agents-tools. Run `uv sync` to update uv.lock.',\n );\n }\n }\n\n await formatFilesInSubtree(tree);\n\n return { nextSteps };\n}\n"],"names":["stringify","getProjects","joinPathFragments","parsePipRequirementsLine","formatFilesInSubtree","normalizeDistributionName","tryReadToml","UV_OVERRIDES","requirementName","requirement","undefined","parsed","type","name","addUvOverrideDependencies","tree","requirements","rootPyprojectPath","toml","names","Set","map","overrides","Object","entries","flatMap","dependency","has","length","existing","tool","uv","Array","isArray","merged","overridden","entry","push","add","write","migration","nextSteps","exists","values","root","dependencies","project"],"mappings":"AAAA;;;CAGC,GACD,SAAuBA,SAAS,QAAQ,cAAc;AACtD,SACEC,WAAW,EACXC,iBAAiB,QAGZ,aAAa;AACpB,SAASC,wBAAwB,QAAQ,sBAAsB;AAC/D,SAASC,oBAAoB,QAAQ,2BAA2B;AAChE,SAASC,yBAAyB,QAAQ,0BAA0B;AAEpE,SAASC,WAAW,QAAQ,yBAAyB;AAErD;;;;;CAKC,GACD,MAAMC,eAA4D;IAChE,wBAAwB;QAAC;KAAiB;AAC5C;AAEA,+EAA+E;AAC/E,oBAAoB;AACpB,MAAMC,kBAAkB,CAACC;IACvB,IAAI,OAAOA,gBAAgB,UAAU;QACnC,OAAOC;IACT;IACA,IAAI;QACF,MAAMC,SAASR,yBAAyBM;QACxC,OAAOE,QAAQC,SAAS,iBAAiBD,QAAQC,SAAS,eACtDP,0BAA0BM,OAAOE,IAAI,IACrCH;IACN,EAAE,OAAM;QACN,OAAOA;IACT;AACF;AAEA;;;;;;;;CAQC,GACD,MAAMI,4BAA4B,CAChCC,MACAC;IAEA,MAAMC,oBAAoB;IAC1B,MAAMC,OAAOZ,YAAYS,MAAME;IAG/B,IAAI,CAACC,MAAM;QACT,OAAO;IACT;IACA,MAAMC,QAAQ,IAAIC,IAAIJ,aAAaK,GAAG,CAACb;IACvC,MAAMc,YAAYC,OAAOC,OAAO,CAACjB,cAAckB,OAAO,CACpD,CAAC,CAACC,YAAYF,QAAQ,GACpBL,MAAMQ,GAAG,CAACtB,0BAA0BqB,eAAeF,UAAU,EAAE;IAEnE,IAAIF,UAAUM,MAAM,KAAK,GAAG;QAC1B,OAAO;IACT;IAEA,MAAMC,WAAWX,KAAKY,IAAI,EAAEC,IAAI,CAAC,wBAAwB;IACzD,IAAIF,aAAanB,aAAa,CAACsB,MAAMC,OAAO,CAACJ,WAAW;QACtD,OAAO;IACT;IACA,MAAMK,SAAS;WAAKL,YAAY,EAAE;KAAE;IACpC,MAAMM,aAAa,IAAIf,IAAIc,OAAOb,GAAG,CAACb;IACtC,KAAK,MAAM4B,SAASd,UAAW;QAC7B,MAAMT,OAAOL,gBAAgB4B;QAC7B,IAAI,CAACD,WAAWR,GAAG,CAACd,OAAO;YACzBqB,OAAOG,IAAI,CAACD;YACZD,WAAWG,GAAG,CAACzB;QACjB;IACF;IACA,IAAIqB,OAAON,MAAM,KAAK,AAACC,CAAAA,YAAY,EAAE,AAAD,EAAGD,MAAM,EAAE;QAC7C,OAAO;IACT;IAEAV,KAAKY,IAAI,KAAK,CAAC;IACfZ,KAAKY,IAAI,CAACC,EAAE,KAAK,CAAC;IAClBb,KAAKY,IAAI,CAACC,EAAE,CAAC,wBAAwB,GAAGG;IACxCnB,KAAKwB,KAAK,CAACtB,mBAAmBjB,UAAUkB;IACxC,OAAO;AACT;AAEA;;;;;;;;;;;;;;;CAeC,GACD,eAAe,eAAesB,UAC5BzB,IAAU;IAEV,MAAM0B,YAAsB,EAAE;IAE9B,IAAI1B,KAAK2B,MAAM,CAAC,mBAAmB;QACjC,MAAM1B,eAAe;eAAIf,YAAYc,MAAM4B,MAAM;SAAG,CAAClB,OAAO,CAAC,CAAC,EAAEmB,IAAI,EAAE;YACpE,MAAMC,eACJvC,YAAYS,MAAMb,kBAAkB0C,MAAM,oBAGzCE,SAASD;YACZ,OAAOb,MAAMC,OAAO,CAACY,gBAAgBA,eAAe,EAAE;QACxD;QACA,IAAI/B,0BAA0BC,MAAMC,eAAe;YACjDyB,UAAUJ,IAAI,CACZ;QAEJ;IACF;IAEA,MAAMjC,qBAAqBW;IAE3B,OAAO;QAAE0B;IAAU;AACrB"}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../packages/nx-plugin/src/migrations/v1.3.1/0001-biome-markdown-yaml-formatter-off/migration.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n getDependencyVersionFromPackageJson,\n type MigrationReturnObject,\n readJson,\n type Tree,\n writeJson,\n} from '@nx/devkit';\nimport { gte, minVersion, validRange } from 'semver';\nimport { formatFilesInSubtree } from '../../../utils/format.js';\nimport { ownedDependencies } from '../../../utils/version-upgrade-migration/owned-dependencies.js';\nimport { syncedTsVersion } from '../../../utils/version-upgrade-migration/sync-vended-versions.js';\n\n/**\n * Turn off Biome's Markdown and YAML formatting in `biome.json`.\n *\n * Biome 2.6 formats Markdown and YAML by default. The vended `format` target\n * runs `biome format {projectRoot}`, so after the upgrade it fails on generated\n * README.md files and the TypeScript Greengrass component's `recipe.yaml`, and\n * `lint` and `build` stop with it.\n *\n * Guardrails:\n * - A workspace without `biome.json` is left alone.\n * - A top-level `markdown` or `yaml` key that is already present is the user's\n * own setting and is kept as it is. Biome 2.5 rejects both keys, so one is\n * only present when the user configured Biome 2.6 themselves.\n * - Missing keys go right after `css`, where the generators place them, or at\n * the end when there is no `css` section.\n * - Idempotent: a second run finds both keys present and changes nothing.\n * - Biome 2.5 rejects both keys and then fails every `format` and `lint`\n * target, so they are added only when the workspace runs Biome 2.6 or later\n * once `nx migrate` finishes. Otherwise `biome.json` is left as it is and a\n * next step says what to add after moving to Biome 2.6.\n */\n\nconst BIOME_CONFIG = 'biome.json';\n\nconst LANGUAGES = ['markdown', 'yaml'] as const;\n\nconst FORMATTER_OFF = { formatter: { enabled: false } };\n\nconst BIOME = '@biomejs/biome';\n\n/** First Biome release that accepts the `markdown` and `yaml` keys. */\nconst MIN_BIOME_VERSION = '2.6.0';\n\n/** Whether every version a semver range allows is Biome 2.6 or later. */\nconst allowsOnlyBiome26 = (specifier: unknown): boolean => {\n if (typeof specifier !== 'string' || validRange(specifier) === null) {\n return false;\n }\n const lowest = minVersion(specifier);\n return lowest !== null && gte(lowest, MIN_BIOME_VERSION);\n};\n\n/**\n * Whether the workspace runs Biome 2.6 or later once `nx migrate` finishes.\n *\n * The version sync runs after this migration in the same `nx migrate`, so the\n * root `package.json` still holds the old Biome here. The check takes the lowest\n * version the declared range (or the catalog entry it references) allows, then\n * the version the sync will move Biome to. A tag, alias or missing declaration\n * counts only when the sync moves it.\n */\nconst runsBiome26AfterMigrate = async (tree: Tree): Promise<boolean> => {\n if (!tree.exists('package.json')) {\n return false;\n }\n const { dependencies, devDependencies } = readJson(tree, 'package.json');\n const declared: unknown = devDependencies?.[BIOME] ?? dependencies?.[BIOME];\n if (declared === undefined) {\n return false;\n }\n const resolved = getDependencyVersionFromPackageJson(\n tree,\n BIOME,\n 'package.json',\n ['devDependencies', 'dependencies'],\n );\n if (allowsOnlyBiome26(resolved)) {\n return true;\n }\n return allowsOnlyBiome26(\n syncedTsVersion(tree, await ownedDependencies(tree), BIOME, declared),\n );\n};\n\nconst SKIPPED_NEXT_STEP =\n 'Biome stays below 2.6 in this workspace, and Biome 2.5 rejects the `markdown` and `yaml` keys, so biome.json was left as it is. ' +\n 'Biome 2.6 formats Markdown and YAML files by default. After you move `@biomejs/biome` to 2.6 or later, add ' +\n '`\"markdown\": { \"formatter\": { \"enabled\": false } }` and `\"yaml\": { \"formatter\": { \"enabled\": false } }` to biome.json, ' +\n 'or the `format` target fails on generated README.md and YAML files.';\n\nexport default async function migration(\n tree: Tree,\n): Promise<MigrationReturnObject> {\n if (!tree.exists(BIOME_CONFIG)) {\n return { nextSteps: [] };\n }\n\n const biome: Record<string, unknown> = readJson(tree, BIOME_CONFIG);\n const missing = LANGUAGES.filter((language) => biome[language] === undefined);\n if (missing.length === 0) {\n return { nextSteps: [] };\n }\n if (!(await runsBiome26AfterMigrate(tree))) {\n return { nextSteps: [SKIPPED_NEXT_STEP] };\n }\n\n const additions = Object.fromEntries(\n missing.map((language) => [language, FORMATTER_OFF]),\n );\n const entries = Object.entries(biome);\n const cssIndex = entries.findIndex(([key]) => key === 'css');\n const insertAt = cssIndex === -1 ? entries.length : cssIndex + 1;\n writeJson(\n tree,\n BIOME_CONFIG,\n Object.fromEntries([\n ...entries.slice(0, insertAt),\n ...Object.entries(additions),\n ...entries.slice(insertAt),\n ]),\n );\n\n await formatFilesInSubtree(tree);\n\n return { nextSteps: [] };\n}\n"],"names":["getDependencyVersionFromPackageJson","readJson","writeJson","gte","minVersion","validRange","formatFilesInSubtree","ownedDependencies","syncedTsVersion","BIOME_CONFIG","LANGUAGES","FORMATTER_OFF","formatter","enabled","BIOME","MIN_BIOME_VERSION","allowsOnlyBiome26","specifier","lowest","runsBiome26AfterMigrate","tree","exists","dependencies","devDependencies","declared","undefined","resolved","SKIPPED_NEXT_STEP","migration","nextSteps","biome","missing","filter","language","length","additions","Object","fromEntries","map","entries","cssIndex","findIndex","key","insertAt","slice"],"mappings":"AAAA;;;CAGC,GACD,SACEA,mCAAmC,EAEnCC,QAAQ,EAERC,SAAS,QACJ,aAAa;AACpB,SAASC,GAAG,EAAEC,UAAU,EAAEC,UAAU,QAAQ,SAAS;AACrD,SAASC,oBAAoB,QAAQ,2BAA2B;AAChE,SAASC,iBAAiB,QAAQ,iEAAiE;AACnG,SAASC,eAAe,QAAQ,mEAAmE;AAEnG;;;;;;;;;;;;;;;;;;;;CAoBC,GAED,MAAMC,eAAe;AAErB,MAAMC,YAAY;IAAC;IAAY;CAAO;AAEtC,MAAMC,gBAAgB;IAAEC,WAAW;QAAEC,SAAS;IAAM;AAAE;AAEtD,MAAMC,QAAQ;AAEd,qEAAqE,GACrE,MAAMC,oBAAoB;AAE1B,uEAAuE,GACvE,MAAMC,oBAAoB,CAACC;IACzB,IAAI,OAAOA,cAAc,YAAYZ,WAAWY,eAAe,MAAM;QACnE,OAAO;IACT;IACA,MAAMC,SAASd,WAAWa;IAC1B,OAAOC,WAAW,QAAQf,IAAIe,QAAQH;AACxC;AAEA;;;;;;;;CAQC,GACD,MAAMI,0BAA0B,OAAOC;IACrC,IAAI,CAACA,KAAKC,MAAM,CAAC,iBAAiB;QAChC,OAAO;IACT;IACA,MAAM,EAAEC,YAAY,EAAEC,eAAe,EAAE,GAAGtB,SAASmB,MAAM;IACzD,MAAMI,WAAoBD,iBAAiB,CAACT,MAAM,IAAIQ,cAAc,CAACR,MAAM;IAC3E,IAAIU,aAAaC,WAAW;QAC1B,OAAO;IACT;IACA,MAAMC,WAAW1B,oCACfoB,MACAN,OACA,gBACA;QAAC;QAAmB;KAAe;IAErC,IAAIE,kBAAkBU,WAAW;QAC/B,OAAO;IACT;IACA,OAAOV,kBACLR,gBAAgBY,MAAM,MAAMb,kBAAkBa,OAAON,OAAOU;AAEhE;AAEA,MAAMG,oBACJ,qIACA,gHACA,4HACA;AAEF,eAAe,eAAeC,UAC5BR,IAAU;IAEV,IAAI,CAACA,KAAKC,MAAM,CAACZ,eAAe;QAC9B,OAAO;YAAEoB,WAAW,EAAE;QAAC;IACzB;IAEA,MAAMC,QAAiC7B,SAASmB,MAAMX;IACtD,MAAMsB,UAAUrB,UAAUsB,MAAM,CAAC,CAACC,WAAaH,KAAK,CAACG,SAAS,KAAKR;IACnE,IAAIM,QAAQG,MAAM,KAAK,GAAG;QACxB,OAAO;YAAEL,WAAW,EAAE;QAAC;IACzB;IACA,IAAI,CAAE,MAAMV,wBAAwBC,OAAQ;QAC1C,OAAO;YAAES,WAAW;gBAACF;aAAkB;QAAC;IAC1C;IAEA,MAAMQ,YAAYC,OAAOC,WAAW,CAClCN,QAAQO,GAAG,CAAC,CAACL,WAAa;YAACA;YAAUtB;SAAc;IAErD,MAAM4B,UAAUH,OAAOG,OAAO,CAACT;IAC/B,MAAMU,WAAWD,QAAQE,SAAS,CAAC,CAAC,CAACC,IAAI,GAAKA,QAAQ;IACtD,MAAMC,WAAWH,aAAa,CAAC,IAAID,QAAQL,MAAM,GAAGM,WAAW;IAC/DtC,UACEkB,MACAX,cACA2B,OAAOC,WAAW,CAAC;WACdE,QAAQK,KAAK,CAAC,GAAGD;WACjBP,OAAOG,OAAO,CAACJ;WACfI,QAAQK,KAAK,CAACD;KAClB;IAGH,MAAMrC,qBAAqBc;IAE3B,OAAO;QAAES,WAAW,EAAE;IAAC;AACzB"}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../packages/nx-plugin/src/migrations/v1.3.2/0001-py-agentcore-launcher/migration.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { basename } from 'node:path';\nimport {\n getProjects,\n joinPathFragments,\n type MigrationReturnObject,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { PY_AGENT_GENERATOR_INFO } from '../../../py/agent/generator.js';\nimport { PY_MCP_SERVER_GENERATOR_INFO } from '../../../py/mcp-server/generator.js';\nimport { applyGritQL, matchGritQL } from '../../../utils/ast.js';\nimport { formatFilesInSubtree } from '../../../utils/format.js';\nimport { kebabCase } from '../../../utils/names.js';\nimport type { ComponentMetadata } from '../../../utils/nx.js';\n\nconst TERRAFORM_RUNTIME =\n 'packages/common/terraform/src/core/agent-core-code/runtime.tf';\nconst PYTHON_AGENT_CORE_LAUNCHER = 'agentcore_launcher.py';\nconst launcher = `\\\nimport sys\nfrom pathlib import Path\n\nfrom opentelemetry.instrumentation.auto_instrumentation import run\n\nif __name__ == \"__main__\":\n sys.argv = [\n \"opentelemetry-instrument\",\n sys.executable,\n str(Path(__file__).with_name(\"main.py\")),\n *sys.argv[1:],\n ]\n run()\n`;\nconst terraformEntry =\n 'entry_point = var.code_entry_point == \"agentcore_launcher.py\" ? [var.code_entry_point] : [\"opentelemetry-instrument\", var.code_entry_point]';\nconst oldTerraformEntry =\n 'entry_point = [\"opentelemetry-instrument\", var.code_entry_point]';\nconst hcl = (pattern: string) => `language hcl\\n${pattern}`;\nconst terraformInput = (entryPoint: string) =>\n `\\`module \"agent_core_runtime\" { $body }\\` where { $body <: contains \\`code_runtime = $runtime\\`, $runtime <: r\".*PYTHON_.*\", $body <: contains \\`code_entry_point = \"${entryPoint}\"\\` }`;\nconst cdkInput = (entryPoint: string) =>\n `\\`AgentRuntimeArtifact.fromCodeAsset({ $props })\\` where { $props <: contains \\`runtime: AgentCoreRuntime.$runtime\\`, $runtime <: r\"PYTHON_.*\", $props <: contains \\`entrypoint: ${entryPoint}\\` }`;\n\n/** Add the interpreter-safe launcher without changing the user's main.py or application. */\nexport default async function migration(\n tree: Tree,\n): Promise<MigrationReturnObject> {\n const nextSteps: string[] = [];\n if (\n tree.exists(TERRAFORM_RUNTIME) &&\n (await matchGritQL(\n tree,\n TERRAFORM_RUNTIME,\n hcl(`\\`${oldTerraformEntry}\\``),\n ))\n ) {\n await applyGritQL(\n tree,\n TERRAFORM_RUNTIME,\n hcl(`\\`${oldTerraformEntry}\\` => \\`${terraformEntry}\\``),\n );\n }\n const coreMigrated =\n tree.exists(TERRAFORM_RUNTIME) &&\n (await matchGritQL(tree, TERRAFORM_RUNTIME, hcl(`\\`${terraformEntry}\\``)));\n for (const project of getProjects(tree).values()) {\n const components: ComponentMetadata[] = project.metadata?.components ?? [];\n let changed = false;\n for (const component of components) {\n const agent = component.generator === PY_AGENT_GENERATOR_INFO.id;\n if (\n (!agent && component.generator !== PY_MCP_SERVER_GENERATOR_INFO.id) ||\n component.infra !== 'agentcore'\n ) {\n continue;\n }\n const terraform = component.iac === 'terraform';\n const targetName = `${component.name}-package`;\n const target = project.targets?.[targetName];\n const name = kebabCase(component.rc ?? '');\n const packageDir = joinPathFragments(\n project.root,\n 'package',\n basename(component.path ?? ''),\n );\n const outputDir = joinPathFragments(\n 'dist',\n project.root,\n 'package',\n name,\n );\n const launcherPath = joinPathFragments(\n packageDir,\n PYTHON_AGENT_CORE_LAUNCHER,\n );\n const copyLauncher = `shx cp ${launcherPath} ${outputDir}/${PYTHON_AGENT_CORE_LAUNCHER}`;\n const commands = target?.options?.commands;\n const expectedCommands = [\n `shx rm -rf ${outputDir}`,\n `shx mkdir -p ${outputDir}`,\n `shx cp -R dist/${project.root}/bundle-arm/. ${outputDir}`,\n `shx cp -R ${project.sourceRoot}/. ${outputDir}/${basename(project.sourceRoot ?? '')}`,\n `shx cp ${packageDir}/main.py ${outputDir}/main.py`,\n ];\n const category = agent ? 'agents' : 'mcp-servers';\n const infraPath = terraform\n ? `packages/common/terraform/src/app/${category}/${name}/${name}.tf`\n : `packages/common/constructs/src/app/${category}/${name}/${name}.ts`;\n const report = () =>\n nextSteps.push(\n `${project.name}/${component.name}: review customized packaging or ${infraPath}; add ${PYTHON_AGENT_CORE_LAUNCHER} calling OpenTelemetry run() with sys.executable and main.py, copy it to the package root, and select it as this Python runtime's code entrypoint.`,\n );\n if (\n !component.path ||\n !component.rc ||\n !['cdk', 'terraform'].includes(component.iac) ||\n target?.executor !== 'nx:run-commands' ||\n target.options?.parallel !== false ||\n !Array.isArray(commands) ||\n ![5, 6].includes(commands.length) ||\n expectedCommands.some(\n (command, index) => commands[index] !== command,\n ) ||\n (commands.length === 6 && commands[5] !== copyLauncher) ||\n !tree.exists(`${packageDir}/main.py`) ||\n !tree.exists(infraPath) ||\n (tree.exists(launcherPath) &&\n tree.read(launcherPath, 'utf-8') !== launcher) ||\n (terraform && !tree.exists(TERRAFORM_RUNTIME))\n ) {\n report();\n continue;\n }\n const oldEntry = terraform\n ? hcl(terraformInput('main.py'))\n : cdkInput(\"['opentelemetry-instrument', 'main.py']\");\n const newEntry = terraform\n ? hcl(terraformInput(PYTHON_AGENT_CORE_LAUNCHER))\n : cdkInput(\"['agentcore_launcher.py']\");\n const alreadyMigrated = await matchGritQL(tree, infraPath, newEntry);\n if (\n (!alreadyMigrated && !(await matchGritQL(tree, infraPath, oldEntry))) ||\n (terraform && !coreMigrated)\n ) {\n report();\n continue;\n }\n if (!tree.exists(launcherPath)) tree.write(launcherPath, launcher);\n if (commands.length === 5) {\n commands.push(copyLauncher);\n changed = true;\n }\n if (!alreadyMigrated) {\n await applyGritQL(\n tree,\n infraPath,\n terraform\n ? hcl(\n '`module \"agent_core_runtime\" { $body }` where { $body <: contains `code_runtime = $runtime`, $runtime <: r\".*PYTHON_.*\", $body <: contains bubble `code_entry_point = \"main.py\"` => `code_entry_point = \"agentcore_launcher.py\"` }',\n )\n : \"`AgentRuntimeArtifact.fromCodeAsset({ $props })` where { $props <: contains `runtime: AgentCoreRuntime.$runtime`, $runtime <: r\\\"PYTHON_.*\\\", $props <: contains bubble `entrypoint: ['opentelemetry-instrument', 'main.py']` => `entrypoint: ['agentcore_launcher.py']` }\",\n );\n }\n }\n if (changed) updateProjectConfiguration(tree, project.name, project);\n }\n await formatFilesInSubtree(tree);\n return { nextSteps };\n}\n"],"names":["basename","getProjects","joinPathFragments","updateProjectConfiguration","PY_AGENT_GENERATOR_INFO","PY_MCP_SERVER_GENERATOR_INFO","applyGritQL","matchGritQL","formatFilesInSubtree","kebabCase","TERRAFORM_RUNTIME","PYTHON_AGENT_CORE_LAUNCHER","launcher","terraformEntry","oldTerraformEntry","hcl","pattern","terraformInput","entryPoint","cdkInput","migration","tree","nextSteps","exists","coreMigrated","project","values","components","metadata","changed","component","agent","generator","id","infra","terraform","iac","targetName","name","target","targets","rc","packageDir","root","path","outputDir","launcherPath","copyLauncher","commands","options","expectedCommands","sourceRoot","category","infraPath","report","push","includes","executor","parallel","Array","isArray","length","some","command","index","read","oldEntry","newEntry","alreadyMigrated","write"],"mappings":"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"}
@@ -259,7 +259,7 @@ export default {
259
259
 
260
260
  exports[`preset generator > should run successfully > biome.json 1`] = `
261
261
  "{
262
- "$schema": "https://biomejs.dev/schemas/2.6.3/schema.json",
262
+ "$schema": "https://biomejs.dev/schemas/2.6.4/schema.json",
263
263
  "root": true,
264
264
  "formatter": {
265
265
  "enabled": true,
@@ -438,7 +438,7 @@ catalog:
438
438
  '@nx/js': 23.3.1
439
439
  '@nx/workspace': 23.3.1
440
440
  typescript: ~6.0.3
441
- '@biomejs/biome': 2.6.3
441
+ '@biomejs/biome': 2.6.4
442
442
  '@aws/nx-plugin': ^0.0.0
443
443
  '@aws/nx-plugin-mcp': ^0.0.0
444
444
  "
@@ -763,14 +763,14 @@ name = "proj.test_project"
763
763
  version = "0.1.0"
764
764
  dependencies = [
765
765
  "proj-agent-connection",
766
- "aws-lambda-powertools==3.37.0",
767
- "aws-opentelemetry-distro==0.21.0",
768
- "bedrock-agentcore==1.25.0",
769
- "boto3==1.43.118",
766
+ "aws-lambda-powertools==3.38.0",
767
+ "aws-opentelemetry-distro==0.22.0",
768
+ "bedrock-agentcore==1.25.2",
769
+ "boto3==1.43.123",
770
770
  "fastapi==0.162.0",
771
771
  "mcp==1.28.1",
772
- "strands-agents==1.62.0",
773
- "strands-agents-tools==0.8.10",
772
+ "strands-agents==1.63.0",
773
+ "strands-agents-tools==0.8.11",
774
774
  "uvicorn==0.54.0"
775
775
  ]
776
776
 
@@ -701,16 +701,16 @@ name = "proj.test_project"
701
701
  version = "0.1.0"
702
702
  dependencies = [
703
703
  "proj-agent-connection",
704
- "aws-lambda-powertools==3.37.0",
705
- "aws-opentelemetry-distro==0.21.0",
706
- "bedrock-agentcore==1.25.0",
707
- "boto3==1.43.118",
704
+ "aws-lambda-powertools==3.38.0",
705
+ "aws-opentelemetry-distro==0.22.0",
706
+ "bedrock-agentcore==1.25.2",
707
+ "boto3==1.43.123",
708
708
  "fastapi==0.162.0",
709
709
  "mcp==1.28.1",
710
710
  "langchain==1.4.7",
711
- "langchain-aws==1.9.0",
712
- "langgraph==1.2.17",
713
- "langgraph-checkpoint-sqlite==3.1.2",
711
+ "langchain-aws==1.9.1",
712
+ "langgraph==1.2.19",
713
+ "langgraph-checkpoint-sqlite==3.1.3",
714
714
  "aiosqlite==0.22.1",
715
715
  "ag-ui-protocol==0.1.22",
716
716
  "ag-ui-langgraph==0.0.47",
@@ -5,7 +5,7 @@ exports[`py#agent generator > should create DynamoDB checkpoint table and S3 off
5
5
  required_providers {
6
6
  aws = {
7
7
  source = "hashicorp/aws"
8
- version = "6.70.0"
8
+ version = "6.71.0"
9
9
  }
10
10
  random = {
11
11
  source = "hashicorp/random"
@@ -381,7 +381,7 @@ exports[`py#agent generator > should match snapshot for Terraform generated file
381
381
  required_providers {
382
382
  aws = {
383
383
  source = "hashicorp/aws"
384
- version = "6.70.0"
384
+ version = "6.71.0"
385
385
  }
386
386
  random = {
387
387
  source = "hashicorp/random"
@@ -704,7 +704,7 @@ exports[`py#agent generator > should match snapshot for Terraform generated file
704
704
  required_providers {
705
705
  aws = {
706
706
  source = "hashicorp/aws"
707
- version = "6.70.0"
707
+ version = "6.71.0"
708
708
  }
709
709
  null = {
710
710
  source = "hashicorp/null"
@@ -1063,7 +1063,7 @@ resource "null_resource" "runtime_ready" {
1063
1063
 
1064
1064
  provisioner "local-exec" {
1065
1065
  command = <<-EOT
1066
- uv run --with boto3==1.43.118 python -c "
1066
+ uv run --with boto3==1.43.123 python -c "
1067
1067
  import boto3
1068
1068
  import json
1069
1069
  import os
@@ -559,7 +559,7 @@ exports[`py#agent#guardrails generator > framework langchain > protocol a2a > sh
559
559
  required_providers {
560
560
  aws = {
561
561
  source = "hashicorp/aws"
562
- version = "6.70.0"
562
+ version = "6.71.0"
563
563
  }
564
564
  random = {
565
565
  source = "hashicorp/random"
@@ -1242,7 +1242,7 @@ exports[`py#agent#guardrails generator > framework langchain > protocol ag-ui >
1242
1242
  required_providers {
1243
1243
  aws = {
1244
1244
  source = "hashicorp/aws"
1245
- version = "6.70.0"
1245
+ version = "6.71.0"
1246
1246
  }
1247
1247
  random = {
1248
1248
  source = "hashicorp/random"
@@ -1925,7 +1925,7 @@ exports[`py#agent#guardrails generator > framework langchain > protocol http > s
1925
1925
  required_providers {
1926
1926
  aws = {
1927
1927
  source = "hashicorp/aws"
1928
- version = "6.70.0"
1928
+ version = "6.71.0"
1929
1929
  }
1930
1930
  random = {
1931
1931
  source = "hashicorp/random"
@@ -2514,7 +2514,7 @@ exports[`py#agent#guardrails generator > framework strands > protocol a2a > shou
2514
2514
  required_providers {
2515
2515
  aws = {
2516
2516
  source = "hashicorp/aws"
2517
- version = "6.70.0"
2517
+ version = "6.71.0"
2518
2518
  }
2519
2519
  random = {
2520
2520
  source = "hashicorp/random"
@@ -3099,7 +3099,7 @@ exports[`py#agent#guardrails generator > framework strands > protocol ag-ui > sh
3099
3099
  required_providers {
3100
3100
  aws = {
3101
3101
  source = "hashicorp/aws"
3102
- version = "6.70.0"
3102
+ version = "6.71.0"
3103
3103
  }
3104
3104
  random = {
3105
3105
  source = "hashicorp/random"
@@ -3688,7 +3688,7 @@ exports[`py#agent#guardrails generator > framework strands > protocol http > sho
3688
3688
  required_providers {
3689
3689
  aws = {
3690
3690
  source = "hashicorp/aws"
3691
- version = "6.70.0"
3691
+ version = "6.71.0"
3692
3692
  }
3693
3693
  random = {
3694
3694
  source = "hashicorp/random"
@@ -35,7 +35,7 @@ exports[`py#dynamodb generator > should generate terraform modules when iac is t
35
35
  required_providers {
36
36
  aws = {
37
37
  source = "hashicorp/aws"
38
- version = "6.70.0"
38
+ version = "6.71.0"
39
39
  }
40
40
  }
41
41
  }
@@ -232,7 +232,7 @@ exports[`py#dynamodb generator > should generate terraform modules when iac is t
232
232
  required_providers {
233
233
  aws = {
234
234
  source = "hashicorp/aws"
235
- version = "6.70.0"
235
+ version = "6.71.0"
236
236
  }
237
237
  random = {
238
238
  source = "hashicorp/random"
@@ -11,7 +11,7 @@ terraform {
11
11
  required_providers {
12
12
  aws = {
13
13
  source = "hashicorp/aws"
14
- version = "6.70.0"
14
+ version = "6.71.0"
15
15
  }
16
16
  }
17
17
  }
@@ -262,7 +262,7 @@ output "api_log_group_arn" {
262
262
  }
263
263
  aws = {
264
264
  source = "hashicorp/aws"
265
- version = "6.70.0"
265
+ version = "6.71.0"
266
266
  }
267
267
  random = {
268
268
  source = "hashicorp/random"
@@ -908,7 +908,7 @@ terraform {
908
908
  required_providers {
909
909
  aws = {
910
910
  source = "hashicorp/aws"
911
- version = "6.70.0"
911
+ version = "6.71.0"
912
912
  }
913
913
  }
914
914
  }
@@ -1159,7 +1159,7 @@ output "api_log_group_arn" {
1159
1159
  }
1160
1160
  aws = {
1161
1161
  source = "hashicorp/aws"
1162
- version = "6.70.0"
1162
+ version = "6.71.0"
1163
1163
  }
1164
1164
  random = {
1165
1165
  source = "hashicorp/random"
@@ -1878,7 +1878,7 @@ terraform {
1878
1878
  required_providers {
1879
1879
  aws = {
1880
1880
  source = "hashicorp/aws"
1881
- version = "6.70.0"
1881
+ version = "6.71.0"
1882
1882
  }
1883
1883
  }
1884
1884
  }
@@ -2129,7 +2129,7 @@ output "api_log_group_arn" {
2129
2129
  }
2130
2130
  aws = {
2131
2131
  source = "hashicorp/aws"
2132
- version = "6.70.0"
2132
+ version = "6.71.0"
2133
2133
  }
2134
2134
  random = {
2135
2135
  source = "hashicorp/random"
@@ -2752,7 +2752,7 @@ terraform {
2752
2752
  required_providers {
2753
2753
  aws = {
2754
2754
  source = "hashicorp/aws"
2755
- version = "6.70.0"
2755
+ version = "6.71.0"
2756
2756
  }
2757
2757
  random = {
2758
2758
  source = "hashicorp/random"
@@ -3065,7 +3065,7 @@ output "waf_web_acl_arn" {
3065
3065
  }
3066
3066
  aws = {
3067
3067
  source = "hashicorp/aws"
3068
- version = "6.70.0"
3068
+ version = "6.71.0"
3069
3069
  }
3070
3070
  random = {
3071
3071
  source = "hashicorp/random"
@@ -4162,7 +4162,7 @@ terraform {
4162
4162
  required_providers {
4163
4163
  aws = {
4164
4164
  source = "hashicorp/aws"
4165
- version = "6.70.0"
4165
+ version = "6.71.0"
4166
4166
  }
4167
4167
  random = {
4168
4168
  source = "hashicorp/random"
@@ -4475,7 +4475,7 @@ output "waf_web_acl_arn" {
4475
4475
  }
4476
4476
  aws = {
4477
4477
  source = "hashicorp/aws"
4478
- version = "6.70.0"
4478
+ version = "6.71.0"
4479
4479
  }
4480
4480
  random = {
4481
4481
  source = "hashicorp/random"
@@ -5561,7 +5561,7 @@ terraform {
5561
5561
  required_providers {
5562
5562
  aws = {
5563
5563
  source = "hashicorp/aws"
5564
- version = "6.70.0"
5564
+ version = "6.71.0"
5565
5565
  }
5566
5566
  random = {
5567
5567
  source = "hashicorp/random"
@@ -5874,7 +5874,7 @@ output "waf_web_acl_arn" {
5874
5874
  }
5875
5875
  aws = {
5876
5876
  source = "hashicorp/aws"
5877
- version = "6.70.0"
5877
+ version = "6.71.0"
5878
5878
  }
5879
5879
  random = {
5880
5880
  source = "hashicorp/random"
@@ -71,7 +71,7 @@ exports[`lambda-handler project generator > terraform iac > should generate terr
71
71
  required_providers {
72
72
  aws = {
73
73
  source = "hashicorp/aws"
74
- version = "6.70.0"
74
+ version = "6.71.0"
75
75
  }
76
76
  archive = {
77
77
  source = "hashicorp/archive"
@@ -256,7 +256,7 @@ exports[`lambda-handler project generator > terraform iac > should match snapsho
256
256
  required_providers {
257
257
  aws = {
258
258
  source = "hashicorp/aws"
259
- version = "6.70.0"
259
+ version = "6.71.0"
260
260
  }
261
261
  archive = {
262
262
  source = "hashicorp/archive"