@copado/agentia-cli 1.0.0-beta.5 → 1.0.0-beta.7

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 (96) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +906 -245
  3. package/dist/commands/adv/auth/status.js +20 -0
  4. package/dist/commands/adv/component/add.js +48 -0
  5. package/dist/commands/adv/component/list.js +46 -0
  6. package/dist/commands/adv/component/refresh.js +23 -0
  7. package/dist/commands/adv/component/remove.js +35 -0
  8. package/dist/commands/adv/component/selected.js +26 -0
  9. package/dist/commands/adv/component/types.js +16 -0
  10. package/dist/commands/adv/deployment/cancel.js +45 -0
  11. package/dist/commands/adv/deployment/create.js +23 -0
  12. package/dist/commands/adv/deployment/deploy.js +49 -0
  13. package/dist/commands/adv/deployment/get.js +21 -0
  14. package/dist/commands/adv/deployment/list.js +30 -0
  15. package/dist/commands/adv/deployment/options.js +33 -0
  16. package/dist/commands/adv/deployment/quick-deploy.js +57 -0
  17. package/dist/commands/adv/deployment/validate.js +32 -0
  18. package/dist/commands/adv/job/get.js +21 -0
  19. package/dist/commands/adv/job/list.js +30 -0
  20. package/dist/commands/adv/job/wait.js +33 -0
  21. package/dist/commands/adv/organization/get.js +21 -0
  22. package/dist/commands/adv/organization/list.js +21 -0
  23. package/dist/commands/adv/organization/validate.js +20 -0
  24. package/dist/commands/auth/get.js +24 -3
  25. package/dist/commands/auth/set.js +18 -0
  26. package/dist/commands/auth/unset.js +4 -0
  27. package/dist/commands/cicd/environment/get.js +3 -6
  28. package/dist/commands/cicd/environment/list.js +2 -7
  29. package/dist/commands/cicd/job/get.js +3 -7
  30. package/dist/commands/cicd/job/list.js +3 -7
  31. package/dist/commands/cicd/notification/get.js +44 -0
  32. package/dist/commands/cicd/pipeline/get.js +3 -7
  33. package/dist/commands/cicd/pipeline/list.js +3 -7
  34. package/dist/commands/cicd/project/get.js +3 -7
  35. package/dist/commands/cicd/project/list.js +3 -7
  36. package/dist/commands/cicd/promotion/get.js +3 -7
  37. package/dist/commands/cicd/promotion/list.js +3 -7
  38. package/dist/commands/cicd/stage/list.js +5 -6
  39. package/dist/commands/cicd/user/get.js +3 -7
  40. package/dist/commands/cicd/work/get.js +2 -2
  41. package/dist/commands/cicd/work/list.js +3 -7
  42. package/dist/commands/cicd/work/promote.js +1 -0
  43. package/dist/commands/cicd/work/publish.js +1 -0
  44. package/dist/commands/setup/skills/create.js +4 -0
  45. package/dist/commands/setup/skills/update.js +4 -0
  46. package/dist/hooks/init/migrate-user-config.js +5 -1
  47. package/dist/hooks/init/version-warning.js +5 -2
  48. package/dist/lib/adv-config.js +9 -0
  49. package/dist/lib/adv-flags.js +8 -0
  50. package/dist/lib/adv-gateway.js +8 -0
  51. package/dist/lib/adv-operations.js +29 -0
  52. package/dist/lib/adv-sanitization.js +8 -0
  53. package/dist/lib/adv-types.js +9 -0
  54. package/dist/lib/agentia-command.js +68 -3
  55. package/dist/lib/ai-config.js +3 -1
  56. package/dist/lib/auth-config.js +2 -1
  57. package/dist/lib/auth-profile.js +2 -1
  58. package/dist/lib/auth-status-format.js +2 -1
  59. package/dist/lib/cicd-gateway.js +2 -1
  60. package/dist/lib/cli-severity-color.js +4 -0
  61. package/dist/lib/environment-get.js +4 -0
  62. package/dist/lib/job-get.js +4 -0
  63. package/dist/lib/mcp/adv-tools.js +227 -0
  64. package/dist/lib/mcp/command-id.js +4 -1
  65. package/dist/lib/mcp/tool-annotations.js +23 -0
  66. package/dist/lib/mcp/tools.js +67 -67
  67. package/dist/lib/mcp/work-tools.js +10 -9
  68. package/dist/lib/notifications-get.js +10 -0
  69. package/dist/lib/pipeline-get.js +4 -0
  70. package/dist/lib/plugin-host/ai.js +5 -0
  71. package/dist/lib/plugin-host/environment.js +4 -0
  72. package/dist/lib/plugin-host/event-log.js +2 -1
  73. package/dist/lib/plugin-host/input.js +7 -0
  74. package/dist/lib/plugin-host/job.js +4 -0
  75. package/dist/lib/plugin-host/pipeline.js +4 -0
  76. package/dist/lib/plugin-host/project.js +5 -0
  77. package/dist/lib/plugin-host/projection-utils.js +6 -1
  78. package/dist/lib/plugin-host/promotion.js +4 -0
  79. package/dist/lib/plugin-host/stage.js +4 -0
  80. package/dist/lib/plugin-host/user.js +4 -0
  81. package/dist/lib/plugin-host/workspace.js +3 -0
  82. package/dist/lib/project-get.js +4 -0
  83. package/dist/lib/promotion-get.js +4 -0
  84. package/dist/lib/runtime.js +1 -1
  85. package/dist/lib/stage-list.js +3 -0
  86. package/dist/lib/testing-gateway.js +2 -1
  87. package/dist/lib/user-get.js +3 -0
  88. package/dist/lib/work-get.js +3 -2
  89. package/oclif.manifest.json +1578 -144
  90. package/package.json +35 -2
  91. package/templates/AGENTS.md +1 -1
  92. package/templates/skills/agentia-adv/SKILL.md +22 -0
  93. package/templates/skills/agentia-adv/references/pipelines-advanced.md +50 -0
  94. package/templates/skills/agentia-cicd/SKILL.md +3 -1
  95. package/templates/skills/agentia-cicd/references/notifications.md +79 -0
  96. package/templates/skills/agentia-cicd/references/work.md +19 -0
package/package.json CHANGED
@@ -35,7 +35,22 @@
35
35
  ],
36
36
  "homepage": "https://developer.copado.com/docs",
37
37
  "keywords": [
38
- "oclif"
38
+ "agentia",
39
+ "copado",
40
+ "salesforce",
41
+ "sfdc",
42
+ "devops",
43
+ "cicd",
44
+ "cli",
45
+ "oclif",
46
+ "mcp",
47
+ "ai",
48
+ "robotic",
49
+ "testting",
50
+ "metadata",
51
+ "pipeline",
52
+ "promotion",
53
+ "deployment"
39
54
  ],
40
55
  "license": "SEE LICENSE IN LICENSE.md",
41
56
  "main": "dist/index.js",
@@ -79,6 +94,24 @@
79
94
  "auth": {
80
95
  "description": "Manage authentication credentials"
81
96
  },
97
+ "adv": {
98
+ "description": "Manage Copado Pipelines Advanced deployments"
99
+ },
100
+ "adv:auth": {
101
+ "description": "Inspect Pipelines Advanced authentication"
102
+ },
103
+ "adv:component": {
104
+ "description": "Manage Pipelines Advanced deployment components"
105
+ },
106
+ "adv:deployment": {
107
+ "description": "Manage Pipelines Advanced deployments and runs"
108
+ },
109
+ "adv:job": {
110
+ "description": "Inspect Pipelines Advanced deployment jobs"
111
+ },
112
+ "adv:organization": {
113
+ "description": "Inspect Pipelines Advanced organizations"
114
+ },
82
115
  "cicd": {
83
116
  "description": "Manage Copado CICD workflows"
84
117
  },
@@ -202,7 +235,7 @@
202
235
  }
203
236
  },
204
237
  "type": "module",
205
- "version": "1.0.0-beta.5",
238
+ "version": "1.0.0-beta.7",
206
239
  "x-agentia-protected-build": true,
207
240
  "x-agentia-protected-files": [
208
241
  "dist/lib/runtime.js"
@@ -16,7 +16,7 @@ Read records before changing them and use IDs returned by Copado. Do not skip `w
16
16
 
17
17
  Load exactly one copy of each applicable Agentia skill. Prefer the client-specific root when available (`.cursor/skills` in Cursor or `.claude/skills` in Claude); otherwise use `.agents/skills`.
18
18
 
19
- - `agentia-cicd/SKILL.md`: Copado stories, commits, publish, submit, done, promotions, jobs, environments, pipelines, and data.
19
+ - `agentia-cicd/SKILL.md`: Copado stories, commits, publish, submit, done, promotions, jobs, environments, pipelines, Slack notification configure, and data.
20
20
  - `agentia-testing/SKILL.md`: Copado Robotic Testing operations.
21
21
  - `agentia-ai/SKILL.md`: Copado AI operations.
22
22
 
@@ -0,0 +1,22 @@
1
+ <!-- Agentia managed skill file: agentia setup skills -->
2
+ # Agentia Pipelines Advanced Skill
3
+
4
+ Use this skill when working with Copado Pipelines Advanced through the Agentia CLI.
5
+
6
+ ## Commands
7
+
8
+ - Configure global authentication with `agentia auth set --adv <PAT>`, or add `--local` for current-project/current-user scope. Both store the PAT in the keychain and auto-discover the Pipelines Advanced endpoint unless `--adv-base-url` is supplied.
9
+ - Use `agentia adv organization list|get|validate` to inspect accessible organizations and verify connectivity.
10
+ - Use `agentia adv deployment list|get|create|options|validate|deploy|quick-deploy|cancel` to define deployments, update options, and run or stop deployments.
11
+ - Use `agentia adv component types|list|refresh|selected|add|remove` to discover metadata types and manage selected deployment components.
12
+ - Use `agentia adv job get|list|wait` to inspect and poll deployment runs.
13
+
14
+ ## Safety
15
+
16
+ - Never pass PATs to `agentia adv ...` commands. Use `agentia auth set --adv` or project-scoped auth.
17
+ - Prefer `--json` for automation and agents.
18
+ - For component JSON files, use `--json-file`; `--json` remains the standard Agentia output flag.
19
+ - In JSON or non-interactive CLI runs, deploy, quick deploy, cancel, and auth removal require `--yes`. The matching MCP deployment mutations require `confirm: true`; validation does not.
20
+ - Treat a nonzero exit from a waited run as failure. JSON errors retain the command transaction ID and failed waited runs include `error.result.job`.
21
+
22
+ See `references/pipelines-advanced.md` for command flows and examples.
@@ -0,0 +1,50 @@
1
+ <!-- Agentia managed skill file: agentia setup skills -->
2
+ # Pipelines Advanced Reference
3
+
4
+ ## Setup
5
+
6
+ ```sh
7
+ agentia auth set --adv <PAT>
8
+ agentia adv auth status --json
9
+ ```
10
+
11
+ Authentication is global by default. Add `--local` to `auth set` for current-project/current-user scope; the PAT still stays in the keychain. Remove global auth with `auth unset --adv [--global]` or local auth with `auth unset --adv --local`; JSON/non-interactive removal requires `--yes`. Use `--adv-base-url` only for approved non-standard endpoints.
12
+
13
+ ## Deployment Journey
14
+
15
+ ```sh
16
+ agentia adv organization list --json
17
+ agentia adv organization validate <org-id>
18
+ agentia adv deployment create --name release-1 --source-org <source-org-id> --target-org <target-org-id>
19
+ agentia adv deployment options <deployment-id> --set deployOptionsIgnoreWarnings=false
20
+ agentia adv component types --json
21
+ agentia adv component list --flow <deployment-id> --type ApexClass --json
22
+ agentia adv component add <deployment-id> --component ApexClass/Foo
23
+ agentia adv deployment validate <deployment-id> --wait --json
24
+ agentia adv deployment deploy <deployment-id> --yes --wait --json
25
+ agentia adv job get <deployment-id> --json
26
+ ```
27
+
28
+ ## Notes
29
+
30
+ - `deployment list` exposes the API `flowId` as `id`; do not use the raw list row link id.
31
+ - `deployment list` returns at most 500 rows and has no filter.
32
+ - `deployment options` reads current options, merges `--set` or `--file`, and sends the complete options object because the API replaces the entire object. `--set` converts exact booleans/null and finite JavaScript Number forms, including hex and exponent notation. Supported test levels include `NO_TEST_RUN`, `RUN_SPECIFIED_TESTS`, `RUN_LOCAL_TESTS`, and `RUN_ALL_TESTS_IN_ORG`.
33
+ - `component types` can report the same type name in several views.
34
+ - `component add` and `component remove` accept `--component Type/Name`. Add supports a text `--file`; remove does not. `--json-file` must be a bare array and accepts `{type, fullName}`, rows extracted from `result.components`, or `{nodeType: {name}, fullName}`. Remove returns the submitted array in `requested`, not a count.
35
+ - `validate`, `deploy`, `quick-deploy`, and `cancel` are asynchronous; use `--wait` or `agentia adv job wait`.
36
+ - `deploy`, `quick-deploy`, and `cancel` prompt interactively. JSON and non-interactive runs require `--yes`; matching MCP tools require `confirm: true`.
37
+ - `quick-deploy --backup` invokes the server's `backupThenDeploy` action instead of a quick deploy.
38
+ - Polling defaults to 3 seconds with a 3600-second timeout. Failed or cancelled waited runs exit nonzero; JSON errors include the normalized job.
39
+ - `job list` excludes validation runs. Page numbering starts at 0, page size defaults to 50, and the server caps it at 100.
40
+ - API JSON errors expose sanitized code/status/method/URL/name/message plus `transactionId`; validation errors expose name/message plus `transactionId`.
41
+
42
+ ## MCP Argument Names
43
+
44
+ - Organizations and deployments use `id`; selected/components/jobs use `deploymentId`; component list/refresh use `flow`.
45
+ - Deployment validate: `id`, optional `wait`, `interval`, `timeout` (no confirmation).
46
+ - Deploy: the validation inputs plus `confirm: true`.
47
+ - Quick deploy: deploy inputs plus optional `backup`.
48
+ - Cancel: `id`, `confirm: true`, optional `wait`, `interval`, `timeout`.
49
+ - Component add/remove: `deploymentId`, `components` (`Type/Name` strings or `{type, fullName, excluded?}` objects).
50
+ - Job list: `deploymentId`, optional `page`, `pageSize`.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: agentia-cicd
3
- description: Use this skill when managing Copado CICD work with the Agentia CLI or Agentia MCP tools: user stories, cloud commit/promote, work publish/submit/done, promotion runs and conflicts, job executions, environments, credentials, pipelines, stages, and release data templates. Use it whenever the user asks an agent to operate Copado CICD from a terminal, IDE, or headless workflow.
3
+ description: Use this skill when managing Copado CICD work with the Agentia CLI or Agentia MCP tools: user stories (including current/active story context), cloud commit/promote, work publish/submit/done, promotion runs and conflicts, job executions, environments, credentials, pipelines, stages, Slack pipeline notification subscriptions, and release data templates. Use it whenever the user asks an agent to operate Copado CICD from a terminal, IDE, or headless workflow.
4
4
  ---
5
5
 
6
6
  <!-- Agentia managed skill file: agentia setup skills -->
@@ -25,10 +25,12 @@ Prefer Agentia MCP tools when they are available and match the task. Use CLI exa
25
25
  - Copado JobExecution lookup, actions, logs, and monitoring: [references/jobs.md](references/jobs.md)
26
26
  - Copado environments, environment credentials, and browser authentication: [references/environments-and-credentials.md](references/environments-and-credentials.md)
27
27
  - Pipelines, environment connections, stages, and stage connections: [references/pipelines.md](references/pipelines.md)
28
+ - Slack notification subscriptions on a pipeline (`agentia_notification_configure` / CLI): [references/notifications.md](references/notifications.md)
28
29
  - Release data templates, records, matching, sync, dataset files, and data commits: [references/data.md](references/data.md)
29
30
 
30
31
  ## General Rules
31
32
 
33
+ - When the user means the **current story**, **current user story**, **active story**, **story context**, or similar without giving an ID, resolve context first with `agentia cicd work get --json` (no positional story ID). Use the returned user story (`result`) for follow-up work—any fields the task needs (for example `id`, `name`, `title`, `status`, specs, pipeline or environment IDs), not only identifiers. If the command fails (for example no active work item from `work set`), report the CLI error to the user and stop; do not guess, list stories, or pick a substitute unless the user asks you to.
32
34
  - Use Salesforce record IDs or generated names read from Copado. Do not invent story names, promotion IDs, job IDs, credential IDs, or pipeline IDs.
33
35
  - Keep human output off stdout in JSON workflows. Prefer `--json`, then parse the result object.
34
36
  - For local project work, keep the tracked working tree clean before commands that require it: `work set`, `work publish`, and `work submit`. If `work set` returns `status: "warning"`, show the message and do not assume a feature branch was created; branch keys are cleared and the work item id/name/title are still recorded in config.user.json.
@@ -0,0 +1,79 @@
1
+ <!-- Agentia managed skill file: agentia setup skills -->
2
+
3
+ # CICD Notifications Reference
4
+
5
+ Use this reference for `agentia cicd notification configure` and `agentia cicd notification get`.
6
+
7
+ Prefer `agentia_notification_configure` and `agentia_notification_get` when Agentia MCP is available. Otherwise use the CLI commands and add `--json` when an agent will parse or reuse the result.
8
+
9
+ Notifications are Slack-only (`providers: ["slack"]`). **Configure** creates or updates one subscription for the **current Copado user** on a **pipeline** for a chosen **event**. **Get** reads the authenticated user's stored subscriptions for that pipeline (sanitized; no raw system-property metadata).
10
+
11
+ ## Workflow
12
+
13
+ 1. Confirm CICD auth with `agentia auth get --cicd --json` (or process overrides). Never log API keys.
14
+ 2. Resolve the pipeline Salesforce Id with `agentia cicd pipeline list` and/or `agentia cicd pipeline get <pipeline-id> --json`. See [pipelines.md](pipelines.md).
15
+ 3. **Read** existing subscriptions with `agentia_notification_get` (MCP) or `notification get -p <pipeline-id>` (CLI), optionally with `--json`.
16
+ 4. **Write** one subscription with `agentia_notification_configure` (MCP) or `notification configure` (CLI) with all required fields/flags.
17
+ 5. Report `result.pipelineId`, subscription fields, and `result.subscription` / table rows (no secrets in output).
18
+
19
+ ## Commands
20
+
21
+ | Command | Use For | Notes |
22
+ | --- | --- | --- |
23
+ | `notification get` | List the current user's Slack subscriptions on a pipeline | Requires `--pipeline-id` / `-p` only. |
24
+ | `notification configure` | Subscribe the current user to a Slack destination for one pipeline event | All configure flags below are required. |
25
+
26
+ ## `notification get` flags
27
+
28
+ | Flag | Values | Notes |
29
+ | --- | --- | --- |
30
+ | `--pipeline-id` / `-p` | 15- or 18-character Salesforce Id | Same validation as configure. |
31
+
32
+ JSON `result`: `{ pipelineId, subscriptions[] }` where each subscription has `event`, `providers`, `destinationType`, `destinationId`, and `subscription`. Empty subscriptions print a clear human message and exit 0.
33
+
34
+ ## `notification configure` required flags
35
+
36
+ | Flag | Values | Notes |
37
+ | --- | --- | --- |
38
+ | `--pipeline-id` / `-p` | 15- or 18-character Salesforce Id | Letters, digits, underscores only. Read from `pipeline list` / `pipeline get`. |
39
+ | `--event` | See event list below | Quote values that contain spaces (e.g. `"Test_Not Started"`). |
40
+ | `--destination-type` | `user` \| `channel` | Slack destination kind. |
41
+ | `--destination-id` | Slack user or channel id or name | Examples: `U0123ABCD`, `C0123ABCD`, `@jane`, `#alerts`. Cannot be empty or whitespace-only. |
42
+ | `--subscription` | `user` \| `all` | Who receives this notification for the event on the pipeline. |
43
+
44
+ ## Notification Events
45
+
46
+ `Promotion_Success`, `Promotion_Failed`, `Promotion_Conflict`, `Failed_Promotion_Creation`, `Deploy_Success`, `Deploy_Failed`, `Commit_Failed`, `Successful_Snapshot`, `Failed_Snapshot`, `ManualTask_Assigned`, `Test_Success`, `Test_Failed`, `Test_Cancelled`, `Test_Not Started`, `Quality_Gate_Success`, `Quality_Gate_Failed`, `Quality_Gate_Cancelled`, `Quality_Gate_Not Started`, `Create_Package_Success`, `Create_Package_Failure`, `Generate_Package_Version_Success`, `Generate_Package_Version_Failure`, `Import_Package_Success`, `Import_Package_Failure`, `Publish_Package_Success`, `Publish_Package_Failure`.
47
+
48
+ ## Examples
49
+
50
+ ```sh
51
+ agentia cicd pipeline get <pipeline-id> --json
52
+ agentia cicd notification get -p <pipeline-id> --json
53
+ # MCP: agentia_notification_get with pipelineId
54
+ agentia cicd notification configure --pipeline-id <pipeline-id> --event Promotion_Failed --destination-type user --destination-id U0123ABCD --subscription user --json
55
+ agentia cicd notification configure -p <pipeline-id> --event Commit_Failed --destination-type channel --destination-id C0123ABCD --subscription all --json
56
+ agentia cicd notification configure --pipeline-id <pipeline-id> --event "Test_Not Started" --destination-type user --destination-id @jane --subscription user --json
57
+ ```
58
+
59
+ ## JSON Result
60
+
61
+ With `--json`, stdout is structured data only (no spinner or human summary). Configure echoes the configured subscription in `result`, including `providers: ["slack"]`. Get returns `result.pipelineId` and `result.subscriptions`.
62
+
63
+ ## Errors And Validation
64
+
65
+ | Situation | What to do |
66
+ | --- | --- |
67
+ | Invalid or empty `--pipeline-id` | Fix before the gateway runs; use a valid 15- or 18-character pipeline Id from Copado. |
68
+ | Current user ID unavailable (get) | Ensure CICD auth is configured; the command exits before querying system properties. |
69
+ | Empty `--destination-id` (configure) | Provide a non-empty Slack user or channel identifier. |
70
+ | `NTF-003` | Slack destination does not match `--destination-type`; recheck `destination-id` and `destination-type`. |
71
+ | `NTF-004` | Pipeline id rejected upstream; re-read `pipeline get` and retry with the correct Id. |
72
+ | Other gateway errors | Surface the message without inventing alternate APIs or leaking credentials. |
73
+
74
+ ## Gotchas
75
+
76
+ - Pipeline notification setup is separate from `agentia auth set --cicd` (CLI API key) and from `cicd credential` (Salesforce org credentials on environments).
77
+ - `destination-type user` with `subscription user` is the usual personal alert pattern; `subscription all` widens audience for the event on that pipeline.
78
+ - Event names with spaces must be quoted in the shell.
79
+ - Get reads pipeline-scoped system properties for the authenticated user only; there is no cross-user list command.
@@ -4,6 +4,25 @@
4
4
 
5
5
  Use this reference for `agentia cicd work ...`, `agentia cicd cloud ...`, and matching MCP tools such as `agentia_work_get`, `agentia_cloud_commit`, `agentia_work_publish`, and `agentia_work_submit`.
6
6
 
7
+ ## Current Story Context
8
+
9
+ Treat these as requests for the locally active Copado user story (from a prior `work set`), not a specific ID the user supplied:
10
+
11
+ - current story, current user story, active story, this story
12
+ - story context, work item context, what story am I on
13
+
14
+ **Resolve before continuing** (status updates, publish/submit, deployment steps, promotions tied to “this” story, and similar):
15
+
16
+ ```sh
17
+ agentia cicd work get --json
18
+ ```
19
+
20
+ Omit the positional story ID only; keep `--json` so agents parse the `result` object. With MCP, call `agentia_work_get` without an `id` when available.
21
+
22
+ **On success:** treat the JSON `result` user story as the story context for the rest of the task. Reuse any returned fields later commands or flags need (identifiers, names, status, acceptance criteria, functional or technical specs, pipeline or environment references, and similar)—not only `id` and `name`.
23
+
24
+ **On failure:** the CLI exits when no active work item is recorded (typical message: no active work item; suggestion to run `agentia cicd work set <id>`). Tell the user that no current story is set, include the sanitized error text, and stop. Do not invent an ID, run `work list` to pick one, or continue the original request until the user sets context or provides an explicit story ID.
25
+
7
26
  ## Choose One Workflow
8
27
 
9
28
  Local and cloud work are separate delivery paths. Do not continue a cloud commit with local `work publish` or `work submit`: those commands inspect and push the local Git feature branch.