Skip to content

feat(project): implement remove command - #2037

Merged
jariy17 merged 6 commits into
aws:refactorfrom
Hweinstock:feat/project-remove
Aug 21, 2026
Merged

feat(project): implement remove command#2037
jariy17 merged 6 commits into
aws:refactorfrom
Hweinstock:feat/project-remove

Conversation

@Hweinstock

@HweinstockHweinstock commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Problem

There is no remove command!

Solution

Implement remove as a single command, taking the resource as an argument. Looking at the old CLI https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/, we basically duplicated this pattern many times, but here we instead do it generically.

Note: we don't yet support remove all, but one could imagine adding it as a resource type with special behavior.

Testing

unit tests with harness and runtime (since those are the only ones working e2e).

@github-actionsgithub-actionsBot added the agentcore-harness-reviewing AgentCore Harness review in progress label Aug 19, 2026
@github-actionsgithub-actionsBot removed the agentcore-harness-reviewing AgentCore Harness review in progress label Aug 19, 2026
@codecov-commenter

codecov-commenter commented Aug 19, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.14%. Comparing base (1a21206) to head (c0c2821).
⚠️ Report is 1 commits behind head on refactor.

Additional details and impacted files
@@ Coverage Diff @@## refactor #2037 +/- ##
=========================================
Coverage 97.13% 97.14% =========================================
Files 381 381 Lines 22782 22824 +42 =========================================
+ Hits 22130 22172 +42 
Misses 652 652 

☔ 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.

);
});

async function run(args: string[]) {

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.

as a follow-up, I think we can pull this and inProject below out into a common location (src/testing). I have a few open PRs that develop similar utils for this.

const agentCoreSpecPath = this.getProjectSpecPath(project);
const projectSpecKey = toProjectSpecKey(input.resourceType);

const existingProjectSpec = await this.json.read(agentCoreSpecPath, ProjectSpecSchema);

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.

we could probably re-use some logic from add, but want to wait before trying to generalize this.

@Hweinstock
Hweinstock marked this pull request as ready for review August 19, 2026 18:45
notgitika
notgitika previously approved these changes Aug 19, 2026

@notgitikanotgitika 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.

This PR looks good thanks for setting it up. I have a suggestion I would like addressed that I left a comment below on.

separately, I have a question for the future implementations we do: will we also be deleting any code we scaffold (for runtime and harness for instance) when the user runs this command?

I spent some time reviewing the code on main and it seems mixed.

For remove gateway target, it removes the code: https://github.com/aws/agentcore-cli/blob/main/src/cli/operations/remove/remove-gateway-target.ts#L201
Same for code based evals: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/EvaluatorPrimitive.ts#L261

however, for agent/runtime, we don't do the same: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/AgentPrimitive.tsx#L222

Can we decide and align on one experience before we start with the rest of the implementation?

Comment on lines +217 to +219
this.logger
.child({ input })
.warn(`unable to remove resource from project that does not exist.`);

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.

can we throw right after this? at this point, the handler would still return a user message like remove successful. I'm okay to keep it this way like a no-op but it might be a bit misleading.

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.

I think an idempotent delete is easier, especially if customers are using this in some kind of automation.

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.

I agree with keeping the successful exit code; idempotency here is useful. Though the removed successfully error messaging is very misleading.

As a nit I'd say we should maintain the success exit code, but add a mechanism for differentiating the result.

@Hweinstock

Copy link
Copy Markdown
ContributorAuthor

good callout, I think we should remove the scaffolded code to be consistent.

Comment threadsrc/core/project/manager.tsx Outdated
break;
}
} catch (e) {
throw new ProjectStateError(

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.

decided to throw here since it could lead to bad state. ex. i remove a runtime named 'X", then try to recreate (it would fail since the files still exist).

@notgitika

Copy link
Copy Markdown
Contributor

good callout, I think we should remove the scaffolded code to be consistent.

just had an offline discussion on why we decided not to delete the code early on.

I would lean on not deleting the code, since the user could wanna reuse the code if they maybe make some changes. That is the pattern we established with with agent/runtime initially but the following code with gateway targets/code based evals were regressions, since it wasn't documented properly.

what do you think?

@Hweinstock

Copy link
Copy Markdown
ContributorAuthor

responded internally, swapping back to original for now, we can add clean up later if we see a need.

@notgitikanotgitika 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.

Nice!

@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.

Left one comment on the non-existent resource handling. I do think the success error message is misleading and we should consider differentiating.

Definitely non-blocking for this PR and something we can think through. LGTM otherwise.

const existingProjectSpec = await this.json.read(agentCoreSpecPath, ProjectSpecSchema);

const existingResources = existingProjectSpec[projectSpecKey];
const newResources = existingResources.filter((r) => r.name !== input.name);

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.

Later, we can make this a helper function that could be used to prevent duplicates for add and update existing for update

describe("project remove", () => {
// Verifies that resources are removed from agentcore.json and the correct
// remaining resources are left.
test.each<RemoveCase>([

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.

nit: There should be a test that will make sure we don't delete customer's code

@jariy17

Copy link
Copy Markdown
Contributor

This PR looks good thanks for setting it up. I have a suggestion I would like addressed that I left a comment below on.

separately, I have a question for the future implementations we do: will we also be deleting any code we scaffold (for runtime and harness for instance) when the user runs this command?

I spent some time reviewing the code on main and it seems mixed.

For remove gateway target, it removes the code: https://github.com/aws/agentcore-cli/blob/main/src/cli/operations/remove/remove-gateway-target.ts#L201 Same for code based evals: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/EvaluatorPrimitive.ts#L261

however, for agent/runtime, we don't do the same: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/AgentPrimitive.tsx#L222

Can we decide and align on one experience before we start with the rest of the implementation?

I discussed with Harrison, I think we shouldn't delete their application code because it's their code. It's an easy two door decision if customers want this feature.

@jariy17
jariy17 merged commit e99b413 into aws:refactorAug 21, 2026
8 of 16 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Hweinstock@codecov-commenter@notgitika@jariy17@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): implement remove command by Hweinstock · Pull Request #2037 · aws/agentcore-cli · GitHub
Skip to content

feat(project): implement remove command - #2037

Merged
jariy17 merged 6 commits into
aws:refactorfrom
Hweinstock:feat/project-remove
Aug 21, 2026
Merged

feat(project): implement remove command#2037
jariy17 merged 6 commits into
aws:refactorfrom
Hweinstock:feat/project-remove

Conversation

@Hweinstock

@HweinstockHweinstock commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Problem

There is no remove command!

Solution

Implement remove as a single command, taking the resource as an argument. Looking at the old CLI https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/, we basically duplicated this pattern many times, but here we instead do it generically.

Note: we don't yet support remove all, but one could imagine adding it as a resource type with special behavior.

Testing

unit tests with harness and runtime (since those are the only ones working e2e).

@github-actionsgithub-actionsBot added the agentcore-harness-reviewing AgentCore Harness review in progress label Aug 19, 2026
@github-actionsgithub-actionsBot removed the agentcore-harness-reviewing AgentCore Harness review in progress label Aug 19, 2026
@codecov-commenter

codecov-commenter commented Aug 19, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.14%. Comparing base (1a21206) to head (c0c2821).
⚠️ Report is 1 commits behind head on refactor.

Additional details and impacted files
@@ Coverage Diff @@## refactor #2037 +/- ##
=========================================
Coverage 97.13% 97.14% =========================================
Files 381 381 Lines 22782 22824 +42 =========================================
+ Hits 22130 22172 +42 
Misses 652 652 

☔ 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.

);
});

async function run(args: string[]) {

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.

as a follow-up, I think we can pull this and inProject below out into a common location (src/testing). I have a few open PRs that develop similar utils for this.

const agentCoreSpecPath = this.getProjectSpecPath(project);
const projectSpecKey = toProjectSpecKey(input.resourceType);

const existingProjectSpec = await this.json.read(agentCoreSpecPath, ProjectSpecSchema);

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.

we could probably re-use some logic from add, but want to wait before trying to generalize this.

@Hweinstock
Hweinstock marked this pull request as ready for review August 19, 2026 18:45
notgitika
notgitika previously approved these changes Aug 19, 2026

@notgitikanotgitika 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.

This PR looks good thanks for setting it up. I have a suggestion I would like addressed that I left a comment below on.

separately, I have a question for the future implementations we do: will we also be deleting any code we scaffold (for runtime and harness for instance) when the user runs this command?

I spent some time reviewing the code on main and it seems mixed.

For remove gateway target, it removes the code: https://github.com/aws/agentcore-cli/blob/main/src/cli/operations/remove/remove-gateway-target.ts#L201
Same for code based evals: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/EvaluatorPrimitive.ts#L261

however, for agent/runtime, we don't do the same: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/AgentPrimitive.tsx#L222

Can we decide and align on one experience before we start with the rest of the implementation?

Comment on lines +217 to +219
this.logger
.child({ input })
.warn(`unable to remove resource from project that does not exist.`);

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.

can we throw right after this? at this point, the handler would still return a user message like remove successful. I'm okay to keep it this way like a no-op but it might be a bit misleading.

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.

I think an idempotent delete is easier, especially if customers are using this in some kind of automation.

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.

I agree with keeping the successful exit code; idempotency here is useful. Though the removed successfully error messaging is very misleading.

As a nit I'd say we should maintain the success exit code, but add a mechanism for differentiating the result.

@Hweinstock

Copy link
Copy Markdown
ContributorAuthor

good callout, I think we should remove the scaffolded code to be consistent.

Comment threadsrc/core/project/manager.tsx Outdated
break;
}
} catch (e) {
throw new ProjectStateError(

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.

decided to throw here since it could lead to bad state. ex. i remove a runtime named 'X", then try to recreate (it would fail since the files still exist).

@notgitika

Copy link
Copy Markdown
Contributor

good callout, I think we should remove the scaffolded code to be consistent.

just had an offline discussion on why we decided not to delete the code early on.

I would lean on not deleting the code, since the user could wanna reuse the code if they maybe make some changes. That is the pattern we established with with agent/runtime initially but the following code with gateway targets/code based evals were regressions, since it wasn't documented properly.

what do you think?

@Hweinstock

Copy link
Copy Markdown
ContributorAuthor

responded internally, swapping back to original for now, we can add clean up later if we see a need.

@notgitikanotgitika 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.

Nice!

@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.

Left one comment on the non-existent resource handling. I do think the success error message is misleading and we should consider differentiating.

Definitely non-blocking for this PR and something we can think through. LGTM otherwise.

const existingProjectSpec = await this.json.read(agentCoreSpecPath, ProjectSpecSchema);

const existingResources = existingProjectSpec[projectSpecKey];
const newResources = existingResources.filter((r) => r.name !== input.name);

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.

Later, we can make this a helper function that could be used to prevent duplicates for add and update existing for update

describe("project remove", () => {
// Verifies that resources are removed from agentcore.json and the correct
// remaining resources are left.
test.each<RemoveCase>([

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.

nit: There should be a test that will make sure we don't delete customer's code

@jariy17

Copy link
Copy Markdown
Contributor

This PR looks good thanks for setting it up. I have a suggestion I would like addressed that I left a comment below on.

separately, I have a question for the future implementations we do: will we also be deleting any code we scaffold (for runtime and harness for instance) when the user runs this command?

I spent some time reviewing the code on main and it seems mixed.

For remove gateway target, it removes the code: https://github.com/aws/agentcore-cli/blob/main/src/cli/operations/remove/remove-gateway-target.ts#L201 Same for code based evals: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/EvaluatorPrimitive.ts#L261

however, for agent/runtime, we don't do the same: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/AgentPrimitive.tsx#L222

Can we decide and align on one experience before we start with the rest of the implementation?

I discussed with Harrison, I think we shouldn't delete their application code because it's their code. It's an easy two door decision if customers want this feature.

@jariy17
jariy17 merged commit e99b413 into aws:refactorAug 21, 2026
8 of 16 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Hweinstock@codecov-commenter@notgitika@jariy17@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): implement remove command by Hweinstock · Pull Request #2037 · aws/agentcore-cli · GitHub
Skip to content

feat(project): implement remove command - #2037

Merged
jariy17 merged 6 commits into
aws:refactorfrom
Hweinstock:feat/project-remove
Aug 21, 2026
Merged

feat(project): implement remove command#2037
jariy17 merged 6 commits into
aws:refactorfrom
Hweinstock:feat/project-remove

Conversation

@Hweinstock

@HweinstockHweinstock commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Problem

There is no remove command!

Solution

Implement remove as a single command, taking the resource as an argument. Looking at the old CLI https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/, we basically duplicated this pattern many times, but here we instead do it generically.

Note: we don't yet support remove all, but one could imagine adding it as a resource type with special behavior.

Testing

unit tests with harness and runtime (since those are the only ones working e2e).

@github-actionsgithub-actionsBot added the agentcore-harness-reviewing AgentCore Harness review in progress label Aug 19, 2026
@github-actionsgithub-actionsBot removed the agentcore-harness-reviewing AgentCore Harness review in progress label Aug 19, 2026
@codecov-commenter

codecov-commenter commented Aug 19, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.14%. Comparing base (1a21206) to head (c0c2821).
⚠️ Report is 1 commits behind head on refactor.

Additional details and impacted files
@@ Coverage Diff @@## refactor #2037 +/- ##
=========================================
Coverage 97.13% 97.14% =========================================
Files 381 381 Lines 22782 22824 +42 =========================================
+ Hits 22130 22172 +42 
Misses 652 652 

☔ 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.

);
});

async function run(args: string[]) {

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.

as a follow-up, I think we can pull this and inProject below out into a common location (src/testing). I have a few open PRs that develop similar utils for this.

const agentCoreSpecPath = this.getProjectSpecPath(project);
const projectSpecKey = toProjectSpecKey(input.resourceType);

const existingProjectSpec = await this.json.read(agentCoreSpecPath, ProjectSpecSchema);

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.

we could probably re-use some logic from add, but want to wait before trying to generalize this.

@Hweinstock
Hweinstock marked this pull request as ready for review August 19, 2026 18:45
notgitika
notgitika previously approved these changes Aug 19, 2026

@notgitikanotgitika 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.

This PR looks good thanks for setting it up. I have a suggestion I would like addressed that I left a comment below on.

separately, I have a question for the future implementations we do: will we also be deleting any code we scaffold (for runtime and harness for instance) when the user runs this command?

I spent some time reviewing the code on main and it seems mixed.

For remove gateway target, it removes the code: https://github.com/aws/agentcore-cli/blob/main/src/cli/operations/remove/remove-gateway-target.ts#L201
Same for code based evals: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/EvaluatorPrimitive.ts#L261

however, for agent/runtime, we don't do the same: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/AgentPrimitive.tsx#L222

Can we decide and align on one experience before we start with the rest of the implementation?

Comment on lines +217 to +219
this.logger
.child({ input })
.warn(`unable to remove resource from project that does not exist.`);

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.

can we throw right after this? at this point, the handler would still return a user message like remove successful. I'm okay to keep it this way like a no-op but it might be a bit misleading.

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.

I think an idempotent delete is easier, especially if customers are using this in some kind of automation.

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.

I agree with keeping the successful exit code; idempotency here is useful. Though the removed successfully error messaging is very misleading.

As a nit I'd say we should maintain the success exit code, but add a mechanism for differentiating the result.

@Hweinstock

Copy link
Copy Markdown
ContributorAuthor

good callout, I think we should remove the scaffolded code to be consistent.

Comment threadsrc/core/project/manager.tsx Outdated
break;
}
} catch (e) {
throw new ProjectStateError(

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.

decided to throw here since it could lead to bad state. ex. i remove a runtime named 'X", then try to recreate (it would fail since the files still exist).

@notgitika

Copy link
Copy Markdown
Contributor

good callout, I think we should remove the scaffolded code to be consistent.

just had an offline discussion on why we decided not to delete the code early on.

I would lean on not deleting the code, since the user could wanna reuse the code if they maybe make some changes. That is the pattern we established with with agent/runtime initially but the following code with gateway targets/code based evals were regressions, since it wasn't documented properly.

what do you think?

@Hweinstock

Copy link
Copy Markdown
ContributorAuthor

responded internally, swapping back to original for now, we can add clean up later if we see a need.

@notgitikanotgitika 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.

Nice!

@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.

Left one comment on the non-existent resource handling. I do think the success error message is misleading and we should consider differentiating.

Definitely non-blocking for this PR and something we can think through. LGTM otherwise.

const existingProjectSpec = await this.json.read(agentCoreSpecPath, ProjectSpecSchema);

const existingResources = existingProjectSpec[projectSpecKey];
const newResources = existingResources.filter((r) => r.name !== input.name);

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.

Later, we can make this a helper function that could be used to prevent duplicates for add and update existing for update

describe("project remove", () => {
// Verifies that resources are removed from agentcore.json and the correct
// remaining resources are left.
test.each<RemoveCase>([

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.

nit: There should be a test that will make sure we don't delete customer's code

@jariy17

Copy link
Copy Markdown
Contributor

This PR looks good thanks for setting it up. I have a suggestion I would like addressed that I left a comment below on.

separately, I have a question for the future implementations we do: will we also be deleting any code we scaffold (for runtime and harness for instance) when the user runs this command?

I spent some time reviewing the code on main and it seems mixed.

For remove gateway target, it removes the code: https://github.com/aws/agentcore-cli/blob/main/src/cli/operations/remove/remove-gateway-target.ts#L201 Same for code based evals: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/EvaluatorPrimitive.ts#L261

however, for agent/runtime, we don't do the same: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/AgentPrimitive.tsx#L222

Can we decide and align on one experience before we start with the rest of the implementation?

I discussed with Harrison, I think we shouldn't delete their application code because it's their code. It's an easy two door decision if customers want this feature.

@jariy17
jariy17 merged commit e99b413 into aws:refactorAug 21, 2026
8 of 16 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Hweinstock@codecov-commenter@notgitika@jariy17@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): implement remove command by Hweinstock · Pull Request #2037 · aws/agentcore-cli · GitHub
Skip to content

feat(project): implement remove command - #2037

Merged
jariy17 merged 6 commits into
aws:refactorfrom
Hweinstock:feat/project-remove
Aug 21, 2026
Merged

feat(project): implement remove command#2037
jariy17 merged 6 commits into
aws:refactorfrom
Hweinstock:feat/project-remove

Conversation

@Hweinstock

@HweinstockHweinstock commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Problem

There is no remove command!

Solution

Implement remove as a single command, taking the resource as an argument. Looking at the old CLI https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/, we basically duplicated this pattern many times, but here we instead do it generically.

Note: we don't yet support remove all, but one could imagine adding it as a resource type with special behavior.

Testing

unit tests with harness and runtime (since those are the only ones working e2e).

@github-actionsgithub-actionsBot added the agentcore-harness-reviewing AgentCore Harness review in progress label Aug 19, 2026
@github-actionsgithub-actionsBot removed the agentcore-harness-reviewing AgentCore Harness review in progress label Aug 19, 2026
@codecov-commenter

codecov-commenter commented Aug 19, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.14%. Comparing base (1a21206) to head (c0c2821).
⚠️ Report is 1 commits behind head on refactor.

Additional details and impacted files
@@ Coverage Diff @@## refactor #2037 +/- ##
=========================================
Coverage 97.13% 97.14% =========================================
Files 381 381 Lines 22782 22824 +42 =========================================
+ Hits 22130 22172 +42 
Misses 652 652 

☔ 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.

);
});

async function run(args: string[]) {

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.

as a follow-up, I think we can pull this and inProject below out into a common location (src/testing). I have a few open PRs that develop similar utils for this.

const agentCoreSpecPath = this.getProjectSpecPath(project);
const projectSpecKey = toProjectSpecKey(input.resourceType);

const existingProjectSpec = await this.json.read(agentCoreSpecPath, ProjectSpecSchema);

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.

we could probably re-use some logic from add, but want to wait before trying to generalize this.

@Hweinstock
Hweinstock marked this pull request as ready for review August 19, 2026 18:45
notgitika
notgitika previously approved these changes Aug 19, 2026

@notgitikanotgitika 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.

This PR looks good thanks for setting it up. I have a suggestion I would like addressed that I left a comment below on.

separately, I have a question for the future implementations we do: will we also be deleting any code we scaffold (for runtime and harness for instance) when the user runs this command?

I spent some time reviewing the code on main and it seems mixed.

For remove gateway target, it removes the code: https://github.com/aws/agentcore-cli/blob/main/src/cli/operations/remove/remove-gateway-target.ts#L201
Same for code based evals: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/EvaluatorPrimitive.ts#L261

however, for agent/runtime, we don't do the same: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/AgentPrimitive.tsx#L222

Can we decide and align on one experience before we start with the rest of the implementation?

Comment on lines +217 to +219
this.logger
.child({ input })
.warn(`unable to remove resource from project that does not exist.`);

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.

can we throw right after this? at this point, the handler would still return a user message like remove successful. I'm okay to keep it this way like a no-op but it might be a bit misleading.

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.

I think an idempotent delete is easier, especially if customers are using this in some kind of automation.

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.

I agree with keeping the successful exit code; idempotency here is useful. Though the removed successfully error messaging is very misleading.

As a nit I'd say we should maintain the success exit code, but add a mechanism for differentiating the result.

@Hweinstock

Copy link
Copy Markdown
ContributorAuthor

good callout, I think we should remove the scaffolded code to be consistent.

Comment threadsrc/core/project/manager.tsx Outdated
break;
}
} catch (e) {
throw new ProjectStateError(

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.

decided to throw here since it could lead to bad state. ex. i remove a runtime named 'X", then try to recreate (it would fail since the files still exist).

@notgitika

Copy link
Copy Markdown
Contributor

good callout, I think we should remove the scaffolded code to be consistent.

just had an offline discussion on why we decided not to delete the code early on.

I would lean on not deleting the code, since the user could wanna reuse the code if they maybe make some changes. That is the pattern we established with with agent/runtime initially but the following code with gateway targets/code based evals were regressions, since it wasn't documented properly.

what do you think?

@Hweinstock

Copy link
Copy Markdown
ContributorAuthor

responded internally, swapping back to original for now, we can add clean up later if we see a need.

@notgitikanotgitika 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.

Nice!

@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.

Left one comment on the non-existent resource handling. I do think the success error message is misleading and we should consider differentiating.

Definitely non-blocking for this PR and something we can think through. LGTM otherwise.

const existingProjectSpec = await this.json.read(agentCoreSpecPath, ProjectSpecSchema);

const existingResources = existingProjectSpec[projectSpecKey];
const newResources = existingResources.filter((r) => r.name !== input.name);

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.

Later, we can make this a helper function that could be used to prevent duplicates for add and update existing for update

describe("project remove", () => {
// Verifies that resources are removed from agentcore.json and the correct
// remaining resources are left.
test.each<RemoveCase>([

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.

nit: There should be a test that will make sure we don't delete customer's code

@jariy17

Copy link
Copy Markdown
Contributor

This PR looks good thanks for setting it up. I have a suggestion I would like addressed that I left a comment below on.

separately, I have a question for the future implementations we do: will we also be deleting any code we scaffold (for runtime and harness for instance) when the user runs this command?

I spent some time reviewing the code on main and it seems mixed.

For remove gateway target, it removes the code: https://github.com/aws/agentcore-cli/blob/main/src/cli/operations/remove/remove-gateway-target.ts#L201 Same for code based evals: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/EvaluatorPrimitive.ts#L261

however, for agent/runtime, we don't do the same: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/AgentPrimitive.tsx#L222

Can we decide and align on one experience before we start with the rest of the implementation?

I discussed with Harrison, I think we shouldn't delete their application code because it's their code. It's an easy two door decision if customers want this feature.

@jariy17
jariy17 merged commit e99b413 into aws:refactorAug 21, 2026
8 of 16 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Hweinstock@codecov-commenter@notgitika@jariy17@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): implement remove command by Hweinstock · Pull Request #2037 · aws/agentcore-cli · GitHub
Skip to content

feat(project): implement remove command - #2037

Merged
jariy17 merged 6 commits into
aws:refactorfrom
Hweinstock:feat/project-remove
Aug 21, 2026
Merged

feat(project): implement remove command#2037
jariy17 merged 6 commits into
aws:refactorfrom
Hweinstock:feat/project-remove

Conversation

@Hweinstock

@HweinstockHweinstock commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Problem

There is no remove command!

Solution

Implement remove as a single command, taking the resource as an argument. Looking at the old CLI https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/, we basically duplicated this pattern many times, but here we instead do it generically.

Note: we don't yet support remove all, but one could imagine adding it as a resource type with special behavior.

Testing

unit tests with harness and runtime (since those are the only ones working e2e).

@github-actionsgithub-actionsBot added the agentcore-harness-reviewing AgentCore Harness review in progress label Aug 19, 2026
@github-actionsgithub-actionsBot removed the agentcore-harness-reviewing AgentCore Harness review in progress label Aug 19, 2026
@codecov-commenter

codecov-commenter commented Aug 19, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.14%. Comparing base (1a21206) to head (c0c2821).
⚠️ Report is 1 commits behind head on refactor.

Additional details and impacted files
@@ Coverage Diff @@## refactor #2037 +/- ##
=========================================
Coverage 97.13% 97.14% =========================================
Files 381 381 Lines 22782 22824 +42 =========================================
+ Hits 22130 22172 +42 
Misses 652 652 

☔ 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.

);
});

async function run(args: string[]) {

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.

as a follow-up, I think we can pull this and inProject below out into a common location (src/testing). I have a few open PRs that develop similar utils for this.

const agentCoreSpecPath = this.getProjectSpecPath(project);
const projectSpecKey = toProjectSpecKey(input.resourceType);

const existingProjectSpec = await this.json.read(agentCoreSpecPath, ProjectSpecSchema);

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.

we could probably re-use some logic from add, but want to wait before trying to generalize this.

@Hweinstock
Hweinstock marked this pull request as ready for review August 19, 2026 18:45
notgitika
notgitika previously approved these changes Aug 19, 2026

@notgitikanotgitika 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.

This PR looks good thanks for setting it up. I have a suggestion I would like addressed that I left a comment below on.

separately, I have a question for the future implementations we do: will we also be deleting any code we scaffold (for runtime and harness for instance) when the user runs this command?

I spent some time reviewing the code on main and it seems mixed.

For remove gateway target, it removes the code: https://github.com/aws/agentcore-cli/blob/main/src/cli/operations/remove/remove-gateway-target.ts#L201
Same for code based evals: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/EvaluatorPrimitive.ts#L261

however, for agent/runtime, we don't do the same: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/AgentPrimitive.tsx#L222

Can we decide and align on one experience before we start with the rest of the implementation?

Comment on lines +217 to +219
this.logger
.child({ input })
.warn(`unable to remove resource from project that does not exist.`);

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.

can we throw right after this? at this point, the handler would still return a user message like remove successful. I'm okay to keep it this way like a no-op but it might be a bit misleading.

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.

I think an idempotent delete is easier, especially if customers are using this in some kind of automation.

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.

I agree with keeping the successful exit code; idempotency here is useful. Though the removed successfully error messaging is very misleading.

As a nit I'd say we should maintain the success exit code, but add a mechanism for differentiating the result.

@Hweinstock

Copy link
Copy Markdown
ContributorAuthor

good callout, I think we should remove the scaffolded code to be consistent.

Comment threadsrc/core/project/manager.tsx Outdated
break;
}
} catch (e) {
throw new ProjectStateError(

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.

decided to throw here since it could lead to bad state. ex. i remove a runtime named 'X", then try to recreate (it would fail since the files still exist).

@notgitika

Copy link
Copy Markdown
Contributor

good callout, I think we should remove the scaffolded code to be consistent.

just had an offline discussion on why we decided not to delete the code early on.

I would lean on not deleting the code, since the user could wanna reuse the code if they maybe make some changes. That is the pattern we established with with agent/runtime initially but the following code with gateway targets/code based evals were regressions, since it wasn't documented properly.

what do you think?

@Hweinstock

Copy link
Copy Markdown
ContributorAuthor

responded internally, swapping back to original for now, we can add clean up later if we see a need.

@notgitikanotgitika 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.

Nice!

@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.

Left one comment on the non-existent resource handling. I do think the success error message is misleading and we should consider differentiating.

Definitely non-blocking for this PR and something we can think through. LGTM otherwise.

const existingProjectSpec = await this.json.read(agentCoreSpecPath, ProjectSpecSchema);

const existingResources = existingProjectSpec[projectSpecKey];
const newResources = existingResources.filter((r) => r.name !== input.name);

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.

Later, we can make this a helper function that could be used to prevent duplicates for add and update existing for update

describe("project remove", () => {
// Verifies that resources are removed from agentcore.json and the correct
// remaining resources are left.
test.each<RemoveCase>([

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.

nit: There should be a test that will make sure we don't delete customer's code

@jariy17

Copy link
Copy Markdown
Contributor

This PR looks good thanks for setting it up. I have a suggestion I would like addressed that I left a comment below on.

separately, I have a question for the future implementations we do: will we also be deleting any code we scaffold (for runtime and harness for instance) when the user runs this command?

I spent some time reviewing the code on main and it seems mixed.

For remove gateway target, it removes the code: https://github.com/aws/agentcore-cli/blob/main/src/cli/operations/remove/remove-gateway-target.ts#L201 Same for code based evals: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/EvaluatorPrimitive.ts#L261

however, for agent/runtime, we don't do the same: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/AgentPrimitive.tsx#L222

Can we decide and align on one experience before we start with the rest of the implementation?

I discussed with Harrison, I think we shouldn't delete their application code because it's their code. It's an easy two door decision if customers want this feature.

@jariy17
jariy17 merged commit e99b413 into aws:refactorAug 21, 2026
8 of 16 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Hweinstock@codecov-commenter@notgitika@jariy17@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): implement remove command by Hweinstock · Pull Request #2037 · aws/agentcore-cli · GitHub
Skip to content

feat(project): implement remove command - #2037

Merged
jariy17 merged 6 commits into
aws:refactorfrom
Hweinstock:feat/project-remove
Aug 21, 2026
Merged

feat(project): implement remove command#2037
jariy17 merged 6 commits into
aws:refactorfrom
Hweinstock:feat/project-remove

Conversation

@Hweinstock

@HweinstockHweinstock commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Problem

There is no remove command!

Solution

Implement remove as a single command, taking the resource as an argument. Looking at the old CLI https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/, we basically duplicated this pattern many times, but here we instead do it generically.

Note: we don't yet support remove all, but one could imagine adding it as a resource type with special behavior.

Testing

unit tests with harness and runtime (since those are the only ones working e2e).

@github-actionsgithub-actionsBot added the agentcore-harness-reviewing AgentCore Harness review in progress label Aug 19, 2026
@github-actionsgithub-actionsBot removed the agentcore-harness-reviewing AgentCore Harness review in progress label Aug 19, 2026
@codecov-commenter

codecov-commenter commented Aug 19, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.14%. Comparing base (1a21206) to head (c0c2821).
⚠️ Report is 1 commits behind head on refactor.

Additional details and impacted files
@@ Coverage Diff @@## refactor #2037 +/- ##
=========================================
Coverage 97.13% 97.14% =========================================
Files 381 381 Lines 22782 22824 +42 =========================================
+ Hits 22130 22172 +42 
Misses 652 652 

☔ 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.

);
});

async function run(args: string[]) {

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.

as a follow-up, I think we can pull this and inProject below out into a common location (src/testing). I have a few open PRs that develop similar utils for this.

const agentCoreSpecPath = this.getProjectSpecPath(project);
const projectSpecKey = toProjectSpecKey(input.resourceType);

const existingProjectSpec = await this.json.read(agentCoreSpecPath, ProjectSpecSchema);

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.

we could probably re-use some logic from add, but want to wait before trying to generalize this.

@Hweinstock
Hweinstock marked this pull request as ready for review August 19, 2026 18:45
notgitika
notgitika previously approved these changes Aug 19, 2026

@notgitikanotgitika 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.

This PR looks good thanks for setting it up. I have a suggestion I would like addressed that I left a comment below on.

separately, I have a question for the future implementations we do: will we also be deleting any code we scaffold (for runtime and harness for instance) when the user runs this command?

I spent some time reviewing the code on main and it seems mixed.

For remove gateway target, it removes the code: https://github.com/aws/agentcore-cli/blob/main/src/cli/operations/remove/remove-gateway-target.ts#L201
Same for code based evals: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/EvaluatorPrimitive.ts#L261

however, for agent/runtime, we don't do the same: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/AgentPrimitive.tsx#L222

Can we decide and align on one experience before we start with the rest of the implementation?

Comment on lines +217 to +219
this.logger
.child({ input })
.warn(`unable to remove resource from project that does not exist.`);

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.

can we throw right after this? at this point, the handler would still return a user message like remove successful. I'm okay to keep it this way like a no-op but it might be a bit misleading.

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.

I think an idempotent delete is easier, especially if customers are using this in some kind of automation.

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.

I agree with keeping the successful exit code; idempotency here is useful. Though the removed successfully error messaging is very misleading.

As a nit I'd say we should maintain the success exit code, but add a mechanism for differentiating the result.

@Hweinstock

Copy link
Copy Markdown
ContributorAuthor

good callout, I think we should remove the scaffolded code to be consistent.

Comment threadsrc/core/project/manager.tsx Outdated
break;
}
} catch (e) {
throw new ProjectStateError(

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.

decided to throw here since it could lead to bad state. ex. i remove a runtime named 'X", then try to recreate (it would fail since the files still exist).

@notgitika

Copy link
Copy Markdown
Contributor

good callout, I think we should remove the scaffolded code to be consistent.

just had an offline discussion on why we decided not to delete the code early on.

I would lean on not deleting the code, since the user could wanna reuse the code if they maybe make some changes. That is the pattern we established with with agent/runtime initially but the following code with gateway targets/code based evals were regressions, since it wasn't documented properly.

what do you think?

@Hweinstock

Copy link
Copy Markdown
ContributorAuthor

responded internally, swapping back to original for now, we can add clean up later if we see a need.

@notgitikanotgitika 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.

Nice!

@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.

Left one comment on the non-existent resource handling. I do think the success error message is misleading and we should consider differentiating.

Definitely non-blocking for this PR and something we can think through. LGTM otherwise.

const existingProjectSpec = await this.json.read(agentCoreSpecPath, ProjectSpecSchema);

const existingResources = existingProjectSpec[projectSpecKey];
const newResources = existingResources.filter((r) => r.name !== input.name);

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.

Later, we can make this a helper function that could be used to prevent duplicates for add and update existing for update

describe("project remove", () => {
// Verifies that resources are removed from agentcore.json and the correct
// remaining resources are left.
test.each<RemoveCase>([

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.

nit: There should be a test that will make sure we don't delete customer's code

@jariy17

Copy link
Copy Markdown
Contributor

This PR looks good thanks for setting it up. I have a suggestion I would like addressed that I left a comment below on.

separately, I have a question for the future implementations we do: will we also be deleting any code we scaffold (for runtime and harness for instance) when the user runs this command?

I spent some time reviewing the code on main and it seems mixed.

For remove gateway target, it removes the code: https://github.com/aws/agentcore-cli/blob/main/src/cli/operations/remove/remove-gateway-target.ts#L201 Same for code based evals: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/EvaluatorPrimitive.ts#L261

however, for agent/runtime, we don't do the same: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/AgentPrimitive.tsx#L222

Can we decide and align on one experience before we start with the rest of the implementation?

I discussed with Harrison, I think we shouldn't delete their application code because it's their code. It's an easy two door decision if customers want this feature.

@jariy17
jariy17 merged commit e99b413 into aws:refactorAug 21, 2026
8 of 16 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Hweinstock@codecov-commenter@notgitika@jariy17@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): implement remove command by Hweinstock · Pull Request #2037 · aws/agentcore-cli · GitHub
Skip to content

feat(project): implement remove command - #2037

Merged
jariy17 merged 6 commits into
aws:refactorfrom
Hweinstock:feat/project-remove
Aug 21, 2026
Merged

feat(project): implement remove command#2037
jariy17 merged 6 commits into
aws:refactorfrom
Hweinstock:feat/project-remove

Conversation

@Hweinstock

@HweinstockHweinstock commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Problem

There is no remove command!

Solution

Implement remove as a single command, taking the resource as an argument. Looking at the old CLI https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/, we basically duplicated this pattern many times, but here we instead do it generically.

Note: we don't yet support remove all, but one could imagine adding it as a resource type with special behavior.

Testing

unit tests with harness and runtime (since those are the only ones working e2e).

@github-actionsgithub-actionsBot added the agentcore-harness-reviewing AgentCore Harness review in progress label Aug 19, 2026
@github-actionsgithub-actionsBot removed the agentcore-harness-reviewing AgentCore Harness review in progress label Aug 19, 2026
@codecov-commenter

codecov-commenter commented Aug 19, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.14%. Comparing base (1a21206) to head (c0c2821).
⚠️ Report is 1 commits behind head on refactor.

Additional details and impacted files
@@ Coverage Diff @@## refactor #2037 +/- ##
=========================================
Coverage 97.13% 97.14% =========================================
Files 381 381 Lines 22782 22824 +42 =========================================
+ Hits 22130 22172 +42 
Misses 652 652 

☔ 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.

);
});

async function run(args: string[]) {

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.

as a follow-up, I think we can pull this and inProject below out into a common location (src/testing). I have a few open PRs that develop similar utils for this.

const agentCoreSpecPath = this.getProjectSpecPath(project);
const projectSpecKey = toProjectSpecKey(input.resourceType);

const existingProjectSpec = await this.json.read(agentCoreSpecPath, ProjectSpecSchema);

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.

we could probably re-use some logic from add, but want to wait before trying to generalize this.

@Hweinstock
Hweinstock marked this pull request as ready for review August 19, 2026 18:45
notgitika
notgitika previously approved these changes Aug 19, 2026

@notgitikanotgitika 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.

This PR looks good thanks for setting it up. I have a suggestion I would like addressed that I left a comment below on.

separately, I have a question for the future implementations we do: will we also be deleting any code we scaffold (for runtime and harness for instance) when the user runs this command?

I spent some time reviewing the code on main and it seems mixed.

For remove gateway target, it removes the code: https://github.com/aws/agentcore-cli/blob/main/src/cli/operations/remove/remove-gateway-target.ts#L201
Same for code based evals: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/EvaluatorPrimitive.ts#L261

however, for agent/runtime, we don't do the same: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/AgentPrimitive.tsx#L222

Can we decide and align on one experience before we start with the rest of the implementation?

Comment on lines +217 to +219
this.logger
.child({ input })
.warn(`unable to remove resource from project that does not exist.`);

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.

can we throw right after this? at this point, the handler would still return a user message like remove successful. I'm okay to keep it this way like a no-op but it might be a bit misleading.

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.

I think an idempotent delete is easier, especially if customers are using this in some kind of automation.

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.

I agree with keeping the successful exit code; idempotency here is useful. Though the removed successfully error messaging is very misleading.

As a nit I'd say we should maintain the success exit code, but add a mechanism for differentiating the result.

@Hweinstock

Copy link
Copy Markdown
ContributorAuthor

good callout, I think we should remove the scaffolded code to be consistent.

Comment threadsrc/core/project/manager.tsx Outdated
break;
}
} catch (e) {
throw new ProjectStateError(

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.

decided to throw here since it could lead to bad state. ex. i remove a runtime named 'X", then try to recreate (it would fail since the files still exist).

@notgitika

Copy link
Copy Markdown
Contributor

good callout, I think we should remove the scaffolded code to be consistent.

just had an offline discussion on why we decided not to delete the code early on.

I would lean on not deleting the code, since the user could wanna reuse the code if they maybe make some changes. That is the pattern we established with with agent/runtime initially but the following code with gateway targets/code based evals were regressions, since it wasn't documented properly.

what do you think?

@Hweinstock

Copy link
Copy Markdown
ContributorAuthor

responded internally, swapping back to original for now, we can add clean up later if we see a need.

@notgitikanotgitika 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.

Nice!

@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.

Left one comment on the non-existent resource handling. I do think the success error message is misleading and we should consider differentiating.

Definitely non-blocking for this PR and something we can think through. LGTM otherwise.

const existingProjectSpec = await this.json.read(agentCoreSpecPath, ProjectSpecSchema);

const existingResources = existingProjectSpec[projectSpecKey];
const newResources = existingResources.filter((r) => r.name !== input.name);

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.

Later, we can make this a helper function that could be used to prevent duplicates for add and update existing for update

describe("project remove", () => {
// Verifies that resources are removed from agentcore.json and the correct
// remaining resources are left.
test.each<RemoveCase>([

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.

nit: There should be a test that will make sure we don't delete customer's code

@jariy17

Copy link
Copy Markdown
Contributor

This PR looks good thanks for setting it up. I have a suggestion I would like addressed that I left a comment below on.

separately, I have a question for the future implementations we do: will we also be deleting any code we scaffold (for runtime and harness for instance) when the user runs this command?

I spent some time reviewing the code on main and it seems mixed.

For remove gateway target, it removes the code: https://github.com/aws/agentcore-cli/blob/main/src/cli/operations/remove/remove-gateway-target.ts#L201 Same for code based evals: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/EvaluatorPrimitive.ts#L261

however, for agent/runtime, we don't do the same: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/AgentPrimitive.tsx#L222

Can we decide and align on one experience before we start with the rest of the implementation?

I discussed with Harrison, I think we shouldn't delete their application code because it's their code. It's an easy two door decision if customers want this feature.

@jariy17
jariy17 merged commit e99b413 into aws:refactorAug 21, 2026
8 of 16 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Hweinstock@codecov-commenter@notgitika@jariy17@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): implement remove command by Hweinstock · Pull Request #2037 · aws/agentcore-cli · GitHub
Skip to content

feat(project): implement remove command - #2037

Merged
jariy17 merged 6 commits into
aws:refactorfrom
Hweinstock:feat/project-remove
Aug 21, 2026
Merged

feat(project): implement remove command#2037
jariy17 merged 6 commits into
aws:refactorfrom
Hweinstock:feat/project-remove

Conversation

@Hweinstock

@HweinstockHweinstock commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Problem

There is no remove command!

Solution

Implement remove as a single command, taking the resource as an argument. Looking at the old CLI https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/, we basically duplicated this pattern many times, but here we instead do it generically.

Note: we don't yet support remove all, but one could imagine adding it as a resource type with special behavior.

Testing

unit tests with harness and runtime (since those are the only ones working e2e).

@github-actionsgithub-actionsBot added the agentcore-harness-reviewing AgentCore Harness review in progress label Aug 19, 2026
@github-actionsgithub-actionsBot removed the agentcore-harness-reviewing AgentCore Harness review in progress label Aug 19, 2026
@codecov-commenter

codecov-commenter commented Aug 19, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.14%. Comparing base (1a21206) to head (c0c2821).
⚠️ Report is 1 commits behind head on refactor.

Additional details and impacted files
@@ Coverage Diff @@## refactor #2037 +/- ##
=========================================
Coverage 97.13% 97.14% =========================================
Files 381 381 Lines 22782 22824 +42 =========================================
+ Hits 22130 22172 +42 
Misses 652 652 

☔ 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.

);
});

async function run(args: string[]) {

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.

as a follow-up, I think we can pull this and inProject below out into a common location (src/testing). I have a few open PRs that develop similar utils for this.

const agentCoreSpecPath = this.getProjectSpecPath(project);
const projectSpecKey = toProjectSpecKey(input.resourceType);

const existingProjectSpec = await this.json.read(agentCoreSpecPath, ProjectSpecSchema);

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.

we could probably re-use some logic from add, but want to wait before trying to generalize this.

@Hweinstock
Hweinstock marked this pull request as ready for review August 19, 2026 18:45
notgitika
notgitika previously approved these changes Aug 19, 2026

@notgitikanotgitika 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.

This PR looks good thanks for setting it up. I have a suggestion I would like addressed that I left a comment below on.

separately, I have a question for the future implementations we do: will we also be deleting any code we scaffold (for runtime and harness for instance) when the user runs this command?

I spent some time reviewing the code on main and it seems mixed.

For remove gateway target, it removes the code: https://github.com/aws/agentcore-cli/blob/main/src/cli/operations/remove/remove-gateway-target.ts#L201
Same for code based evals: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/EvaluatorPrimitive.ts#L261

however, for agent/runtime, we don't do the same: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/AgentPrimitive.tsx#L222

Can we decide and align on one experience before we start with the rest of the implementation?

Comment on lines +217 to +219
this.logger
.child({ input })
.warn(`unable to remove resource from project that does not exist.`);

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.

can we throw right after this? at this point, the handler would still return a user message like remove successful. I'm okay to keep it this way like a no-op but it might be a bit misleading.

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.

I think an idempotent delete is easier, especially if customers are using this in some kind of automation.

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.

I agree with keeping the successful exit code; idempotency here is useful. Though the removed successfully error messaging is very misleading.

As a nit I'd say we should maintain the success exit code, but add a mechanism for differentiating the result.

@Hweinstock

Copy link
Copy Markdown
ContributorAuthor

good callout, I think we should remove the scaffolded code to be consistent.

Comment threadsrc/core/project/manager.tsx Outdated
break;
}
} catch (e) {
throw new ProjectStateError(

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.

decided to throw here since it could lead to bad state. ex. i remove a runtime named 'X", then try to recreate (it would fail since the files still exist).

@notgitika

Copy link
Copy Markdown
Contributor

good callout, I think we should remove the scaffolded code to be consistent.

just had an offline discussion on why we decided not to delete the code early on.

I would lean on not deleting the code, since the user could wanna reuse the code if they maybe make some changes. That is the pattern we established with with agent/runtime initially but the following code with gateway targets/code based evals were regressions, since it wasn't documented properly.

what do you think?

@Hweinstock

Copy link
Copy Markdown
ContributorAuthor

responded internally, swapping back to original for now, we can add clean up later if we see a need.

@notgitikanotgitika 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.

Nice!

@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.

Left one comment on the non-existent resource handling. I do think the success error message is misleading and we should consider differentiating.

Definitely non-blocking for this PR and something we can think through. LGTM otherwise.

const existingProjectSpec = await this.json.read(agentCoreSpecPath, ProjectSpecSchema);

const existingResources = existingProjectSpec[projectSpecKey];
const newResources = existingResources.filter((r) => r.name !== input.name);

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.

Later, we can make this a helper function that could be used to prevent duplicates for add and update existing for update

describe("project remove", () => {
// Verifies that resources are removed from agentcore.json and the correct
// remaining resources are left.
test.each<RemoveCase>([

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.

nit: There should be a test that will make sure we don't delete customer's code

@jariy17

Copy link
Copy Markdown
Contributor

This PR looks good thanks for setting it up. I have a suggestion I would like addressed that I left a comment below on.

separately, I have a question for the future implementations we do: will we also be deleting any code we scaffold (for runtime and harness for instance) when the user runs this command?

I spent some time reviewing the code on main and it seems mixed.

For remove gateway target, it removes the code: https://github.com/aws/agentcore-cli/blob/main/src/cli/operations/remove/remove-gateway-target.ts#L201 Same for code based evals: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/EvaluatorPrimitive.ts#L261

however, for agent/runtime, we don't do the same: https://github.com/aws/agentcore-cli/blob/main/src/cli/primitives/AgentPrimitive.tsx#L222

Can we decide and align on one experience before we start with the rest of the implementation?

I discussed with Harrison, I think we shouldn't delete their application code because it's their code. It's an easy two door decision if customers want this feature.

@jariy17
jariy17 merged commit e99b413 into aws:refactorAug 21, 2026
8 of 16 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

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