Skip to content

feat(project): add deploy command contract - #2056

Merged
notgitika merged 7 commits into
refactorfrom
feat/project-deploy-contract
Aug 24, 2026
Merged

feat(project): add deploy command contract#2056
notgitika merged 7 commits into
refactorfrom
feat/project-deploy-contract

Conversation

@notgitika

@notgitikanotgitika commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Summary

  • add the project deploy handler and --target contract
  • define deployment target validation and deployment result types
  • synchronize the closed AgentCore region enum with the current supported-region list
  • wire manager/backend deploy interfaces with an intentionally unimplemented CDK operation

Stack

This is PR 2 of 4 decomposing #2001. The command remains nonfunctional until the final PR. Review and merge bottom-up.

  1. refactor(project): move build behind a project backend #2055 - backend build boundary
  2. feat(project): add deploy command contract #2056 - deploy command contract (this PR)
  3. feat(project): add CDK Toolkit adapter #2057 - CDK Toolkit adapter
  4. feat(project): implement safe CDK deployment #2058 - safe deployment implementation

typecheck, lint, format, test all pass

@github-actionsgithub-actionsBot added the size/m PR size: M label Aug 20, 2026
@github-actionsgithub-actionsBot added agentcore-harness-reviewing AgentCore Harness review in progress size/m PR size: M and removed size/m PR size: M agentcore-harness-reviewing AgentCore Harness review in progress labels Aug 20, 2026
@notgitika
notgitika marked this pull request as ready for review August 20, 2026 04:10
@notgitika
notgitika marked this pull request as draft August 20, 2026 04:19
@github-actionsgithub-actionsBot added size/m PR size: M and removed size/m PR size: M labels Aug 20, 2026
@github-actionsgithub-actionsBot added size/m PR size: M and removed size/m PR size: M labels Aug 20, 2026
@notgitika
notgitika marked this pull request as ready for review August 20, 2026 04:24
@github-actionsgithub-actionsBot added size/m PR size: M and removed size/m PR size: M labels Aug 20, 2026

@HweinstockHweinstock left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

small questions, but approach lgtm. I can take another look once the dependent changes are merged.

Comment threadsrc/handlers/project/project.test.ts
Comment threadsrc/handlers/project/types.ts Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Base automatically changed from feat/project-backend-build to refactorAugust 20, 2026 16:07
@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from 81c98a5 to e485e02CompareAugust 20, 2026 17:06
@codecov-commenter

codecov-commenter commented Aug 20, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.25%. Comparing base (38c30ae) to head (8bee57f).

Additional details and impacted files
@@ Coverage Diff @@## refactor #2056 +/- ##
============================================
+ Coverage 97.24% 97.25% +0.01% 
============================================
Files 396 397 +1 Lines 24019 24125 +106 ============================================
+ Hits 23357 23463 +106 
Misses 662 662 

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from 53bd2b5 to 78a8644CompareAugust 21, 2026 16:16
Comment threadsrc/projectSchemas/aws-targets.ts Outdated
@Hweinstock

Copy link
Copy Markdown
Contributor

I think there are some merge conflicts: src/handlers/project/project.test.ts.

@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from 78a8644 to f3c53bfCompareAugust 21, 2026 17:40
Comment threadsrc/core/project/manager.tsx
@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from b9422f7 to e5af2c4CompareAugust 21, 2026 18:21
nborges-aws
nborges-aws previously approved these changes Aug 21, 2026

@nborges-awsnborges-aws left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM thanks for fixes!

@HweinstockHweinstock left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

few comments on testing and some nits, but I like the direction!

Comment threadsrc/core/project/manager.tsx
Comment threadsrc/io/json.ts
throw new DeserializationError(filePath, { cause: parseResult.error });
throw new DeserializationError(filePath, {
cause: parseResult.error,
details: z.prettifyError(parseResult.error),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

haha I refreshed and you implemented exactly what I was thinking, crazy!

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧙🏼

Comment threadsrc/testing/TestCoreClient.tsx Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Comment threadsrc/handlers/project/deploy/index.ts Outdated
The test assembled its own ValueContext with ProjectKey, JsonKey and a stub
JsonRenderer, which re-implemented what createRootHandler installs — so it
could pass while the real wiring was wrong. It now goes through
createRootHandler with the fake manager injected via TestCoreClient, the same
pattern project.test.ts and add/harness/index.test.ts use, exercising the real
--json group flag, the real JSON renderer and the real withProject wrap.
Verified by unwrapping deploy from withProject: both tests now fail, where the
hand-built context passed.
No fixture setup needed since the fake's resolve() returns a project.
Also drops the CloudFormation wording from DeployResult.outputs. The shape is
already backend-neutral; only the doc comment implied CDK.
Resolve the named aws-targets.json entry in FsProjectManager and pass the
resolved account and region to the backend, mirroring build(). deploy()
previously threw NotImplementedError before dispatching, which left
CdkBackend.deploy unreachable and duplicated the same message in two places;
the backend is now the single place that reports deployment as unimplemented.
Narrow the TestCoreClient seam from a whole-manager override to a single
backend override. Handler tests keep the real FsProjectManager, so target
resolution and withProject run for real and only the deploy boundary is faked.
Match the name pattern the schema on main already enforces. The CDK
normalizes underscores to hyphens, so accepting them here would let a
target be written one way and deployed under another.
The root handler prints only `error.message`, so the zod detail that
`FsReadWriteJson.read` put in `cause` never reached the user: a typo'd
region or a duplicated target name in a hand-edited file produced only
`Failed to deserialize file at "<path>"`, naming the file but not the
field.
DeserializationError now requires a `details` string and appends it to
the message, and json.ts passes the prettified zod error (or the parse
error) through. Fixing it in the IO layer rather than catching in
`ProjectManager.deploy` covers every hand-edited file at once. Making
`details` required rather than optional keeps the opaque message from
being reintroduced.
Tested at the handler level, since the schema tests pass in isolation
without proving the detail reaches stderr.
- Inline runDeploy and renderResult. Neither is reused; the manual .next()
loop only exists because the outputs are the generator's return value,
which `for await` discards, so that reason is now a comment where the
loop lives. `build` already drains its generator inline.
- Rename the test factory `harness` to `testDeployCommand`. "Harness" is a
real AgentCore resource in this codebase, and the name matches the
existing `testMemoryCommand` convention.
- Collapse inProjectWithRawTargets/inProjectWithTargets into one helper
that takes the file contents. Callers pass JSON.stringify(...), so the
malformed-JSON case is just another call rather than a second function.
- Drop the TestCoreClientOptions comment; the Partial already says it.
- Drop the comment above the aws-targets.json tests describing the opaque
message, which no longer exists now that DeserializationError requires
`details`. The describe name carries the intent.
@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from e8aabe3 to 8bee57fCompareAugust 24, 2026 14:46

@tejaskashtejaskash left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All actionable review comments are addressed. I verified the final head against current refactor and reran the full local test, typecheck, lint, and formatting checks.

@notgitika
notgitika merged commit fee25e2 into refactorAug 24, 2026
11 checks passed
@notgitika
notgitika deleted the feat/project-deploy-contract branch August 24, 2026 16:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/mPR size: M

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@notgitika@codecov-commenter@Hweinstock@tejaskash@nborges-aws
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
feat(project): add deploy command contract by notgitika · Pull Request #2056 · aws/agentcore-cli · GitHub
Skip to content

feat(project): add deploy command contract - #2056

Merged
notgitika merged 7 commits into
refactorfrom
feat/project-deploy-contract
Aug 24, 2026
Merged

feat(project): add deploy command contract#2056
notgitika merged 7 commits into
refactorfrom
feat/project-deploy-contract

Conversation

@notgitika

@notgitikanotgitika commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Summary

  • add the project deploy handler and --target contract
  • define deployment target validation and deployment result types
  • synchronize the closed AgentCore region enum with the current supported-region list
  • wire manager/backend deploy interfaces with an intentionally unimplemented CDK operation

Stack

This is PR 2 of 4 decomposing #2001. The command remains nonfunctional until the final PR. Review and merge bottom-up.

  1. refactor(project): move build behind a project backend #2055 - backend build boundary
  2. feat(project): add deploy command contract #2056 - deploy command contract (this PR)
  3. feat(project): add CDK Toolkit adapter #2057 - CDK Toolkit adapter
  4. feat(project): implement safe CDK deployment #2058 - safe deployment implementation

typecheck, lint, format, test all pass

@github-actionsgithub-actionsBot added the size/m PR size: M label Aug 20, 2026
@github-actionsgithub-actionsBot added agentcore-harness-reviewing AgentCore Harness review in progress size/m PR size: M and removed size/m PR size: M agentcore-harness-reviewing AgentCore Harness review in progress labels Aug 20, 2026
@notgitika
notgitika marked this pull request as ready for review August 20, 2026 04:10
@notgitika
notgitika marked this pull request as draft August 20, 2026 04:19
@github-actionsgithub-actionsBot added size/m PR size: M and removed size/m PR size: M labels Aug 20, 2026
@github-actionsgithub-actionsBot added size/m PR size: M and removed size/m PR size: M labels Aug 20, 2026
@notgitika
notgitika marked this pull request as ready for review August 20, 2026 04:24
@github-actionsgithub-actionsBot added size/m PR size: M and removed size/m PR size: M labels Aug 20, 2026

@HweinstockHweinstock left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

small questions, but approach lgtm. I can take another look once the dependent changes are merged.

Comment threadsrc/handlers/project/project.test.ts
Comment threadsrc/handlers/project/types.ts Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Base automatically changed from feat/project-backend-build to refactorAugust 20, 2026 16:07
@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from 81c98a5 to e485e02CompareAugust 20, 2026 17:06
@codecov-commenter

codecov-commenter commented Aug 20, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.25%. Comparing base (38c30ae) to head (8bee57f).

Additional details and impacted files
@@ Coverage Diff @@## refactor #2056 +/- ##
============================================
+ Coverage 97.24% 97.25% +0.01% 
============================================
Files 396 397 +1 Lines 24019 24125 +106 ============================================
+ Hits 23357 23463 +106 
Misses 662 662 

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from 53bd2b5 to 78a8644CompareAugust 21, 2026 16:16
Comment threadsrc/projectSchemas/aws-targets.ts Outdated
@Hweinstock

Copy link
Copy Markdown
Contributor

I think there are some merge conflicts: src/handlers/project/project.test.ts.

@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from 78a8644 to f3c53bfCompareAugust 21, 2026 17:40
Comment threadsrc/core/project/manager.tsx
@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from b9422f7 to e5af2c4CompareAugust 21, 2026 18:21
nborges-aws
nborges-aws previously approved these changes Aug 21, 2026

@nborges-awsnborges-aws left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM thanks for fixes!

@HweinstockHweinstock left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

few comments on testing and some nits, but I like the direction!

Comment threadsrc/core/project/manager.tsx
Comment threadsrc/io/json.ts
throw new DeserializationError(filePath, { cause: parseResult.error });
throw new DeserializationError(filePath, {
cause: parseResult.error,
details: z.prettifyError(parseResult.error),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

haha I refreshed and you implemented exactly what I was thinking, crazy!

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧙🏼

Comment threadsrc/testing/TestCoreClient.tsx Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Comment threadsrc/handlers/project/deploy/index.ts Outdated
The test assembled its own ValueContext with ProjectKey, JsonKey and a stub
JsonRenderer, which re-implemented what createRootHandler installs — so it
could pass while the real wiring was wrong. It now goes through
createRootHandler with the fake manager injected via TestCoreClient, the same
pattern project.test.ts and add/harness/index.test.ts use, exercising the real
--json group flag, the real JSON renderer and the real withProject wrap.
Verified by unwrapping deploy from withProject: both tests now fail, where the
hand-built context passed.
No fixture setup needed since the fake's resolve() returns a project.
Also drops the CloudFormation wording from DeployResult.outputs. The shape is
already backend-neutral; only the doc comment implied CDK.
Resolve the named aws-targets.json entry in FsProjectManager and pass the
resolved account and region to the backend, mirroring build(). deploy()
previously threw NotImplementedError before dispatching, which left
CdkBackend.deploy unreachable and duplicated the same message in two places;
the backend is now the single place that reports deployment as unimplemented.
Narrow the TestCoreClient seam from a whole-manager override to a single
backend override. Handler tests keep the real FsProjectManager, so target
resolution and withProject run for real and only the deploy boundary is faked.
Match the name pattern the schema on main already enforces. The CDK
normalizes underscores to hyphens, so accepting them here would let a
target be written one way and deployed under another.
The root handler prints only `error.message`, so the zod detail that
`FsReadWriteJson.read` put in `cause` never reached the user: a typo'd
region or a duplicated target name in a hand-edited file produced only
`Failed to deserialize file at "<path>"`, naming the file but not the
field.
DeserializationError now requires a `details` string and appends it to
the message, and json.ts passes the prettified zod error (or the parse
error) through. Fixing it in the IO layer rather than catching in
`ProjectManager.deploy` covers every hand-edited file at once. Making
`details` required rather than optional keeps the opaque message from
being reintroduced.
Tested at the handler level, since the schema tests pass in isolation
without proving the detail reaches stderr.
- Inline runDeploy and renderResult. Neither is reused; the manual .next()
loop only exists because the outputs are the generator's return value,
which `for await` discards, so that reason is now a comment where the
loop lives. `build` already drains its generator inline.
- Rename the test factory `harness` to `testDeployCommand`. "Harness" is a
real AgentCore resource in this codebase, and the name matches the
existing `testMemoryCommand` convention.
- Collapse inProjectWithRawTargets/inProjectWithTargets into one helper
that takes the file contents. Callers pass JSON.stringify(...), so the
malformed-JSON case is just another call rather than a second function.
- Drop the TestCoreClientOptions comment; the Partial already says it.
- Drop the comment above the aws-targets.json tests describing the opaque
message, which no longer exists now that DeserializationError requires
`details`. The describe name carries the intent.
@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from e8aabe3 to 8bee57fCompareAugust 24, 2026 14:46

@tejaskashtejaskash left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All actionable review comments are addressed. I verified the final head against current refactor and reran the full local test, typecheck, lint, and formatting checks.

@notgitika
notgitika merged commit fee25e2 into refactorAug 24, 2026
11 checks passed
@notgitika
notgitika deleted the feat/project-deploy-contract branch August 24, 2026 16:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/mPR size: M

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@notgitika@codecov-commenter@Hweinstock@tejaskash@nborges-aws
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(project): add deploy command contract by notgitika · Pull Request #2056 · aws/agentcore-cli · GitHub
Skip to content

feat(project): add deploy command contract - #2056

Merged
notgitika merged 7 commits into
refactorfrom
feat/project-deploy-contract
Aug 24, 2026
Merged

feat(project): add deploy command contract#2056
notgitika merged 7 commits into
refactorfrom
feat/project-deploy-contract

Conversation

@notgitika

@notgitikanotgitika commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Summary

  • add the project deploy handler and --target contract
  • define deployment target validation and deployment result types
  • synchronize the closed AgentCore region enum with the current supported-region list
  • wire manager/backend deploy interfaces with an intentionally unimplemented CDK operation

Stack

This is PR 2 of 4 decomposing #2001. The command remains nonfunctional until the final PR. Review and merge bottom-up.

  1. refactor(project): move build behind a project backend #2055 - backend build boundary
  2. feat(project): add deploy command contract #2056 - deploy command contract (this PR)
  3. feat(project): add CDK Toolkit adapter #2057 - CDK Toolkit adapter
  4. feat(project): implement safe CDK deployment #2058 - safe deployment implementation

typecheck, lint, format, test all pass

@github-actionsgithub-actionsBot added the size/m PR size: M label Aug 20, 2026
@github-actionsgithub-actionsBot added agentcore-harness-reviewing AgentCore Harness review in progress size/m PR size: M and removed size/m PR size: M agentcore-harness-reviewing AgentCore Harness review in progress labels Aug 20, 2026
@notgitika
notgitika marked this pull request as ready for review August 20, 2026 04:10
@notgitika
notgitika marked this pull request as draft August 20, 2026 04:19
@github-actionsgithub-actionsBot added size/m PR size: M and removed size/m PR size: M labels Aug 20, 2026
@github-actionsgithub-actionsBot added size/m PR size: M and removed size/m PR size: M labels Aug 20, 2026
@notgitika
notgitika marked this pull request as ready for review August 20, 2026 04:24
@github-actionsgithub-actionsBot added size/m PR size: M and removed size/m PR size: M labels Aug 20, 2026

@HweinstockHweinstock left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

small questions, but approach lgtm. I can take another look once the dependent changes are merged.

Comment threadsrc/handlers/project/project.test.ts
Comment threadsrc/handlers/project/types.ts Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Base automatically changed from feat/project-backend-build to refactorAugust 20, 2026 16:07
@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from 81c98a5 to e485e02CompareAugust 20, 2026 17:06
@codecov-commenter

codecov-commenter commented Aug 20, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.25%. Comparing base (38c30ae) to head (8bee57f).

Additional details and impacted files
@@ Coverage Diff @@## refactor #2056 +/- ##
============================================
+ Coverage 97.24% 97.25% +0.01% 
============================================
Files 396 397 +1 Lines 24019 24125 +106 ============================================
+ Hits 23357 23463 +106 
Misses 662 662 

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from 53bd2b5 to 78a8644CompareAugust 21, 2026 16:16
Comment threadsrc/projectSchemas/aws-targets.ts Outdated
@Hweinstock

Copy link
Copy Markdown
Contributor

I think there are some merge conflicts: src/handlers/project/project.test.ts.

@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from 78a8644 to f3c53bfCompareAugust 21, 2026 17:40
Comment threadsrc/core/project/manager.tsx
@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from b9422f7 to e5af2c4CompareAugust 21, 2026 18:21
nborges-aws
nborges-aws previously approved these changes Aug 21, 2026

@nborges-awsnborges-aws left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM thanks for fixes!

@HweinstockHweinstock left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

few comments on testing and some nits, but I like the direction!

Comment threadsrc/core/project/manager.tsx
Comment threadsrc/io/json.ts
throw new DeserializationError(filePath, { cause: parseResult.error });
throw new DeserializationError(filePath, {
cause: parseResult.error,
details: z.prettifyError(parseResult.error),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

haha I refreshed and you implemented exactly what I was thinking, crazy!

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧙🏼

Comment threadsrc/testing/TestCoreClient.tsx Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Comment threadsrc/handlers/project/deploy/index.ts Outdated
The test assembled its own ValueContext with ProjectKey, JsonKey and a stub
JsonRenderer, which re-implemented what createRootHandler installs — so it
could pass while the real wiring was wrong. It now goes through
createRootHandler with the fake manager injected via TestCoreClient, the same
pattern project.test.ts and add/harness/index.test.ts use, exercising the real
--json group flag, the real JSON renderer and the real withProject wrap.
Verified by unwrapping deploy from withProject: both tests now fail, where the
hand-built context passed.
No fixture setup needed since the fake's resolve() returns a project.
Also drops the CloudFormation wording from DeployResult.outputs. The shape is
already backend-neutral; only the doc comment implied CDK.
Resolve the named aws-targets.json entry in FsProjectManager and pass the
resolved account and region to the backend, mirroring build(). deploy()
previously threw NotImplementedError before dispatching, which left
CdkBackend.deploy unreachable and duplicated the same message in two places;
the backend is now the single place that reports deployment as unimplemented.
Narrow the TestCoreClient seam from a whole-manager override to a single
backend override. Handler tests keep the real FsProjectManager, so target
resolution and withProject run for real and only the deploy boundary is faked.
Match the name pattern the schema on main already enforces. The CDK
normalizes underscores to hyphens, so accepting them here would let a
target be written one way and deployed under another.
The root handler prints only `error.message`, so the zod detail that
`FsReadWriteJson.read` put in `cause` never reached the user: a typo'd
region or a duplicated target name in a hand-edited file produced only
`Failed to deserialize file at "<path>"`, naming the file but not the
field.
DeserializationError now requires a `details` string and appends it to
the message, and json.ts passes the prettified zod error (or the parse
error) through. Fixing it in the IO layer rather than catching in
`ProjectManager.deploy` covers every hand-edited file at once. Making
`details` required rather than optional keeps the opaque message from
being reintroduced.
Tested at the handler level, since the schema tests pass in isolation
without proving the detail reaches stderr.
- Inline runDeploy and renderResult. Neither is reused; the manual .next()
loop only exists because the outputs are the generator's return value,
which `for await` discards, so that reason is now a comment where the
loop lives. `build` already drains its generator inline.
- Rename the test factory `harness` to `testDeployCommand`. "Harness" is a
real AgentCore resource in this codebase, and the name matches the
existing `testMemoryCommand` convention.
- Collapse inProjectWithRawTargets/inProjectWithTargets into one helper
that takes the file contents. Callers pass JSON.stringify(...), so the
malformed-JSON case is just another call rather than a second function.
- Drop the TestCoreClientOptions comment; the Partial already says it.
- Drop the comment above the aws-targets.json tests describing the opaque
message, which no longer exists now that DeserializationError requires
`details`. The describe name carries the intent.
@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from e8aabe3 to 8bee57fCompareAugust 24, 2026 14:46

@tejaskashtejaskash left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All actionable review comments are addressed. I verified the final head against current refactor and reran the full local test, typecheck, lint, and formatting checks.

@notgitika
notgitika merged commit fee25e2 into refactorAug 24, 2026
11 checks passed
@notgitika
notgitika deleted the feat/project-deploy-contract branch August 24, 2026 16:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/mPR size: M

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@notgitika@codecov-commenter@Hweinstock@tejaskash@nborges-aws
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(project): add deploy command contract by notgitika · Pull Request #2056 · aws/agentcore-cli · GitHub
Skip to content

feat(project): add deploy command contract - #2056

Merged
notgitika merged 7 commits into
refactorfrom
feat/project-deploy-contract
Aug 24, 2026
Merged

feat(project): add deploy command contract#2056
notgitika merged 7 commits into
refactorfrom
feat/project-deploy-contract

Conversation

@notgitika

@notgitikanotgitika commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Summary

  • add the project deploy handler and --target contract
  • define deployment target validation and deployment result types
  • synchronize the closed AgentCore region enum with the current supported-region list
  • wire manager/backend deploy interfaces with an intentionally unimplemented CDK operation

Stack

This is PR 2 of 4 decomposing #2001. The command remains nonfunctional until the final PR. Review and merge bottom-up.

  1. refactor(project): move build behind a project backend #2055 - backend build boundary
  2. feat(project): add deploy command contract #2056 - deploy command contract (this PR)
  3. feat(project): add CDK Toolkit adapter #2057 - CDK Toolkit adapter
  4. feat(project): implement safe CDK deployment #2058 - safe deployment implementation

typecheck, lint, format, test all pass

@github-actionsgithub-actionsBot added the size/m PR size: M label Aug 20, 2026
@github-actionsgithub-actionsBot added agentcore-harness-reviewing AgentCore Harness review in progress size/m PR size: M and removed size/m PR size: M agentcore-harness-reviewing AgentCore Harness review in progress labels Aug 20, 2026
@notgitika
notgitika marked this pull request as ready for review August 20, 2026 04:10
@notgitika
notgitika marked this pull request as draft August 20, 2026 04:19
@github-actionsgithub-actionsBot added size/m PR size: M and removed size/m PR size: M labels Aug 20, 2026
@github-actionsgithub-actionsBot added size/m PR size: M and removed size/m PR size: M labels Aug 20, 2026
@notgitika
notgitika marked this pull request as ready for review August 20, 2026 04:24
@github-actionsgithub-actionsBot added size/m PR size: M and removed size/m PR size: M labels Aug 20, 2026

@HweinstockHweinstock left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

small questions, but approach lgtm. I can take another look once the dependent changes are merged.

Comment threadsrc/handlers/project/project.test.ts
Comment threadsrc/handlers/project/types.ts Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Base automatically changed from feat/project-backend-build to refactorAugust 20, 2026 16:07
@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from 81c98a5 to e485e02CompareAugust 20, 2026 17:06
@codecov-commenter

codecov-commenter commented Aug 20, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.25%. Comparing base (38c30ae) to head (8bee57f).

Additional details and impacted files
@@ Coverage Diff @@## refactor #2056 +/- ##
============================================
+ Coverage 97.24% 97.25% +0.01% 
============================================
Files 396 397 +1 Lines 24019 24125 +106 ============================================
+ Hits 23357 23463 +106 
Misses 662 662 

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from 53bd2b5 to 78a8644CompareAugust 21, 2026 16:16
Comment threadsrc/projectSchemas/aws-targets.ts Outdated
@Hweinstock

Copy link
Copy Markdown
Contributor

I think there are some merge conflicts: src/handlers/project/project.test.ts.

@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from 78a8644 to f3c53bfCompareAugust 21, 2026 17:40
Comment threadsrc/core/project/manager.tsx
@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from b9422f7 to e5af2c4CompareAugust 21, 2026 18:21
nborges-aws
nborges-aws previously approved these changes Aug 21, 2026

@nborges-awsnborges-aws left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM thanks for fixes!

@HweinstockHweinstock left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

few comments on testing and some nits, but I like the direction!

Comment threadsrc/core/project/manager.tsx
Comment threadsrc/io/json.ts
throw new DeserializationError(filePath, { cause: parseResult.error });
throw new DeserializationError(filePath, {
cause: parseResult.error,
details: z.prettifyError(parseResult.error),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

haha I refreshed and you implemented exactly what I was thinking, crazy!

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧙🏼

Comment threadsrc/testing/TestCoreClient.tsx Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Comment threadsrc/handlers/project/deploy/index.ts Outdated
The test assembled its own ValueContext with ProjectKey, JsonKey and a stub
JsonRenderer, which re-implemented what createRootHandler installs — so it
could pass while the real wiring was wrong. It now goes through
createRootHandler with the fake manager injected via TestCoreClient, the same
pattern project.test.ts and add/harness/index.test.ts use, exercising the real
--json group flag, the real JSON renderer and the real withProject wrap.
Verified by unwrapping deploy from withProject: both tests now fail, where the
hand-built context passed.
No fixture setup needed since the fake's resolve() returns a project.
Also drops the CloudFormation wording from DeployResult.outputs. The shape is
already backend-neutral; only the doc comment implied CDK.
Resolve the named aws-targets.json entry in FsProjectManager and pass the
resolved account and region to the backend, mirroring build(). deploy()
previously threw NotImplementedError before dispatching, which left
CdkBackend.deploy unreachable and duplicated the same message in two places;
the backend is now the single place that reports deployment as unimplemented.
Narrow the TestCoreClient seam from a whole-manager override to a single
backend override. Handler tests keep the real FsProjectManager, so target
resolution and withProject run for real and only the deploy boundary is faked.
Match the name pattern the schema on main already enforces. The CDK
normalizes underscores to hyphens, so accepting them here would let a
target be written one way and deployed under another.
The root handler prints only `error.message`, so the zod detail that
`FsReadWriteJson.read` put in `cause` never reached the user: a typo'd
region or a duplicated target name in a hand-edited file produced only
`Failed to deserialize file at "<path>"`, naming the file but not the
field.
DeserializationError now requires a `details` string and appends it to
the message, and json.ts passes the prettified zod error (or the parse
error) through. Fixing it in the IO layer rather than catching in
`ProjectManager.deploy` covers every hand-edited file at once. Making
`details` required rather than optional keeps the opaque message from
being reintroduced.
Tested at the handler level, since the schema tests pass in isolation
without proving the detail reaches stderr.
- Inline runDeploy and renderResult. Neither is reused; the manual .next()
loop only exists because the outputs are the generator's return value,
which `for await` discards, so that reason is now a comment where the
loop lives. `build` already drains its generator inline.
- Rename the test factory `harness` to `testDeployCommand`. "Harness" is a
real AgentCore resource in this codebase, and the name matches the
existing `testMemoryCommand` convention.
- Collapse inProjectWithRawTargets/inProjectWithTargets into one helper
that takes the file contents. Callers pass JSON.stringify(...), so the
malformed-JSON case is just another call rather than a second function.
- Drop the TestCoreClientOptions comment; the Partial already says it.
- Drop the comment above the aws-targets.json tests describing the opaque
message, which no longer exists now that DeserializationError requires
`details`. The describe name carries the intent.
@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from e8aabe3 to 8bee57fCompareAugust 24, 2026 14:46

@tejaskashtejaskash left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All actionable review comments are addressed. I verified the final head against current refactor and reran the full local test, typecheck, lint, and formatting checks.

@notgitika
notgitika merged commit fee25e2 into refactorAug 24, 2026
11 checks passed
@notgitika
notgitika deleted the feat/project-deploy-contract branch August 24, 2026 16:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/mPR size: M

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@notgitika@codecov-commenter@Hweinstock@tejaskash@nborges-aws
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' feat(project): add deploy command contract by notgitika · Pull Request #2056 · aws/agentcore-cli · GitHub
Skip to content

feat(project): add deploy command contract - #2056

Merged
notgitika merged 7 commits into
refactorfrom
feat/project-deploy-contract
Aug 24, 2026
Merged

feat(project): add deploy command contract#2056
notgitika merged 7 commits into
refactorfrom
feat/project-deploy-contract

Conversation

@notgitika

@notgitikanotgitika commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Summary

  • add the project deploy handler and --target contract
  • define deployment target validation and deployment result types
  • synchronize the closed AgentCore region enum with the current supported-region list
  • wire manager/backend deploy interfaces with an intentionally unimplemented CDK operation

Stack

This is PR 2 of 4 decomposing #2001. The command remains nonfunctional until the final PR. Review and merge bottom-up.

  1. refactor(project): move build behind a project backend #2055 - backend build boundary
  2. feat(project): add deploy command contract #2056 - deploy command contract (this PR)
  3. feat(project): add CDK Toolkit adapter #2057 - CDK Toolkit adapter
  4. feat(project): implement safe CDK deployment #2058 - safe deployment implementation

typecheck, lint, format, test all pass

@github-actionsgithub-actionsBot added the size/m PR size: M label Aug 20, 2026
@github-actionsgithub-actionsBot added agentcore-harness-reviewing AgentCore Harness review in progress size/m PR size: M and removed size/m PR size: M agentcore-harness-reviewing AgentCore Harness review in progress labels Aug 20, 2026
@notgitika
notgitika marked this pull request as ready for review August 20, 2026 04:10
@notgitika
notgitika marked this pull request as draft August 20, 2026 04:19
@github-actionsgithub-actionsBot added size/m PR size: M and removed size/m PR size: M labels Aug 20, 2026
@github-actionsgithub-actionsBot added size/m PR size: M and removed size/m PR size: M labels Aug 20, 2026
@notgitika
notgitika marked this pull request as ready for review August 20, 2026 04:24
@github-actionsgithub-actionsBot added size/m PR size: M and removed size/m PR size: M labels Aug 20, 2026

@HweinstockHweinstock left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

small questions, but approach lgtm. I can take another look once the dependent changes are merged.

Comment threadsrc/handlers/project/project.test.ts
Comment threadsrc/handlers/project/types.ts Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Base automatically changed from feat/project-backend-build to refactorAugust 20, 2026 16:07
@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from 81c98a5 to e485e02CompareAugust 20, 2026 17:06
@codecov-commenter

codecov-commenter commented Aug 20, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.25%. Comparing base (38c30ae) to head (8bee57f).

Additional details and impacted files
@@ Coverage Diff @@## refactor #2056 +/- ##
============================================
+ Coverage 97.24% 97.25% +0.01% 
============================================
Files 396 397 +1 Lines 24019 24125 +106 ============================================
+ Hits 23357 23463 +106 
Misses 662 662 

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from 53bd2b5 to 78a8644CompareAugust 21, 2026 16:16
Comment threadsrc/projectSchemas/aws-targets.ts Outdated
@Hweinstock

Copy link
Copy Markdown
Contributor

I think there are some merge conflicts: src/handlers/project/project.test.ts.

@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from 78a8644 to f3c53bfCompareAugust 21, 2026 17:40
Comment threadsrc/core/project/manager.tsx
@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from b9422f7 to e5af2c4CompareAugust 21, 2026 18:21
nborges-aws
nborges-aws previously approved these changes Aug 21, 2026

@nborges-awsnborges-aws left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM thanks for fixes!

@HweinstockHweinstock left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

few comments on testing and some nits, but I like the direction!

Comment threadsrc/core/project/manager.tsx
Comment threadsrc/io/json.ts
throw new DeserializationError(filePath, { cause: parseResult.error });
throw new DeserializationError(filePath, {
cause: parseResult.error,
details: z.prettifyError(parseResult.error),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

haha I refreshed and you implemented exactly what I was thinking, crazy!

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧙🏼

Comment threadsrc/testing/TestCoreClient.tsx Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Comment threadsrc/handlers/project/deploy/index.ts Outdated
The test assembled its own ValueContext with ProjectKey, JsonKey and a stub
JsonRenderer, which re-implemented what createRootHandler installs — so it
could pass while the real wiring was wrong. It now goes through
createRootHandler with the fake manager injected via TestCoreClient, the same
pattern project.test.ts and add/harness/index.test.ts use, exercising the real
--json group flag, the real JSON renderer and the real withProject wrap.
Verified by unwrapping deploy from withProject: both tests now fail, where the
hand-built context passed.
No fixture setup needed since the fake's resolve() returns a project.
Also drops the CloudFormation wording from DeployResult.outputs. The shape is
already backend-neutral; only the doc comment implied CDK.
Resolve the named aws-targets.json entry in FsProjectManager and pass the
resolved account and region to the backend, mirroring build(). deploy()
previously threw NotImplementedError before dispatching, which left
CdkBackend.deploy unreachable and duplicated the same message in two places;
the backend is now the single place that reports deployment as unimplemented.
Narrow the TestCoreClient seam from a whole-manager override to a single
backend override. Handler tests keep the real FsProjectManager, so target
resolution and withProject run for real and only the deploy boundary is faked.
Match the name pattern the schema on main already enforces. The CDK
normalizes underscores to hyphens, so accepting them here would let a
target be written one way and deployed under another.
The root handler prints only `error.message`, so the zod detail that
`FsReadWriteJson.read` put in `cause` never reached the user: a typo'd
region or a duplicated target name in a hand-edited file produced only
`Failed to deserialize file at "<path>"`, naming the file but not the
field.
DeserializationError now requires a `details` string and appends it to
the message, and json.ts passes the prettified zod error (or the parse
error) through. Fixing it in the IO layer rather than catching in
`ProjectManager.deploy` covers every hand-edited file at once. Making
`details` required rather than optional keeps the opaque message from
being reintroduced.
Tested at the handler level, since the schema tests pass in isolation
without proving the detail reaches stderr.
- Inline runDeploy and renderResult. Neither is reused; the manual .next()
loop only exists because the outputs are the generator's return value,
which `for await` discards, so that reason is now a comment where the
loop lives. `build` already drains its generator inline.
- Rename the test factory `harness` to `testDeployCommand`. "Harness" is a
real AgentCore resource in this codebase, and the name matches the
existing `testMemoryCommand` convention.
- Collapse inProjectWithRawTargets/inProjectWithTargets into one helper
that takes the file contents. Callers pass JSON.stringify(...), so the
malformed-JSON case is just another call rather than a second function.
- Drop the TestCoreClientOptions comment; the Partial already says it.
- Drop the comment above the aws-targets.json tests describing the opaque
message, which no longer exists now that DeserializationError requires
`details`. The describe name carries the intent.
@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from e8aabe3 to 8bee57fCompareAugust 24, 2026 14:46

@tejaskashtejaskash left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All actionable review comments are addressed. I verified the final head against current refactor and reran the full local test, typecheck, lint, and formatting checks.

@notgitika
notgitika merged commit fee25e2 into refactorAug 24, 2026
11 checks passed
@notgitika
notgitika deleted the feat/project-deploy-contract branch August 24, 2026 16:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/mPR size: M

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@notgitika@codecov-commenter@Hweinstock@tejaskash@nborges-aws
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(project): add deploy command contract by notgitika · Pull Request #2056 · aws/agentcore-cli · GitHub
Skip to content

feat(project): add deploy command contract - #2056

Merged
notgitika merged 7 commits into
refactorfrom
feat/project-deploy-contract
Aug 24, 2026
Merged

feat(project): add deploy command contract#2056
notgitika merged 7 commits into
refactorfrom
feat/project-deploy-contract

Conversation

@notgitika

@notgitikanotgitika commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Summary

  • add the project deploy handler and --target contract
  • define deployment target validation and deployment result types
  • synchronize the closed AgentCore region enum with the current supported-region list
  • wire manager/backend deploy interfaces with an intentionally unimplemented CDK operation

Stack

This is PR 2 of 4 decomposing #2001. The command remains nonfunctional until the final PR. Review and merge bottom-up.

  1. refactor(project): move build behind a project backend #2055 - backend build boundary
  2. feat(project): add deploy command contract #2056 - deploy command contract (this PR)
  3. feat(project): add CDK Toolkit adapter #2057 - CDK Toolkit adapter
  4. feat(project): implement safe CDK deployment #2058 - safe deployment implementation

typecheck, lint, format, test all pass

@github-actionsgithub-actionsBot added the size/m PR size: M label Aug 20, 2026
@github-actionsgithub-actionsBot added agentcore-harness-reviewing AgentCore Harness review in progress size/m PR size: M and removed size/m PR size: M agentcore-harness-reviewing AgentCore Harness review in progress labels Aug 20, 2026
@notgitika
notgitika marked this pull request as ready for review August 20, 2026 04:10
@notgitika
notgitika marked this pull request as draft August 20, 2026 04:19
@github-actionsgithub-actionsBot added size/m PR size: M and removed size/m PR size: M labels Aug 20, 2026
@github-actionsgithub-actionsBot added size/m PR size: M and removed size/m PR size: M labels Aug 20, 2026
@notgitika
notgitika marked this pull request as ready for review August 20, 2026 04:24
@github-actionsgithub-actionsBot added size/m PR size: M and removed size/m PR size: M labels Aug 20, 2026

@HweinstockHweinstock left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

small questions, but approach lgtm. I can take another look once the dependent changes are merged.

Comment threadsrc/handlers/project/project.test.ts
Comment threadsrc/handlers/project/types.ts Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Base automatically changed from feat/project-backend-build to refactorAugust 20, 2026 16:07
@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from 81c98a5 to e485e02CompareAugust 20, 2026 17:06
@codecov-commenter

codecov-commenter commented Aug 20, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.25%. Comparing base (38c30ae) to head (8bee57f).

Additional details and impacted files
@@ Coverage Diff @@## refactor #2056 +/- ##
============================================
+ Coverage 97.24% 97.25% +0.01% 
============================================
Files 396 397 +1 Lines 24019 24125 +106 ============================================
+ Hits 23357 23463 +106 
Misses 662 662 

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from 53bd2b5 to 78a8644CompareAugust 21, 2026 16:16
Comment threadsrc/projectSchemas/aws-targets.ts Outdated
@Hweinstock

Copy link
Copy Markdown
Contributor

I think there are some merge conflicts: src/handlers/project/project.test.ts.

@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from 78a8644 to f3c53bfCompareAugust 21, 2026 17:40
Comment threadsrc/core/project/manager.tsx
@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from b9422f7 to e5af2c4CompareAugust 21, 2026 18:21
nborges-aws
nborges-aws previously approved these changes Aug 21, 2026

@nborges-awsnborges-aws left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM thanks for fixes!

@HweinstockHweinstock left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

few comments on testing and some nits, but I like the direction!

Comment threadsrc/core/project/manager.tsx
Comment threadsrc/io/json.ts
throw new DeserializationError(filePath, { cause: parseResult.error });
throw new DeserializationError(filePath, {
cause: parseResult.error,
details: z.prettifyError(parseResult.error),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

haha I refreshed and you implemented exactly what I was thinking, crazy!

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧙🏼

Comment threadsrc/testing/TestCoreClient.tsx Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Comment threadsrc/handlers/project/deploy/index.ts Outdated
The test assembled its own ValueContext with ProjectKey, JsonKey and a stub
JsonRenderer, which re-implemented what createRootHandler installs — so it
could pass while the real wiring was wrong. It now goes through
createRootHandler with the fake manager injected via TestCoreClient, the same
pattern project.test.ts and add/harness/index.test.ts use, exercising the real
--json group flag, the real JSON renderer and the real withProject wrap.
Verified by unwrapping deploy from withProject: both tests now fail, where the
hand-built context passed.
No fixture setup needed since the fake's resolve() returns a project.
Also drops the CloudFormation wording from DeployResult.outputs. The shape is
already backend-neutral; only the doc comment implied CDK.
Resolve the named aws-targets.json entry in FsProjectManager and pass the
resolved account and region to the backend, mirroring build(). deploy()
previously threw NotImplementedError before dispatching, which left
CdkBackend.deploy unreachable and duplicated the same message in two places;
the backend is now the single place that reports deployment as unimplemented.
Narrow the TestCoreClient seam from a whole-manager override to a single
backend override. Handler tests keep the real FsProjectManager, so target
resolution and withProject run for real and only the deploy boundary is faked.
Match the name pattern the schema on main already enforces. The CDK
normalizes underscores to hyphens, so accepting them here would let a
target be written one way and deployed under another.
The root handler prints only `error.message`, so the zod detail that
`FsReadWriteJson.read` put in `cause` never reached the user: a typo'd
region or a duplicated target name in a hand-edited file produced only
`Failed to deserialize file at "<path>"`, naming the file but not the
field.
DeserializationError now requires a `details` string and appends it to
the message, and json.ts passes the prettified zod error (or the parse
error) through. Fixing it in the IO layer rather than catching in
`ProjectManager.deploy` covers every hand-edited file at once. Making
`details` required rather than optional keeps the opaque message from
being reintroduced.
Tested at the handler level, since the schema tests pass in isolation
without proving the detail reaches stderr.
- Inline runDeploy and renderResult. Neither is reused; the manual .next()
loop only exists because the outputs are the generator's return value,
which `for await` discards, so that reason is now a comment where the
loop lives. `build` already drains its generator inline.
- Rename the test factory `harness` to `testDeployCommand`. "Harness" is a
real AgentCore resource in this codebase, and the name matches the
existing `testMemoryCommand` convention.
- Collapse inProjectWithRawTargets/inProjectWithTargets into one helper
that takes the file contents. Callers pass JSON.stringify(...), so the
malformed-JSON case is just another call rather than a second function.
- Drop the TestCoreClientOptions comment; the Partial already says it.
- Drop the comment above the aws-targets.json tests describing the opaque
message, which no longer exists now that DeserializationError requires
`details`. The describe name carries the intent.
@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from e8aabe3 to 8bee57fCompareAugust 24, 2026 14:46

@tejaskashtejaskash left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All actionable review comments are addressed. I verified the final head against current refactor and reran the full local test, typecheck, lint, and formatting checks.

@notgitika
notgitika merged commit fee25e2 into refactorAug 24, 2026
11 checks passed
@notgitika
notgitika deleted the feat/project-deploy-contract branch August 24, 2026 16:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/mPR size: M

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@notgitika@codecov-commenter@Hweinstock@tejaskash@nborges-aws
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(project): add deploy command contract by notgitika · Pull Request #2056 · aws/agentcore-cli · GitHub
Skip to content

feat(project): add deploy command contract - #2056

Merged
notgitika merged 7 commits into
refactorfrom
feat/project-deploy-contract
Aug 24, 2026
Merged

feat(project): add deploy command contract#2056
notgitika merged 7 commits into
refactorfrom
feat/project-deploy-contract

Conversation

@notgitika

@notgitikanotgitika commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Summary

  • add the project deploy handler and --target contract
  • define deployment target validation and deployment result types
  • synchronize the closed AgentCore region enum with the current supported-region list
  • wire manager/backend deploy interfaces with an intentionally unimplemented CDK operation

Stack

This is PR 2 of 4 decomposing #2001. The command remains nonfunctional until the final PR. Review and merge bottom-up.

  1. refactor(project): move build behind a project backend #2055 - backend build boundary
  2. feat(project): add deploy command contract #2056 - deploy command contract (this PR)
  3. feat(project): add CDK Toolkit adapter #2057 - CDK Toolkit adapter
  4. feat(project): implement safe CDK deployment #2058 - safe deployment implementation

typecheck, lint, format, test all pass

@github-actionsgithub-actionsBot added the size/m PR size: M label Aug 20, 2026
@github-actionsgithub-actionsBot added agentcore-harness-reviewing AgentCore Harness review in progress size/m PR size: M and removed size/m PR size: M agentcore-harness-reviewing AgentCore Harness review in progress labels Aug 20, 2026
@notgitika
notgitika marked this pull request as ready for review August 20, 2026 04:10
@notgitika
notgitika marked this pull request as draft August 20, 2026 04:19
@github-actionsgithub-actionsBot added size/m PR size: M and removed size/m PR size: M labels Aug 20, 2026
@github-actionsgithub-actionsBot added size/m PR size: M and removed size/m PR size: M labels Aug 20, 2026
@notgitika
notgitika marked this pull request as ready for review August 20, 2026 04:24
@github-actionsgithub-actionsBot added size/m PR size: M and removed size/m PR size: M labels Aug 20, 2026

@HweinstockHweinstock left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

small questions, but approach lgtm. I can take another look once the dependent changes are merged.

Comment threadsrc/handlers/project/project.test.ts
Comment threadsrc/handlers/project/types.ts Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Base automatically changed from feat/project-backend-build to refactorAugust 20, 2026 16:07
@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from 81c98a5 to e485e02CompareAugust 20, 2026 17:06
@codecov-commenter

codecov-commenter commented Aug 20, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.25%. Comparing base (38c30ae) to head (8bee57f).

Additional details and impacted files
@@ Coverage Diff @@## refactor #2056 +/- ##
============================================
+ Coverage 97.24% 97.25% +0.01% 
============================================
Files 396 397 +1 Lines 24019 24125 +106 ============================================
+ Hits 23357 23463 +106 
Misses 662 662 

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from 53bd2b5 to 78a8644CompareAugust 21, 2026 16:16
Comment threadsrc/projectSchemas/aws-targets.ts Outdated
@Hweinstock

Copy link
Copy Markdown
Contributor

I think there are some merge conflicts: src/handlers/project/project.test.ts.

@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from 78a8644 to f3c53bfCompareAugust 21, 2026 17:40
Comment threadsrc/core/project/manager.tsx
@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from b9422f7 to e5af2c4CompareAugust 21, 2026 18:21
nborges-aws
nborges-aws previously approved these changes Aug 21, 2026

@nborges-awsnborges-aws left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM thanks for fixes!

@HweinstockHweinstock left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

few comments on testing and some nits, but I like the direction!

Comment threadsrc/core/project/manager.tsx
Comment threadsrc/io/json.ts
throw new DeserializationError(filePath, { cause: parseResult.error });
throw new DeserializationError(filePath, {
cause: parseResult.error,
details: z.prettifyError(parseResult.error),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

haha I refreshed and you implemented exactly what I was thinking, crazy!

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧙🏼

Comment threadsrc/testing/TestCoreClient.tsx Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Comment threadsrc/handlers/project/deploy/index.ts Outdated
The test assembled its own ValueContext with ProjectKey, JsonKey and a stub
JsonRenderer, which re-implemented what createRootHandler installs — so it
could pass while the real wiring was wrong. It now goes through
createRootHandler with the fake manager injected via TestCoreClient, the same
pattern project.test.ts and add/harness/index.test.ts use, exercising the real
--json group flag, the real JSON renderer and the real withProject wrap.
Verified by unwrapping deploy from withProject: both tests now fail, where the
hand-built context passed.
No fixture setup needed since the fake's resolve() returns a project.
Also drops the CloudFormation wording from DeployResult.outputs. The shape is
already backend-neutral; only the doc comment implied CDK.
Resolve the named aws-targets.json entry in FsProjectManager and pass the
resolved account and region to the backend, mirroring build(). deploy()
previously threw NotImplementedError before dispatching, which left
CdkBackend.deploy unreachable and duplicated the same message in two places;
the backend is now the single place that reports deployment as unimplemented.
Narrow the TestCoreClient seam from a whole-manager override to a single
backend override. Handler tests keep the real FsProjectManager, so target
resolution and withProject run for real and only the deploy boundary is faked.
Match the name pattern the schema on main already enforces. The CDK
normalizes underscores to hyphens, so accepting them here would let a
target be written one way and deployed under another.
The root handler prints only `error.message`, so the zod detail that
`FsReadWriteJson.read` put in `cause` never reached the user: a typo'd
region or a duplicated target name in a hand-edited file produced only
`Failed to deserialize file at "<path>"`, naming the file but not the
field.
DeserializationError now requires a `details` string and appends it to
the message, and json.ts passes the prettified zod error (or the parse
error) through. Fixing it in the IO layer rather than catching in
`ProjectManager.deploy` covers every hand-edited file at once. Making
`details` required rather than optional keeps the opaque message from
being reintroduced.
Tested at the handler level, since the schema tests pass in isolation
without proving the detail reaches stderr.
- Inline runDeploy and renderResult. Neither is reused; the manual .next()
loop only exists because the outputs are the generator's return value,
which `for await` discards, so that reason is now a comment where the
loop lives. `build` already drains its generator inline.
- Rename the test factory `harness` to `testDeployCommand`. "Harness" is a
real AgentCore resource in this codebase, and the name matches the
existing `testMemoryCommand` convention.
- Collapse inProjectWithRawTargets/inProjectWithTargets into one helper
that takes the file contents. Callers pass JSON.stringify(...), so the
malformed-JSON case is just another call rather than a second function.
- Drop the TestCoreClientOptions comment; the Partial already says it.
- Drop the comment above the aws-targets.json tests describing the opaque
message, which no longer exists now that DeserializationError requires
`details`. The describe name carries the intent.
@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from e8aabe3 to 8bee57fCompareAugust 24, 2026 14:46

@tejaskashtejaskash left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All actionable review comments are addressed. I verified the final head against current refactor and reran the full local test, typecheck, lint, and formatting checks.

@notgitika
notgitika merged commit fee25e2 into refactorAug 24, 2026
11 checks passed
@notgitika
notgitika deleted the feat/project-deploy-contract branch August 24, 2026 16:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/mPR size: M

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@notgitika@codecov-commenter@Hweinstock@tejaskash@nborges-aws
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); feat(project): add deploy command contract by notgitika · Pull Request #2056 · aws/agentcore-cli · GitHub
Skip to content

feat(project): add deploy command contract - #2056

Merged
notgitika merged 7 commits into
refactorfrom
feat/project-deploy-contract
Aug 24, 2026
Merged

feat(project): add deploy command contract#2056
notgitika merged 7 commits into
refactorfrom
feat/project-deploy-contract

Conversation

@notgitika

@notgitikanotgitika commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Summary

  • add the project deploy handler and --target contract
  • define deployment target validation and deployment result types
  • synchronize the closed AgentCore region enum with the current supported-region list
  • wire manager/backend deploy interfaces with an intentionally unimplemented CDK operation

Stack

This is PR 2 of 4 decomposing #2001. The command remains nonfunctional until the final PR. Review and merge bottom-up.

  1. refactor(project): move build behind a project backend #2055 - backend build boundary
  2. feat(project): add deploy command contract #2056 - deploy command contract (this PR)
  3. feat(project): add CDK Toolkit adapter #2057 - CDK Toolkit adapter
  4. feat(project): implement safe CDK deployment #2058 - safe deployment implementation

typecheck, lint, format, test all pass

@github-actionsgithub-actionsBot added the size/m PR size: M label Aug 20, 2026
@github-actionsgithub-actionsBot added agentcore-harness-reviewing AgentCore Harness review in progress size/m PR size: M and removed size/m PR size: M agentcore-harness-reviewing AgentCore Harness review in progress labels Aug 20, 2026
@notgitika
notgitika marked this pull request as ready for review August 20, 2026 04:10
@notgitika
notgitika marked this pull request as draft August 20, 2026 04:19
@github-actionsgithub-actionsBot added size/m PR size: M and removed size/m PR size: M labels Aug 20, 2026
@github-actionsgithub-actionsBot added size/m PR size: M and removed size/m PR size: M labels Aug 20, 2026
@notgitika
notgitika marked this pull request as ready for review August 20, 2026 04:24
@github-actionsgithub-actionsBot added size/m PR size: M and removed size/m PR size: M labels Aug 20, 2026

@HweinstockHweinstock left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

small questions, but approach lgtm. I can take another look once the dependent changes are merged.

Comment threadsrc/handlers/project/project.test.ts
Comment threadsrc/handlers/project/types.ts Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Base automatically changed from feat/project-backend-build to refactorAugust 20, 2026 16:07
@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from 81c98a5 to e485e02CompareAugust 20, 2026 17:06
@codecov-commenter

codecov-commenter commented Aug 20, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.25%. Comparing base (38c30ae) to head (8bee57f).

Additional details and impacted files
@@ Coverage Diff @@## refactor #2056 +/- ##
============================================
+ Coverage 97.24% 97.25% +0.01% 
============================================
Files 396 397 +1 Lines 24019 24125 +106 ============================================
+ Hits 23357 23463 +106 
Misses 662 662 

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from 53bd2b5 to 78a8644CompareAugust 21, 2026 16:16
Comment threadsrc/projectSchemas/aws-targets.ts Outdated
@Hweinstock

Copy link
Copy Markdown
Contributor

I think there are some merge conflicts: src/handlers/project/project.test.ts.

@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from 78a8644 to f3c53bfCompareAugust 21, 2026 17:40
Comment threadsrc/core/project/manager.tsx
@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from b9422f7 to e5af2c4CompareAugust 21, 2026 18:21
nborges-aws
nborges-aws previously approved these changes Aug 21, 2026

@nborges-awsnborges-aws left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM thanks for fixes!

@HweinstockHweinstock left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

few comments on testing and some nits, but I like the direction!

Comment threadsrc/core/project/manager.tsx
Comment threadsrc/io/json.ts
throw new DeserializationError(filePath, { cause: parseResult.error });
throw new DeserializationError(filePath, {
cause: parseResult.error,
details: z.prettifyError(parseResult.error),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

haha I refreshed and you implemented exactly what I was thinking, crazy!

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧙🏼

Comment threadsrc/testing/TestCoreClient.tsx Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Comment threadsrc/handlers/project/deploy/index.test.ts Outdated
Comment threadsrc/handlers/project/deploy/index.ts Outdated
The test assembled its own ValueContext with ProjectKey, JsonKey and a stub
JsonRenderer, which re-implemented what createRootHandler installs — so it
could pass while the real wiring was wrong. It now goes through
createRootHandler with the fake manager injected via TestCoreClient, the same
pattern project.test.ts and add/harness/index.test.ts use, exercising the real
--json group flag, the real JSON renderer and the real withProject wrap.
Verified by unwrapping deploy from withProject: both tests now fail, where the
hand-built context passed.
No fixture setup needed since the fake's resolve() returns a project.
Also drops the CloudFormation wording from DeployResult.outputs. The shape is
already backend-neutral; only the doc comment implied CDK.
Resolve the named aws-targets.json entry in FsProjectManager and pass the
resolved account and region to the backend, mirroring build(). deploy()
previously threw NotImplementedError before dispatching, which left
CdkBackend.deploy unreachable and duplicated the same message in two places;
the backend is now the single place that reports deployment as unimplemented.
Narrow the TestCoreClient seam from a whole-manager override to a single
backend override. Handler tests keep the real FsProjectManager, so target
resolution and withProject run for real and only the deploy boundary is faked.
Match the name pattern the schema on main already enforces. The CDK
normalizes underscores to hyphens, so accepting them here would let a
target be written one way and deployed under another.
The root handler prints only `error.message`, so the zod detail that
`FsReadWriteJson.read` put in `cause` never reached the user: a typo'd
region or a duplicated target name in a hand-edited file produced only
`Failed to deserialize file at "<path>"`, naming the file but not the
field.
DeserializationError now requires a `details` string and appends it to
the message, and json.ts passes the prettified zod error (or the parse
error) through. Fixing it in the IO layer rather than catching in
`ProjectManager.deploy` covers every hand-edited file at once. Making
`details` required rather than optional keeps the opaque message from
being reintroduced.
Tested at the handler level, since the schema tests pass in isolation
without proving the detail reaches stderr.
- Inline runDeploy and renderResult. Neither is reused; the manual .next()
loop only exists because the outputs are the generator's return value,
which `for await` discards, so that reason is now a comment where the
loop lives. `build` already drains its generator inline.
- Rename the test factory `harness` to `testDeployCommand`. "Harness" is a
real AgentCore resource in this codebase, and the name matches the
existing `testMemoryCommand` convention.
- Collapse inProjectWithRawTargets/inProjectWithTargets into one helper
that takes the file contents. Callers pass JSON.stringify(...), so the
malformed-JSON case is just another call rather than a second function.
- Drop the TestCoreClientOptions comment; the Partial already says it.
- Drop the comment above the aws-targets.json tests describing the opaque
message, which no longer exists now that DeserializationError requires
`details`. The describe name carries the intent.
@notgitika
notgitikaforce-pushed the feat/project-deploy-contract branch from e8aabe3 to 8bee57fCompareAugust 24, 2026 14:46

@tejaskashtejaskash left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All actionable review comments are addressed. I verified the final head against current refactor and reran the full local test, typecheck, lint, and formatting checks.

@notgitika
notgitika merged commit fee25e2 into refactorAug 24, 2026
11 checks passed
@notgitika
notgitika deleted the feat/project-deploy-contract branch August 24, 2026 16:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/mPR size: M

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@notgitika@codecov-commenter@Hweinstock@tejaskash@nborges-aws