Skip to content

feat(project): implement project status - #2165

Draft
jariy17 wants to merge 15 commits into
refactorfrom
feat/project-status
Draft

feat(project): implement project status#2165
jariy17 wants to merge 15 commits into
refactorfrom
feat/project-status

Conversation

@jariy17

@jariy17 jariy17 commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

The status handler calls ProjectManager.resolveProjectResources to build its report.

resolveProjectResources already resolved runtimes and harnesses by reading CfnOutput
values via DescribeStacks, returning each one's bare id. This changes it to return every
resource's ARN, omitting the identifier when the resource is not deployed.

Given an agentcore.json like this:

{
  "name": "orders",
  "version": 1,
  "runtimes": [{ "name": "assistant" }],
  "memories": [{ "name": "user_mem" }],
  "agentCoreGateways": [
    { "name": "tools", "targets": [{ "name": "search" }] }
  ],
  "policyEngines": [
    { "name": "guards", "policies": [{ "name": "no_pii" }] }
  ]
}

resolveProjectResources returns:

{
  "target": { "name": "prod", "account": "111122223333", "region": "us-west-2" },
  "resources": [
    {
      "resourceType": "runtime",
      "name": "assistant",
      "deploymentState": "deployed",
      "id": "arn:aws:bedrock-agentcore:us-west-2:111122223333:runtime/assistant-AbCdEf1234"
    },
    {
      "resourceType": "memory",
      "name": "user_mem",
      "deploymentState": "deployed",
      "id": "arn:aws:bedrock-agentcore:us-west-2:111122223333:memory/user_mem-K3l4M5n6O7"
    },
    {
      "resourceType": "gateway",
      "name": "tools",
      "deploymentState": "local-only"
    },
    {
      "resourceType": "gateway-target",
      "name": "search",
      "parent": "tools",
      "deploymentState": "local-only"
    },
    {
      "resourceType": "policy-engine",
      "name": "guards",
      "deploymentState": "deployed",
      "id": "arn:aws:bedrock-agentcore:us-west-2:111122223333:policy-engine/guards-1a2b3c"
    },
    {
      "resourceType": "policy",
      "name": "no_pii",
      "parent": "guards",
      "deploymentState": "deployed",
      "id": "arn:aws:bedrock-agentcore:us-west-2:111122223333:policy/no_pii-7d8e9f"
    }
  ]
}

The handler then nests children such as gateway-target under their parent to produce:

{
  "projectName": "orders",
  "target": "prod",
  "region": "us-west-2",
  "resources": [
    {
      "resourceType": "runtime",
      "name": "assistant",
      "deploymentState": "deployed",
      "identifier": "arn:aws:bedrock-agentcore:us-west-2:111122223333:runtime/assistant-AbCdEf1234"
    },
    {
      "resourceType": "memory",
      "name": "user_mem",
      "deploymentState": "deployed",
      "identifier": "arn:aws:bedrock-agentcore:us-west-2:111122223333:memory/user_mem-K3l4M5n6O7"
    },
    {
      "resourceType": "gateway",
      "name": "tools",
      "deploymentState": "local-only",
      "children": [
        {
          "resourceType": "gateway-target",
          "name": "search",
          "deploymentState": "local-only"
        }
      ]
    },
    {
      "resourceType": "policy-engine",
      "name": "guards",
      "deploymentState": "deployed",
      "identifier": "arn:aws:bedrock-agentcore:us-west-2:111122223333:policy-engine/guards-1a2b3c",
      "children": [
        {
          "resourceType": "policy",
          "name": "no_pii",
          "deploymentState": "deployed",
          "identifier": "arn:aws:bedrock-agentcore:us-west-2:111122223333:policy/no_pii-7d8e9f"
        }
      ]
    }
  ]
}

If the project isn't deployed, it throws ProjectStateError:
Project 'orders' is not deployed to target 'prod'. Run 'agentcore project deploy --target prod' first.

@github-actions github-actions Bot added the size/l PR size: L label Sep 2, 2026
@agentcore-devx-automation agentcore-devx-automation Bot added agentcore-harness-reviewing AgentCore Harness review in progress claude-security-reviewing Claude Code /security-review in progress labels Sep 2, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automation agentcore-devx-automation Bot removed the claude-security-reviewing Claude Code /security-review in progress label Sep 2, 2026

@agentcore-devx-automation agentcore-devx-automation Bot 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.

AgentCore Harness Review

Verdict: Looks good

Reviewed commit d3997453 per the PR description (rest of the branch belongs to #2158).

What I checked

  • src/handlers/project/status/index.ts – handler logic
  • src/handlers/project/index.tswithProject wrapping matches the deploy/build/remove/dev pattern
  • src/handlers/project/project.test.ts – the stub test replacement asserts the withProject wiring
  • src/handlers/project/status/index.test.ts – four handler-level tests through root.route

Notes

  • describe()'s spec walk mirrors the declared set in CdkBackend.resolveDeployedResources, and every field it iterates is either .default([]) in the schema or guarded with ?? [] (unassignedTargets, payments). No undefined‑array footguns.
  • The composite key(resourceType, name, parent) used to match resolver rows against declared rows is symmetric with what the CDK backend produces, so a resource returned by the resolver will always match its declared row.
  • Tests keep the real FsProjectManager and scaffold a real project in a temp directory, stubbing only at the ProjectBackend boundary — matches the guidance on avoiding excessive mocking.
  • Telemetry isn't wired into sibling handlers (deploy, build, remove, etc.), so its absence here isn't a regression against an existing pattern.
  • Scope caveats (pending-removal, datasets, capacity-provider pending l3-cdk-constructs#336, gateway-target reported by Id rather than Arn) are all documented in code or the PR description.

No blocking issues. Ready to merge once #2158 lands.

@agentcore-devx-automation agentcore-devx-automation Bot removed the agentcore-harness-reviewing AgentCore Harness review in progress label Sep 2, 2026
@codecov-commenter

codecov-commenter commented Sep 2, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 98.35391% with 4 lines in your changes missing coverage. Please review.
✅ Project coverage is 97.16%. Comparing base (89d302b) to head (e93ac29).
⚠️ Report is 3 commits behind head on refactor.

Files with missing lines Patch % Lines
src/core/project/backends/cdk.ts 96.84% 3 Missing ⚠️
src/handlers/project/invoke/screen.tsx 97.05% 1 Missing ⚠️
Additional details and impacted files
@@             Coverage Diff              @@
##           refactor    #2165      +/-   ##
============================================
- Coverage     97.16%   97.16%   -0.01%     
============================================
  Files           519      519              
  Lines         35506    35668     +162     
============================================
+ Hits          34500    34657     +157     
- Misses         1006     1011       +5     

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

@jariy17

jariy17 commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author
{ "projectName": "bbStatus30455", "target": "default", "region": "us-west-2",
  "resources": [
    { "resourceType": "harness", "name": "bbStatus30455", "deploymentState": "deployed",
      "identifier": "arn:aws:bedrock-agentcore:us-west-2:725476964917:harness/bbStatus30455_bbStatus30455-R7ttcnrOG8" },
    { "resourceType": "memory", "name": "user_mem", "deploymentState": "deployed",
      "identifier": "arn:aws:bedrock-agentcore:us-west-2:725476964917:memory/bbStatus30455_user_mem-9ndWxKF91x" },
    { "resourceType": "gateway", "name": "tools", "deploymentState": "deployed",
      "identifier": "arn:aws:bedrock-agentcore:us-west-2:725476964917:gateway/bbstatus30455-tools-hwyi9qiqkn" },
    { "resourceType": "policy-engine", "name": "guards", "deploymentState": "deployed",
      "identifier": "arn:aws:bedrock-agentcore:us-west-2:725476964917:policy-engine/bbStatus30455_guards-qjcpxplfak",
      "children": [
        { "resourceType": "policy", "name": "no_pii", "deploymentState": "deployed",
          "identifier": "arn:aws:bedrock-agentcore:us-west-2:725476964917:policy-engine/bbStatus30455_guards-qjcpxplfak/policy/no_pii-i9vsi_xtqh" } ] } ] }

@AlexanderRichey AlexanderRichey 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 doesn't look like it implements the approach we discussed of calling DescribeStacks. What motivated changing direction here?

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.

Why is this a binary file?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

My agent add NUL bytes to this file which made github make it into a binary that is now fixed.

@github-actions github-actions Bot added size/l PR size: L and removed size/l PR size: L labels Sep 2, 2026
@jariy17
jariy17 force-pushed the feat/project-status branch from d399745 to 40d7f76 Compare September 2, 2026 13:14
@jariy17

jariy17 commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

First-run fix: project status on a freshly created project

project create leaves agentcore/aws-targets.json as [], and only project deploy provisions the default target. status resolved its target through a path that demanded the target already exist, so the most likely first command after create returned a config error instead of reporting that nothing is deployed yet. allowMissing did not cover it — that flag handles a declared target with no stack, not an undeclared target.

Mechanism. resolveExistingTarget became resolveTarget(project, name, { undeclaredDefaultIsUndeployed }), returning AwsDeploymentTarget | undefined. resolveDeployedResources passes undeclaredDefaultIsUndeployed: input.allowMissing === true and short-circuits to { resources: [] } when no target is declared, so ResolvedDeployedResources.target is now optional. The status envelope falls back to the requested name and the CLI's effective region (RegionKey); a declared target still reports its own region.

Chosen over the alternatives because it keeps status read-only — no aws-targets.json write, no provisionDefaultTarget, no STS lookup — and expresses the absence in the type rather than via caught exceptions or a fabricated account. Only default is treated as implicitly-present, mirroring the guard on the deploy side and for the same reason: inventing a named target would turn a typo'd --target into a report about somewhere unintended.

Live, against a fresh project (no deploy):

Before — exit 1:

Error: No deployment targets are configured for project 'bbFirstRun12141'. Add at least one to .../agentcore/aws-targets.json, for example:
[{ "name": "default", "account": "111122223333", "region": "us-east-1" }]

After — exit 0:

{
  "projectName": "bbFirstRun12141",
  "target": "default",
  "region": "us-west-2",
  "resources": [
    { "resourceType": "harness", "name": "bbFirstRun12141", "deploymentState": "local-only" },
    { "resourceType": "memory", "name": "shortTerm", "deploymentState": "local-only" }
  ]
}

Unchanged, verified live with targets declared:

  • --target typo → exit 1, Project '...' has no deployment target named 'typo'. ... defines: default, eu.
  • --target eu → reports "target": "eu", "region": "eu-west-1", not the ambient region.

One handler test covers it; it fails without the fix and passes with it (verified by mutation).

Separately: the handler was a binary file to git

status/index.ts joined its resource-key parts with literal NUL bytes, so git classified the file as binary and its contents did not render in the diff — the handler was unreviewable in this PR. The separator is now /, which cannot appear in a resource name (^[a-zA-Z][a-zA-Z0-9_]{0,47}$), so collision safety is unchanged. The committed blob is now ASCII text.

Code comments have also been dropped from the code added by this PR and by #2158.

tsc clean · bun test 2608 pass / 0 fail · oxlint clean · prettier clean.

@github-actions github-actions Bot added size/l PR size: L and removed size/l PR size: L labels Sep 2, 2026
@agentcore-devx-automation agentcore-devx-automation Bot added the claude-security-reviewing Claude Code /security-review in progress label Sep 2, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automation agentcore-devx-automation Bot removed the claude-security-reviewing Claude Code /security-review in progress label Sep 2, 2026
@github-actions github-actions Bot added size/l PR size: L and removed size/l PR size: L labels Sep 2, 2026
@agentcore-devx-automation agentcore-devx-automation Bot added the claude-security-reviewing Claude Code /security-review in progress label Sep 2, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automation agentcore-devx-automation Bot removed the claude-security-reviewing Claude Code /security-review in progress label Sep 2, 2026
@github-actions github-actions Bot added size/l PR size: L and removed size/l PR size: L labels Sep 2, 2026
@agentcore-devx-automation agentcore-devx-automation Bot added the claude-security-reviewing Claude Code /security-review in progress label Sep 2, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automation agentcore-devx-automation Bot removed the claude-security-reviewing Claude Code /security-review in progress label Sep 2, 2026
@github-actions github-actions Bot removed the size/l PR size: L label Sep 2, 2026
jariy17 added 13 commits September 2, 2026 17:55
Datasets are out of scope for 'agentcore project status', so remove them from
the resolver: the DeployableResource union, the EXPORT_PARTS table, the spec
iteration, and the resolver test. The 'satisfies Record<CfnOutputResource, ...>'
guard proves the union and the table stayed in sync after the removal.
findDeployedResourceId only knew CloudFormation exports, so its two
exceptions leaked outward: payment matched by OutputKey in an early
return, and credential -- which is never a stack output at all -- was
branched on by the caller. "Where does this id come from" lived in three
places.

Fold all fourteen types into one resolveResourceId switch that takes both
sources (the stack and deployed-state's credential ARNs). The `never`
default makes a new DeployableResource a compile error instead of a
resource that silently vanishes from `project status`.

Renamed off find* because it no longer only searches the stack. Export
name literals are unchanged -- each was verified against a real stack, so
they are deliberately not derived from the resourceType.
resolveResourceId had a single call site and took a two-source parameter
object (stack + credentialArns) purely to reach values that were already
locals there. Closing over them instead removes the parameter object.
project status surfaces these to customers, where an ARN is the useful
identifier. gateway-target stays on its id: AgentCoreMcp exports no -Arn
for it yet.
Returns a JSON report of every declared resource and whether the target's
stack holds it. Children nest under their owner rather than carrying a
parent name, and identifier is omitted (not null) when undeployed.

pending-removal is out of scope: the resolver enumerates the spec, so a
resource deleted from the spec but still in the stack is not discoverable.
project create leaves aws-targets.json empty and only project deploy
provisions the default target, so status errored on a freshly created
project instead of reporting that nothing is deployed yet.
The status resource key joined its parts with NUL bytes, which made git
treat the handler as a binary file and hid it from review diffs.
Also drops the unassignedTargets row from project status: nothing in the
CLI can create an unassigned gateway target.
Widening the resolver to every declared resource switched its identifiers
from bare IDs to ARNs, which broke 'project invoke': GetAgentRuntime and
GetHarness both take an ID, and the service builds its IAM policy resource
from whatever identifier it is handed, so an ARN failed as AccessDenied
rather than a validation error.

The backend now takes an identifier kind. resolveProjectResource asks for
"id" for the invoke path; resolveProjectResources keeps ARNs for status.

Renames resolveDeployedResource(s) to resolveProjectResource(s) and
ResolvedDeployedResource to ResolvedProjectResource, and makes the plural
return every declared resource as a discriminated union on
deploymentState, so 'project status' can report local-only resources
instead of silently omitting them.
@jariy17
jariy17 force-pushed the feat/project-status branch from 233201b to 0ddf02c Compare September 2, 2026 17:58
@github-actions github-actions Bot added size/l PR size: L and removed size/l PR size: L labels Sep 2, 2026
@agentcore-devx-automation agentcore-devx-automation Bot added the claude-security-reviewing Claude Code /security-review in progress label Sep 2, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automation agentcore-devx-automation Bot removed the claude-security-reviewing Claude Code /security-review in progress label Sep 2, 2026
@jariy17

jariy17 commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

| This doesn't look like it implements the approach we discussed of calling DescribeStacks. What motivated changing direction here?

ProjectManager.resolveProjectResources already calls DescribeStacks so I just expanded to all project resources. The handler will call this function. The only change from yesterday is that I nested resources that are children of a resource i.e GatewayTargets to Gateway.

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

Built it and drove it against a real account in us-west-2. Status resolves every resource correctly and headless invoke works. Two blockers before merge: the interactive invoke picker is broken (ARNs sent where ids are expected) and child nesting matches parents by name only. Details inline.

Comment thread src/handlers/project/invoke/screen.tsx Outdated
let active = true;
void core.projectManager
.resolveDeployedResources(project, { target: "default" })
.resolveProjectResources(project, { target: "default" })

@tejaskash tejaskash Sep 2, 2026

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.

Regression from this PR. The manager never forwards an identifier here, so the resolver defaults to ARNs and select() passes them as harnessId/agentRuntimeId. Picking a deployed harness in the TUI fails with Value 'arn:aws:...:harness/...' at 'harnessId' failed to satisfy constraint. Headless invoke was fixed with identifier: "id", this path was not. Returning both id and arn on each row would remove the toggle entirely.

Comment thread src/handlers/project/status/index.ts Outdated
const top: ResourceStatus[] = [];
for (const { resource, row } of entries) {
const owner = resource.parent
? entries.find(({ resource: other }) => !other.parent && other.name === resource.parent)

@tejaskash tejaskash Sep 2, 2026

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.

Parent is matched by name only. Names are unique per collection, not across them, so a gateway and a policy engine can both be guards. Reproduced live: the deployed policy showed under the gateway and the engine had no children. Match on the expected parent type too.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Nice catch!

region: resolved.target.region,
resources: nest(resolved.resources),
};
ctx.require(JsonRendererKey).renderJson(status);

@tejaskash tejaskash Sep 2, 2026

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.

deploy, build, dev and export in this router check JsonKey and print a human line otherwise. This always dumps JSON, so a bare agentcore project status in a terminal gets a raw blob.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

agentcore project status will just print out the json output for now. If customers want a human readable, Alex is implementing the tui experience after this pr gets merged.

});
});

test("rejects a freshly created project that declares no targets", async () => {

@tejaskash tejaskash Sep 2, 2026

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.

project create leaves aws-targets.json empty and deploy fills it, so right after create status tells the user to hand-write the file with an example account id. Commit bfef4ea fixed this and drop allowMissing undid it. The "all local-only" test above only passes because the fake backend never throws, the real one always does here.

Comment thread src/core/project/backends/cdk.ts Outdated
const { target, identifier = "arn" } = input;
const deployedState = await readDeployedState(this.json, project.rootPath);
const stackArn = deployedState.targets[target.name]?.stackArn;
if (!stackArn) {

@tejaskash tejaskash Sep 2, 2026

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.

For status, a missing stack just means nothing is deployed yet, which is exactly what local-only describes. Deploy and remove can keep the hard failure.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Yeah that makes sense. I'll let the handlers throw the ProjectStateError if they want too.

}
};

const declared: Declared[] = [

@tejaskash tejaskash Sep 2, 2026

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.

The spec also has datasets and mcpRuntimeTools, and declaresNothingDeployable in deploy counts both. They are missing here, so a deployed dataset gets no row at all and deploy and status disagree on what a resource is.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Datasets are being deprecated in favor of the imperative based commands. I think mcpRuntimeTools is also deprecated because I don't see any add command for it. declaresNothingDeployable doesn't exist.

Comment thread src/core/project/backends/cdk.ts Outdated
return byExportName("Policy", parent ?? "", name, suffix);
case "config-bundle":
return byExportName("ConfigBundle", name, suffix);
case "capacity-provider":

@tejaskash tejaskash Sep 2, 2026

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.

No capacityProviders field exists anywhere in the spec, so this case and the union member are unreachable, and the never default forces every future switch to keep handling it.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I was thinking we will add capacityProvider in the new cli but I can remove it for now.

Comment thread src/core/project/backends/cdk.ts Outdated
case "capacity-provider":
return byExportName("CapacityProvider", name, suffix);
case "payment":
// Payments doesn't set a ExportName so we search for OutputKey

@tejaskash tejaskash Sep 2, 2026

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 links to the L3 AgentCorePayments construct, but the generated project never uses it. The Payment<name>ManagerArn output comes from toCdkId in the CLI's cdk-stack.ts template. Also the workspace rule is no line comments, so these should go.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

But I like these comments. It help developers understand why the credentials and Payments are special cases.

Comment thread src/handlers/project/types.ts Outdated
| "policy-engine"
| "policy"
| "config-bundle"
| "payment"

@tejaskash tejaskash Sep 2, 2026

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.

project add and project remove call this payment-manager (see ProjectResource below), status calls it payment. Deriving this from ProjectResource keeps the two from drifting.


describe("CdkBackend.resolveDeployedResources", () => {
test("describes the stack once and returns only resources with deployed ID outputs", async () => {
describe("CdkBackend.resolveProjectResources", () => {

@tejaskash tejaskash Sep 2, 2026

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.

The base branch tested -RuntimeId and -Harness-<name>-Id. Now nothing here asks for identifier: "id", so a typo in the suffix logic would make headless invoke report a deployed runtime as not deployed with CI green. One id-mode case would cover it.

Comment thread src/handlers/project/invoke/screen.tsx Outdated
(r.resourceType === "runtime" || r.resourceType === "harness") &&
r.deploymentState === "deployed",
)
.map((resource) => {

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.

Why is this code changing in this PR? I thought the scope was the status command.

Resolve resources as ARNs only and convert at the invoke boundary. The
identifier toggle defaulted to "arn", so the plural resolver silently handed
ARNs to the TUI picker, which passed them as harnessId/agentRuntimeId and
failed the service pattern. The toggle is gone; resourceIdFromArn reads the
resource id where the data-plane APIs need one.

Report resources rather than failing when a target has no stack. For status a
missing or deleted stack simply means nothing is deployed, which is what
local-only describes; deploy and remove still fail loudly.

Report a freshly created project as undeployed. A project only gains its
default target on first deploy, so status told the user to hand-write
aws-targets.json with an example account id. The region the CLI resolved
stands in, in memory, for the default target alone.

Nest children under their owner's type. Names are unique per collection but not
across them, so a gateway and a policy engine both named 'guards' filed the
policy under the gateway.

Rename payment to payment-manager and add payment-connector, matching the names
project add and project remove already use, and drop capacity-provider: no
capacityProviders field exists in the spec, so the case was unreachable.

Point the payment output comments at the CLI's own cdk-stack.ts template, which
emits those outputs without an exportName, rather than an L3 construct the
generated project never instantiates.
@github-actions github-actions Bot added size/xl PR size: XL and removed size/l PR size: L labels Sep 2, 2026
@agentcore-devx-automation agentcore-devx-automation Bot added the claude-security-reviewing Claude Code /security-review in progress label Sep 2, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automation agentcore-devx-automation Bot removed the claude-security-reviewing Claude Code /security-review in progress label Sep 2, 2026
const project = ctx.require(ProjectKey);
const name = selectProjectResource(project, "runtime", flags.name);
const deployed = await core.projectManager.resolveDeployedResource(project, {
const deployed = await core.projectManager.resolveProjectResource(project, {

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.

There doesn't seem to be anything pressing that necessitates this name change. It's causing a lot of cascading changes that make this code hard to review and increase the risk of introducing errors. Let's omit this part of the PR and focus on just the status functionality.

@jariy17 jariy17 Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I renamed resolveDeployResource to resolveProjectResources because it now returns whether a resource was deployed or not. I'll just make resolveProjectResource it's own function in the next revision. Later we can merge the functions.

@jariy17
jariy17 marked this pull request as draft September 2, 2026 23:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/xl PR size: XL

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants