Skip to content

feat(cli) Add All missing features of the Organizations API#263

Open
DerBurri wants to merge 61 commits into
mainfrom
add-organization-api
Open

feat(cli) Add All missing features of the Organizations API#263
DerBurri wants to merge 61 commits into
mainfrom
add-organization-api

Conversation

@DerBurri

@DerBurri DerBurri commented May 13, 2026

Copy link
Copy Markdown
Contributor

This branch implements org-aware team functionality across the CLI and API client, adds unit tests for team flows, and makes client creation injectable to improve testability. It also includes several refactors and dependency updates required to support the new behavior.

  1. Key points

Organization-aware team behavior:
Use GlobalOptions.OrgId and environment GetOrgId() for org-scoped commands.
Add organization filtering to ListTeams and helper conversions for org teams (API + CLI).
Team management commands and tests:
Implement and test AddTeamMember and RemoveTeamMember command logic and validation.
Implement and test team deletion (RemoveTeam) with injectible ClientFactory to mock API calls.
Add/extend unit tests for create/add/remove team flows.
Error handling & observability:
Improve API error logging to include traceId.
Centralize API error formatting via api/errors.FormatAPIError.
Testability & infra:
Make client construction injectable for CLI commands to allow mocks in tests.
Build-and-run integration test workflow updated (artifact + label matrix) — see integration-test.yml.
Chores & deps:
Multiple dependency updates and lint/test chore fixes.
Representative commits

CLI commands: team_create.go, team_add_member.go, team_remove_member.go, team_remove.go
Tests: team_create_test.go, team_add_member_test.go, team_remove_member_test.go, team_remove_test.go
API error handling: errors.go, tests in errors_test.go
CI workflow: integration-test.yml
Client interface and mocks: client.go, mocks.go
Testing / verification

Ran unit tests for the CLI package locally: go test ./cli/cmd — passing.
Integration tests are built and run via the updated GitHub Actions workflow; note that some int tests previously observed backend HTTP 500s during workspace deletion (server-side). If CI shows failures, collect trace IDs and forward to backend logs for investigation.
Migration / usage notes

@DerBurri DerBurri force-pushed the add-organization-api branch 2 times, most recently from 2452e6c to 1487f91 Compare May 13, 2026 12:18
@DerBurri DerBurri force-pushed the add-organization-api branch from 044e3a4 to a513836 Compare June 3, 2026 08:20
@DerBurri DerBurri self-assigned this Jun 3, 2026
@DerBurri DerBurri force-pushed the add-organization-api branch from 3ceec3c to a58b8eb Compare June 3, 2026 08:58
@DerBurri DerBurri marked this pull request as ready for review June 3, 2026 09:20
@DerBurri DerBurri requested a review from a team as a code owner June 3, 2026 09:20

@OliverTrautvetter OliverTrautvetter left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Nice feature, some comments for it 👍

Comment thread pkg/cs/env.go
Comment thread cli/cmd/root.go
Comment thread cli/cmd/team_add_member.go
Comment thread cli/cmd/team_create.go
Comment thread cli/cmd/team_remove.go
Comment thread cli/cmd/team_create.go
Comment thread cli/cmd/team_remove.go Outdated
Comment thread cli/cmd/team_remove.go Outdated
Comment thread cli/cmd/team_remove_member.go
Comment thread cli/cmd/team_remove_member.go Outdated
@DerBurri DerBurri force-pushed the add-organization-api branch from 00c60bf to db693fa Compare June 17, 2026 09:12
@DerBurri DerBurri force-pushed the add-organization-api branch 2 times, most recently from b8b9251 to 66f578e Compare June 17, 2026 12:57

@OliverTrautvetter OliverTrautvetter left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Some more comments to improve it

Comment thread api/team.go Outdated
Comment thread cli/cmd/team_create.go Outdated
Comment thread cli/cmd/team_remove_member.go Outdated
Comment thread cli/cmd/team_add_member.go Outdated
Comment thread cli/cmd/team_add_member_test.go Outdated
Comment thread cli/cmd/team_add_member.go Outdated
Comment thread cli/cmd/team_create.go
Comment thread api/types.go Outdated
Comment thread api/team.go Outdated
Comment thread cli/cmd/team_create.go
@DerBurri DerBurri force-pushed the add-organization-api branch 2 times, most recently from 58da364 to 92ac544 Compare July 1, 2026 10:40
CodesphereBot and others added 14 commits July 1, 2026 12:41
…#274)

Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
…#275)

Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
)

Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
* feat: add first draft cs mcp server

* fix: add cs-mcp to gitignore

* fix: fix env var names in readme

* update: clean up workspace structs

* update: add mcp server to the main cs-go cli

* update: remove mcp readme, add long mcp cmd description, remove old build related stuff

* update: update file name of the main mcp file

* chore(docs): Auto-update docs and licenses

Signed-off-by: siherrmann <25087590+siherrmann@users.noreply.github.com>

* fix: fix dependency error

* fix: fix dependecy issue

---------

Signed-off-by: siherrmann <25087590+siherrmann@users.noreply.github.com>
Co-authored-by: siherrmann <25087590+siherrmann@users.noreply.github.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: DerBurri <7892993+DerBurri@users.noreply.github.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
chore(mock): Update MockClient.ListTeams signature
test(cli): Update ListTeams mock expectation in list_workspaces_test
feat(api): Add ConvertOrgTeamToTeam helper for organization teams
refactor(cli): Simplify ListTeamsCmd.RunE to use new ListTeams signature
feat(cli): Update Client interface for ListTeams to include orgId
feat(cli): Add --org flag and GlobalOptions.OrgId for organization context
feat(pkg): Add GetOrgId to Environment for CS_ORG_ID
feat(cli): Implement 'cs list org' command to list organizations

Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: DerBurri <7892993+DerBurri@users.noreply.github.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
added team add and delete opton with org context

Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
DerBurri and others added 22 commits July 1, 2026 12:41
Signed-off-by: DerBurri <7892993+DerBurri@users.noreply.github.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
…cloud/cs-go into add-organization-api

Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
* feat: add first draft cs mcp server

* fix: add cs-mcp to gitignore

* fix: fix env var names in readme

* update: clean up workspace structs

* update: add mcp server to the main cs-go cli

* update: remove mcp readme, add long mcp cmd description, remove old build related stuff

* update: update file name of the main mcp file

* chore(docs): Auto-update docs and licenses

Signed-off-by: siherrmann <25087590+siherrmann@users.noreply.github.com>

* fix: fix dependency error

* fix: fix dependecy issue

---------

Signed-off-by: siherrmann <25087590+siherrmann@users.noreply.github.com>
Co-authored-by: siherrmann <25087590+siherrmann@users.noreply.github.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: DerBurri <7892993+DerBurri@users.noreply.github.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
add wrapper for team conversion to allow non hardcoded value of role in the missing field

Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: DerBurri <7892993+DerBurri@users.noreply.github.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
* chore(ci): Create release on dependency updates

* chore(docs): Auto-update docs and licenses

Signed-off-by: NautiluX <2600004+NautiluX@users.noreply.github.com>

---------

Signed-off-by: NautiluX <2600004+NautiluX@users.noreply.github.com>
Co-authored-by: NautiluX <2600004+NautiluX@users.noreply.github.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
…#284)

Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
@DerBurri DerBurri force-pushed the add-organization-api branch from 78947e6 to 27dbe5a Compare July 1, 2026 10:52
@DerBurri DerBurri force-pushed the add-organization-api branch from ce8b283 to 8522181 Compare July 1, 2026 11:04
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
@DerBurri DerBurri force-pushed the add-organization-api branch from 6f01b45 to faf3bdf Compare July 1, 2026 11:05
Signed-off-by: DerBurri <7892993+DerBurri@users.noreply.github.com>

@OliverTrautvetter OliverTrautvetter left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Some more comments, but we are moving into the right direction 😄

Comment thread cli/cmd/team_remove.go
func (c *RemoveTeamCmd) RunE(_ *cobra.Command, args []string) error {
client, err := c.ClientFactory(*c.Opts.GlobalOptions)
if err != nil {
return fmt.Errorf("failed to create Codespehre client: %w", err)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Still 4 typos where "Codespehre" should be changed to "Codesphere"

Comment thread api/team.go
Comment on lines 18 to +19
func (client *Client) TeamIdByName(name string) (Team, error) {
teams, err := client.ListTeams()
teams, err := client.ListTeams("")

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The comment here is unresolved, what about this?

Comment thread api/team.go
Comment on lines 16 to 17
// Returns [NotFound] if no plan with the given Id could be found
// Returns [Duplicated] if no plan with the given Id could be found

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

"plan" and "no plan" should be "team" and "multiple teams"

Comment thread cli/cmd/team_create.go
return err
}

fmt.Printf("Team created: %+v in Organization: %+v\n", createdTeam.Id, orgId)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

orgId can be ""

if orgId != "" {
fmt.Printf("Team created: %d in Organization: %s\n", ...)
} else {
fmt.Printf("Team created: %d\n", ...)
}

Comment thread api/team.go
return cserrors.FormatAPIError(r, err)
}

func (c *Client) AddTeamMember(teamId int, email string, role int) error {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

should this not have a orgId parameter?

Comment on lines +55 to +69
func (c *AddTeamMemberCmd) RunE(_ *cobra.Command, args []string) error {
client, err := c.ClientFactory(*c.Opts.GlobalOptions)
if err != nil {
return fmt.Errorf("failed to create Codesphere client: %w", err)
}

teamId, err := c.Opts.GetTeamId()
if err != nil {
return err
}

err = c.AddTeamMember(client, teamId, c.Opts.Email, c.Opts.Role)
return err

}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Should we not get the orgId?

comment says "To add a member to a team within an organization, the CS_ORG_ID environment variable or the -O/--org flag must be set.`),"

but is never used in AddTeamMember function

t.cmd.RunE = t.RunE
t.cmd.Flags().StringVarP(&t.Opts.Email, "email", "e", "", "Team member email")
_ = t.cmd.MarkFlagRequired("email")
t.cmd.Flags().IntVarP(&t.Opts.Role, "role", "r", int(cs.RoleAdmin), "Team member role 0=admin, 1=member")

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I don't think it is good to have 0 as default admin. uninitialized value would give admin rights here, because it is 0

best would be maybe -1 for admin and 1 for member or 1 for member and 2 for admin while 0 is not allowed

Context("Validation", func() {
It("should fail if the mail is empty", func() {

err := c.AddTeamMember(mockClient, teamId, "", dcId)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

wait why is cdId used as role

Example: io.FormatExampleCommands("team member add", []io.Example{
{Cmd: "-t <teamId> -e user@example.com -r 1", Desc: "Add a user to a team as a member"},
{Cmd: "-t <teamId> -e admin@example.com -r 0", Desc: "Add a user to a team as an admin"},
{Cmd: "-O <org-id> -t <teamId> -e user@example.com -r 1", Desc: "Add a user to a team within an organization"},

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

double space bettween -t and

Sign up for free to 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