devlift-cli 0.1.2__tar.gz → 0.1.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/PKG-INFO +1 -1
  2. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/MANUAL.md +17 -11
  3. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/__init__.py +1 -1
  4. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/clusters.py +25 -10
  5. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/eks.py +9 -1
  6. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/skill/SKILL.md +76 -13
  7. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/skill/reference/workflows.md +35 -3
  8. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli.egg-info/PKG-INFO +1 -1
  9. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/README.md +0 -0
  10. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/__main__.py +0 -0
  11. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/api/__init__.py +0 -0
  12. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/api/approvals.py +0 -0
  13. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/api/catalog.py +0 -0
  14. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/api/client.py +0 -0
  15. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/api/context.py +0 -0
  16. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/api/deployments.py +0 -0
  17. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/api/infra.py +0 -0
  18. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/api/infra_list.py +0 -0
  19. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/api/kong.py +0 -0
  20. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/api/services.py +0 -0
  21. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/api/vpc.py +0 -0
  22. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/app.py +0 -0
  23. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/auth/__init__.py +0 -0
  24. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/auth/oauth.py +0 -0
  25. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/auth/session.py +0 -0
  26. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/auth/storage.py +0 -0
  27. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/__init__.py +0 -0
  28. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/approval.py +0 -0
  29. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/auth.py +0 -0
  30. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/catalog.py +0 -0
  31. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/deployment.py +0 -0
  32. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/dynamodb.py +0 -0
  33. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/kong.py +0 -0
  34. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/languages.py +0 -0
  35. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/manual.py +0 -0
  36. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/repositories.py +0 -0
  37. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/request.py +0 -0
  38. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/s3.py +0 -0
  39. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/skill.py +0 -0
  40. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/sqs.py +0 -0
  41. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/config.py +0 -0
  42. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/context.py +0 -0
  43. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/data/placement/vance.json +0 -0
  44. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/errors.py +0 -0
  45. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/ops/__init__.py +0 -0
  46. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/ops/approvals.py +0 -0
  47. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/ops/eks.py +0 -0
  48. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/ops/kong.py +0 -0
  49. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/ops/placement.py +0 -0
  50. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/ops/resources.py +0 -0
  51. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/ops/status.py +0 -0
  52. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/ops/wait.py +0 -0
  53. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/render/__init__.py +0 -0
  54. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/render/output.py +0 -0
  55. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/resolve/__init__.py +0 -0
  56. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/resolve/allowlist.py +0 -0
  57. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/resolve/names.py +0 -0
  58. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/skill/reference/commands.md +0 -0
  59. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/skill/reference/exit-codes.md +0 -0
  60. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli.egg-info/SOURCES.txt +0 -0
  61. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli.egg-info/dependency_links.txt +0 -0
  62. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli.egg-info/entry_points.txt +0 -0
  63. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli.egg-info/requires.txt +0 -0
  64. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli.egg-info/top_level.txt +0 -0
  65. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/pyproject.toml +0 -0
  66. {devlift_cli-0.1.2 → devlift_cli-0.1.4}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devlift-cli
3
- Version: 0.1.2
3
+ Version: 0.1.4
4
4
  Summary: DevLift command-line tool: create, change, review and deploy DevLift resources from the terminal.
5
5
  License: Proprietary
6
6
  Keywords: devlift,devops,deployment,infrastructure,cli
@@ -227,11 +227,13 @@ devlift clusters list [--app NAME] [--env ENV] [--region REGION] [--type eks|ecs
227
227
  ```
228
228
 
229
229
  The clusters services run on, and the `--cluster` values for `eks create`.
230
- Narrowed to placements you could really create in: the backend reports only
231
- the environments this deployment serves, and the placement allowlist
232
- (section 5) says which of those offer EKS or ECS. Clusters outside both are
233
- real but unusable from here, so they are hidden and counted; `--all` shows
234
- everything the backend reports.
230
+ Narrowed by three filters, the same ones a create goes through: the backend
231
+ reports only the environments this deployment serves, the placement allowlist
232
+ (section 5) says which of those offer EKS or ECS, and only a **registered**
233
+ cluster may take a new service. Anything outside those is real but can never
234
+ be chosen, so it is hidden and counted. `--all` drops all three and shows
235
+ everything the backend reports, for checking what exists rather than for
236
+ choosing.
235
237
 
236
238
  ```
237
239
  devlift clusters list --type eks --app core --env stage
@@ -239,16 +241,20 @@ devlift clusters list --type eks --app core --env stage
239
241
 
240
242
  ```
241
243
  22 of 25 hidden: not a placement this deployment offers; --all shows everything.
244
+ 2 more hidden: not registered, so no service can be created on them.
242
245
 
243
- Cluster Type Environment Region Application Registered
246
+ Cluster Type Environment Region Application Registered
244
247
  acme-core-stage-mumbai-01-application-cluster EKS stage Mumbai core yes
245
- …two more in the same placement, not registered
246
248
  ```
247
249
 
248
- Within that, **Registered** is the flag that matters: only a registered
249
- cluster may take a new service, and `eks create` will not offer the others.
250
- A row whose Application reads "tenant-level" belongs to no single product
251
- and is the fallback for products with no cluster of their own.
250
+ Everything listed is a cluster `eks create` would accept. A row whose
251
+ Application reads "tenant-level" belongs to no single product and is the
252
+ fallback for products with no cluster of their own.
253
+
254
+ **Name and code are two labels for one cluster.** The Cluster column and
255
+ `eks create` both show the name; the Code column and `eks show`'s
256
+ `cluster_code` show the backend's identifier. They look nothing alike, so do
257
+ not read a difference between them as two different clusters.
252
258
 
253
259
  With exactly one registered cluster in a placement, `eks create` fills it in
254
260
  silently. With several it asks, or wants `--cluster` under `--no-input`.
@@ -1,3 +1,3 @@
1
1
  """DevLift command-line tool."""
2
2
 
3
- __version__ = "0.1.2"
3
+ __version__ = "0.1.4"
@@ -66,14 +66,17 @@ def clusters_list(
66
66
  ):
67
67
  """List the clusters a service can run on.
68
68
 
69
- Narrowed to placements this deployment serves and the placement allowlist
70
- permits, so a cluster listed here is one a service could actually be
71
- created on. `--all` shows everything the backend reports.
72
-
73
- "Registered" is the flag that matters within that: only a registered
74
- cluster may take a new service, and `eks create` will not offer the
75
- others. A cluster with no application is tenant-level and is the fallback
76
- for every product that has none of its own.
69
+ Three filters, the same ones every create goes through: placements this
70
+ deployment serves, placements the allowlist permits, and registration.
71
+ Only a registered cluster may take a new service, so an unregistered one
72
+ is never a candidate and is not listed. Everything shown here is a cluster
73
+ `eks create` would actually accept.
74
+
75
+ `--all` drops all three and shows everything the backend reports, which is
76
+ for checking what exists rather than for choosing.
77
+
78
+ A cluster with no application is tenant-level and is the fallback for
79
+ every product that has none of its own.
77
80
  """
78
81
  inv: Invocation = ctx.obj
79
82
  res = Resolver(inv.api, inv.profile.name)
@@ -95,8 +98,20 @@ def clusters_list(
95
98
  if not show_all:
96
99
  before = len(rows)
97
100
  rows = _placeable(res, rows)
98
- if before > len(rows):
99
- output.info(f"{before - len(rows)} of {before} hidden: not a placement this deployment offers; --all shows everything.")
101
+ placement_hidden = before - len(rows)
102
+
103
+ # Unregistered clusters are not offerable, so listing them is worse than
104
+ # useless: a service cannot be created on one, and naming it invites a
105
+ # comparison against the registered cluster that reads as a discrepancy.
106
+ # `--all` still shows them, for someone checking what exists.
107
+ registered = [r for r in rows if r.get("is_registered")]
108
+ unregistered_hidden = len(rows) - len(registered)
109
+ rows = registered
110
+
111
+ if placement_hidden:
112
+ output.info(f"{placement_hidden} of {before} hidden: not a placement this deployment offers; --all shows everything.")
113
+ if unregistered_hidden:
114
+ output.info(f"{unregistered_hidden} more hidden: not registered, so no service can be created on them.")
100
115
  inv.emit(rows, lambda d: rows_table(
101
116
  ["Cluster", "Type", "Environment", "Region", "Application", "Registered", "Status", "Code"],
102
117
  [(r.get("cluster_name") or r.get("name"), r.get("cluster_type"), r.get("environment"),
@@ -119,7 +119,13 @@ def eks_show(
119
119
  request = eff.draft
120
120
  data = {
121
121
  "service": eff.target.service_name, "service_config_code": eff.target.config_code,
122
- "environment": live.get("environment"), "region": eff.target.region_name, "cluster": live.get("infrastructure_mst_code"),
122
+ "environment": live.get("environment"), "region": eff.target.region_name,
123
+ # The NAME, the same identifier `eks create` and `clusters list` print.
124
+ # This used to report infrastructure_mst_code, so the two commands named
125
+ # one cluster two different ways and anyone comparing them concluded the
126
+ # service had moved. The code is still here, under its own key.
127
+ "cluster": eff.config.get("cluster_name") or live.get("infrastructure_mst_code"),
128
+ "cluster_code": live.get("infrastructure_mst_code"),
123
129
  "type": eff.service.get("service_type"), "repository": eff.config.get("repository"),
124
130
  "branches": eff.config.get("branches") or eff.config.get("selected_branches"),
125
131
  "language": f"{eff.language_label or ''} {eff.language_version or ''}".strip() or None,
@@ -131,6 +137,8 @@ def eks_show(
131
137
  output.err_console.print(kv_table([
132
138
  ("Service", d["service"]), ("Type", d["type"]), ("Environment", f"{d['environment']} / {d['region']}"),
133
139
  ("Cluster", d["cluster"]), ("Repository", d["repository"] or "–"),
140
+ # Kept out of the table: the code adds nothing a reader can act on,
141
+ # and showing both invites exactly the comparison this fixes.
134
142
  ("Branches", ", ".join(d["branches"] or []) or "–"), ("Language", d["language"] or "–"),
135
143
  ("Pending request", f"{d['pending_request']['code']} ({d['pending_request']['status']})" if d["pending_request"] else "none"),
136
144
  ], title=d["service"]))
@@ -160,19 +160,29 @@ are in `reference/workflows.md`.
160
160
  and prints two tables on stderr: the service (placement, cluster it
161
161
  picked, repository, branches, language) and the Configuration table with
162
162
  a "From" column saying which values came from the language template.
163
- 3. **Show the user those template values as they were printed and ask:**
164
- "These are the standard <language> values. Apply them, or tell me what to
165
- change?" That reply is text and ends the turn no dialog, no tool call,
166
- because a dialog would hide the table they are deciding on. Do not rerun
167
- with `-y` until they answer.
163
+ 3. **Reproduce both tables in your reply, then ask.** Paste them as the
164
+ command printed them, inside a code block, every row, in the same order,
165
+ with the "From" column intact. They are the summary. Do not replace them
166
+ with prose, do not show only the rows you think matter, and do not lead
167
+ with your own commentary: the user is about to approve these exact values
168
+ and cannot approve what they cannot see. Anything you want to point out
169
+ goes AFTER the tables, in a line or two.
170
+
171
+ Then ask: "These are the standard <language> values. Apply them, or tell
172
+ me what to change?" That reply is text and ends the turn — no dialog, no
173
+ tool call, because a dialog would hide the table they are deciding on. Do
174
+ not rerun with `-y` until they answer.
168
175
  4. A change ("port 9000", "1 GiB memory limit", "turn on autoscaling 2 to 4")
169
176
  becomes `--set` flags on the rerun: `--set port=9000`,
170
177
  `--set memory_limit=1`, `--set hpa_enabled=true --set min_replicas=2
171
178
  --set max_replicas=4`. Rerun without `-y` once more only if the change is
172
- large; otherwise rerun with `-y` and report the service, configuration and
173
- queue codes.
174
- 5. Say it is a **draft** and name the next step: `request submit`, then a
175
- reviewer's `approval approve`, then `eks deploy`.
179
+ large; otherwise rerun with `-y`.
180
+ 5. **Report what is now waiting to be reviewed, not the codes it returned.**
181
+ Run `devlift request show <service> --env <env> --no-input -o json` and
182
+ show what it lists: every row in the change set and the fields each one
183
+ changes. Say it is a **draft**, nothing is deployed, and name the next
184
+ step: `request submit`, then a reviewer's `approval approve`, then
185
+ `eks deploy`.
176
186
 
177
187
  The same show-then-ask shape applies to every write: `eks edit` and the
178
188
  update commands print Current | New, `kong route …` prints the route change,
@@ -181,12 +191,65 @@ the approved rows. The summary is printed on every dry run, in json mode too.
181
191
 
182
192
  ## Reporting back to the user
183
193
 
184
- - After a dry run (exit 5) show the summary the command printed and ask for
185
- the go-ahead. After a write, report the codes it returned: resource code and
186
- workflow id for resources; queue code and status for drafts and review
187
- verbs; workflow id for a deploy.
194
+ - **After a dry run (exit 5), paste what the command printed, verbatim, in a
195
+ code block**, then ask for the go-ahead. Every row of every table, in order.
196
+ A summary you wrote yourself is not a substitute: the user is approving the
197
+ values in that output, so replacing it with "two differences worth your
198
+ call" hides the other twenty they are also agreeing to. Commentary is
199
+ welcome after it, never instead of it.
200
+ - **After a draft write, show what will go to review — not the codes.**
201
+ `eks create`, `eks edit` and `kong route …` all save a draft. The service
202
+ code, the configuration code and the queue code are plumbing: they belong in
203
+ your next tool call, not in a sentence a person reads. Run
204
+ `devlift request show <service> --env <env> --no-input -o json` and report
205
+ what it lists: every row in the change set, and for each one the fields it
206
+ changes. A service's settings and its Kong routes are **one change set**, so
207
+ a route added earlier will be submitted by this submit too, and the user has
208
+ to see that before they agree to it. Mention a code only if the user asks,
209
+ or when they need it to run a command themselves.
188
210
  - A draft is not deployed. Say so, and name the next command
189
211
  (`request submit`, then `approval approve`, then `eks deploy`).
212
+ - **After `request submit`, say three things.** That it is submitted and now
213
+ waiting for approval. How many rows moved and which kinds (settings,
214
+ gateway/Kong, variables) — the submit result's `requests[]` gives you both.
215
+ And who approves it next.
216
+ For that last one, do not guess and never write "if you have approval
217
+ rights": run `devlift request show <service> --env <env> --no-input -o json`
218
+ and read `you.can_approve`. If it is true, say plainly that they can approve
219
+ it themselves and offer `devlift approval approve <service> --env <env>`. If
220
+ it is false, say it needs a reviewer on that resource group. The user should
221
+ never have to work out their own permissions.
222
+ - **After `approval approve`, show the approved change in full.** This is the
223
+ last checkpoint before anything reaches a cluster, so a queue code and the
224
+ word "approved" are not enough. Run `devlift request show <service> --env
225
+ <env> --no-input -o json` and show its frozen diff — every row, Field, From,
226
+ To — so the user sees exactly what is now cleared to ship. Then read
227
+ `you.can_deploy` from that same output: if true, say they can deploy it and
228
+ offer `devlift eks deploy <service> --env <env>` (`--wait` follows it to the
229
+ end); if false, say a deployer has to run it. Check, never guess, exactly as
230
+ with approval.
231
+ - **After `eks deploy`, show what is shipping and where it has got to.** Run
232
+ `devlift deployment status <workflow-id> --no-input -o json` and show its
233
+ pipeline stages as the command gives them — each stage with its status and
234
+ timing — so the user can see which step is running rather than reading a
235
+ sentence about it. Say what is being deployed, which is the change that was
236
+ just approved, and keep the workflow id visible because every later check
237
+ needs it. Then name both follow-ups and the difference between them:
238
+ `deployment status <workflow-id> --wait` says when DevLift's own pipeline
239
+ finished, and `eks status <service> --env <env>` also asks ArgoCD whether the
240
+ pod is actually serving, which is the real "is it up" question. A finished
241
+ pipeline is not a running application.
242
+ - **Never compare a cluster code with a cluster name.** `eks show` returns both
243
+ `cluster` (the name, e.g. `acme-core-stage-mumbai-01-application-cluster`)
244
+ and `cluster_code` (e.g. `infra-acme-eks-staging-mumbai-app-01`). They are
245
+ two labels for the SAME cluster. Use `cluster` when you talk about it, and
246
+ never tell a user their services are on different clusters because the
247
+ strings differ — check with `devlift clusters list` before claiming any such
248
+ thing. That list is already narrowed to registered clusters a service can
249
+ actually be created on, so it is the authority.
250
+ - Resources behave differently. `s3`, `sqs` and `dynamodb` create and update
251
+ deploy straight away, so there report the resource name and the workflow id,
252
+ which is what `deployment status` needs.
190
253
  - On exit 7 quote the message: it names the conflicting request or the rule
191
254
  (one live request per service, one auth per Kong tag, a name that exists).
192
255
  - On exit 2 stop and tell the user to sign in; on exit 4 say who to ask.
@@ -42,12 +42,18 @@ devlift repositories branches Regobs/orders --no-input -o json | jq -r '.[].name
42
42
  devlift languages list --no-input -o json
43
43
  devlift eks create --name orders --app core --env stage --region mumbai --type api \
44
44
  --repo Regobs/orders --branch main --language go --version 1.24 --no-input -o json 2>&1 # exit 5: two tables (service, configuration with From column) on stderr
45
- # SHOW the Configuration table to the user and ASK: "These are the standard Go values. Apply them, or tell me what to change?"
45
+ # PASTE BOTH TABLES VERBATIM into your reply, in a code block, every row, before anything else you write.
46
+ # They are the summary — a prose rewrite hides the values the user is about to approve. Commentary goes after them.
47
+ # Then ASK: "These are the standard Go values. Apply them, or tell me what to change?"
46
48
  # a change becomes --set on the rerun, e.g. --set cpu_limit=0.5 --set hpa_enabled=true --set min_replicas=1 --set max_replicas=3
47
49
  devlift eks create … --no-input -y -o json
48
50
  # → {service_code, service_config_code, queue_code, queue_status: "draft", config}
51
+ devlift request show orders --env stage --no-input -o json # what now waits for review
49
52
  ```
50
- Then tell the user it is a draft and continue with workflow 6.
53
+ Report what `request show` lists — the rows in the change set and the fields
54
+ each changes. Do NOT report service_code / service_config_code / queue_code:
55
+ they are plumbing for your next call, not something a person reads. Then tell
56
+ the user it is a draft, nothing is deployed, and continue with workflow 6.
51
57
  `--type worker` drops health/service_path/ALB fields (no load balancer).
52
58
 
53
59
  ## 4. Change a running service's settings
@@ -74,22 +80,48 @@ the other auth → exit 7: pick another `--tag`.
74
80
  ## 6. Review lane (settings and routes move together)
75
81
 
76
82
  ```
83
+ devlift request show orders --env stage --no-input -o json # EVERYTHING that submit will send: settings AND Kong routes
77
84
  devlift request list --service orders --env stage --no-input -o json # what exists, statuses, you.can_approve / can_deploy
78
85
  devlift request submit orders --no-input -y -o json # → requests[] all "submit"; exit 7 if another author holds the lane
86
+ devlift request show orders --env stage --no-input -o json # after submit: you.can_approve says whether THIS user may approve it
79
87
  devlift approval list --no-input -o json # reviewer inbox
80
88
  devlift request show orders --no-input -o json # frozen diff for the reviewer
81
89
  devlift approval approve orders --no-input -y -o json # → requests[] all "approved"
90
+ devlift request show orders --env stage --no-input -o json # after approve: the frozen diff to show, and you.can_deploy
82
91
  # alternatives: approval request-changes orders --comment "…" -y ; approval reject orders --comment "…" -y ; approval revoke orders -y ; request withdraw orders -y
83
92
  ```
93
+ Before submitting, show the user what `request show` lists and get their
94
+ go-ahead. Submit moves the WHOLE change set, so a Kong route added earlier
95
+ ships with the settings change; someone who only remembers editing CPU must
96
+ not discover the route at approval time.
97
+
98
+ After submitting, report that it is waiting for approval, how many rows moved
99
+ and of which kinds, and who approves next. Read `you.can_approve` from
100
+ `request show` rather than writing "if you have approval rights" — the CLI
101
+ knows, so the user should not have to.
102
+
103
+ After approving, show the frozen diff in full (every row, Field | From | To):
104
+ approval is the last checkpoint before a cluster, and "approved" on its own
105
+ tells the user nothing about what they just cleared. Then read `you.can_deploy`
106
+ the same way to say whether they can ship it themselves.
107
+
84
108
  Self-approval works only where the resource group's rule allows it (403 → exit 4 otherwise).
85
109
 
86
110
  ## 7. Deploy and verify
87
111
 
88
112
  ```
89
113
  devlift eks deploy orders --env stage --no-input # lists approved rows, exit 5
90
- devlift eks deploy orders --env stage --no-input -y --wait -o json # → {workflow_id, status, state}
114
+ devlift eks deploy orders --env stage --no-input -y -o json # → {workflow_id, requests[]}
115
+ devlift deployment status <workflow_id> --no-input -o json # stages with status + timing, pr_url, resources
91
116
  devlift eks status orders --env stage --no-input -o json # .deployment (stages, pr_url) and .application (ArgoCD state)
92
117
  ```
118
+ After deploying, show the pipeline stages as the command gives them, each with
119
+ its status and timing, plus what is shipping and the workflow id. Do not
120
+ replace the stage list with a sentence: the user wants to see which step is
121
+ running. Name both follow-ups and the difference — `deployment status --wait`
122
+ answers "did DevLift's pipeline finish", `eks status` also asks ArgoCD "is the
123
+ pod serving". A finished pipeline is not a running application.
124
+
93
125
  Production: `--confirm-name orders` in place of relying on `-y`.
94
126
  Read `.application.state`: `up` = healthy pod; `waiting_for_argocd` /
95
127
  `starting` = keep polling (`--wait`); `not_configured` = no ArgoCD for that
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devlift-cli
3
- Version: 0.1.2
3
+ Version: 0.1.4
4
4
  Summary: DevLift command-line tool: create, change, review and deploy DevLift resources from the terminal.
5
5
  License: Proprietary
6
6
  Keywords: devlift,devops,deployment,infrastructure,cli
File without changes
File without changes
File without changes