@duvoai/cli 0.1.1 → 0.3.0

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.
package/README.md CHANGED
@@ -46,27 +46,113 @@ duvo --profile team-2 whoami # one-off override for a single command
46
46
 
47
47
  ## Commands
48
48
 
49
- | Command | Description |
50
- | --------------------------------------------------- | ------------------------------------------------------- |
51
- | `duvo login` | Store an API key under a named profile |
52
- | `duvo logout` | Remove a profile |
53
- | `duvo whoami` | Show the active profile, API key owner, and masked key |
54
- | `duvo profiles <subcmd>` | `list`, `use`, `rename`, `remove` |
55
- | `duvo agents list` | List agents on your team |
56
- | `duvo agents get <id>` | Show details for one agent |
57
- | `duvo agents create` | Create a new agent |
58
- | `duvo agents update <id>` | Update an agent's name or settings |
59
- | `duvo agent-folders list` | List agent folders for your team |
60
- | `duvo agent-folders create` | Create an agent folder |
61
- | `duvo agent-folders update <id>` | Rename or move an agent folder |
62
- | `duvo agent-folders delete <id>` | Delete an agent folder |
63
- | `duvo agent-folders move-agents` | Move agents into a folder or to root |
64
- | `duvo runs start --agent <id>` | Start a new run for the given agent |
65
- | `duvo runs list` | List runs for your team (filter by agent, status, etc.) |
66
- | `duvo sandboxes create` | Create a sandbox for staging files |
67
- | `duvo sandboxes files <id>` | List files in a sandbox directory |
68
- | `duvo sandboxes upload <id> <file>` | Upload a local file (max 10MB) |
69
- | `duvo sandboxes prepare-upload-url <id> --path <p>` | Get a presigned upload URL |
70
- | `duvo api <method> <path>` | Make a raw authenticated API request |
49
+ | Command | Description |
50
+ | ------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------- |
51
+ | `duvo login` | Store an API key under a named profile |
52
+ | `duvo logout` | Remove a profile |
53
+ | `duvo whoami` | Show the active profile, API key owner, and masked key |
54
+ | `duvo profiles <subcmd>` | `list`, `use`, `rename`, `remove` |
55
+ | `duvo agents list` | List agents on your team |
56
+ | `duvo agents get <id>` | Show details for one agent |
57
+ | `duvo agents create` | Create a new agent |
58
+ | `duvo agents update <id>` | Update an agent's name or settings |
59
+ | `duvo agents schedules <agent-id>` | List schedules you own for an agent |
60
+ | `duvo agent-folders list` | List agent folders for your team |
61
+ | `duvo agent-folders create` | Create an agent folder |
62
+ | `duvo agent-folders update <id>` | Rename or move an agent folder |
63
+ | `duvo agent-folders delete <id>` | Delete an agent folder |
64
+ | `duvo agent-folders move-agents` | Move agents into a folder or to root |
65
+ | `duvo runs start --agent <id>` | Start a new run for the given agent |
66
+ | `duvo runs list` | List runs for your team (filter by agent, status, etc.) |
67
+ | `duvo runs get <id>` | Get an agent run by ID |
68
+ | `duvo runs messages <id>` | List messages for an agent run |
69
+ | `duvo runs send-message <id> --message <text>` | Post a message to an agent run |
70
+ | `duvo runs respond <run-id> [request-id]` | Respond to a human-in-the-loop request on a run (defaults to the pending request) |
71
+ | `duvo runs stop <id>` | Stop a running agent run |
72
+ | `duvo sandboxes create` | Create a sandbox for staging files |
73
+ | `duvo sandboxes files <id>` | List files in a sandbox directory |
74
+ | `duvo sandboxes upload <id> <file>` | Upload a local file (max 10MB) |
75
+ | `duvo sandboxes prepare-upload-url <id> --path <p>` | Get a presigned upload URL |
76
+ | `duvo cases list --queue <id>` | List cases in a queue |
77
+ | `duvo cases get <id>` | Get a case by ID with its event history |
78
+ | `duvo cases create --queue <id>` | Create one or more cases (`--title` for one or `--from-file` with a JSON array) |
79
+ | `duvo cases delete <id>` | Delete a case (interrupts any associated running jobs) |
80
+ | `duvo cases clear --queue <id>` | Delete every case in a queue (interrupts running jobs first) |
81
+ | `duvo cases bulk-delete --queue <id> --ids <list>` | Delete multiple cases from a queue (1-100; interrupts running jobs first) |
82
+ | `duvo cases bulk-delegate --queue <id> --agent <id> --ids <list>` | Delegate cases to a queue consumer agent (1-100; see `duvo queues agents`) |
83
+ | `duvo cases bulk-retry --queue <id> --ids <list>` | Retry multiple cases by resetting them to pending (1-100; interrupts active runs) |
84
+ | `duvo cases bulk-update-status --queue <id> --ids <list>` | Update the status of multiple cases to completed or failed (1-100) |
85
+ | `duvo cases runs <case-id>` | List jobs (agent runs) that have worked on a case |
86
+ | `duvo cases labels list <case-id> --queue <id>` | List labels assigned to a case |
87
+ | `duvo cases labels assign <case-id> --queue <id> --label "<key=value\|value>" [...]` | Assign labels to a case (`--label` repeatable, accepts `key=value` or tag-only `value`) |
88
+ | `duvo cases labels unlink <case-id> --queue <id> --label-id <label-id> [...]` | Remove labels from a case (`--label-id` repeatable) |
89
+ | `duvo queue-labels list --queue <queue-id>` | List labels defined on a queue (with case counts) |
90
+ | `duvo queue-labels create --queue <queue-id> --value <v>` | Create a label on a queue (`--value` required) |
91
+ | `duvo queue-labels update <label-id> --queue <queue-id> --value <v>` | Rename a label or change its color (`--value` required) |
92
+ | `duvo queue-labels delete <label-id> --queue <queue-id>` | Delete a label and remove it from all cases |
93
+ | `duvo files list` | List team files |
94
+ | `duvo files upload-url` | Get a presigned upload URL for a team file |
95
+ | `duvo files download-url <path>` | Get a presigned download URL |
96
+ | `duvo files content <path>` | Print the content of a text file |
97
+ | `duvo files content-set <path>` | Update the content of a text file |
98
+ | `duvo files rename` | Rename a team file |
99
+ | `duvo files delete <path>` | Delete a team file |
100
+ | `duvo revisions list --agent <id>` | List revisions for an agent |
101
+ | `duvo revisions get <id> --agent <id>` | Get a revision by ID |
102
+ | `duvo revisions create --agent <id> --name <text>` | Create a new revision for an existing agent |
103
+ | `duvo revisions update <id>` | Update a revision's config (handover targets are derived from the SOP) |
104
+ | `duvo integrations list` | List the team's integration catalog |
105
+ | `duvo connections list` | List your connections (filter with `--type`) |
106
+ | `duvo connections get <id>` | Get one of your connections by ID |
107
+ | `duvo revision-integrations list` | List integrations attached to a revision |
108
+ | `duvo revision-integrations attach` | Attach one or more integrations to a revision |
109
+ | `duvo revision-integrations remove <integration-id>` | Remove an integration slot from a revision |
110
+ | `duvo revision-integrations connections list` | List your pinned connections for a revision's integration slot |
111
+ | `duvo revision-integrations connections pin <id>` | Pin one of your connections to a revision's integration slot |
112
+ | `duvo revision-integrations connections unpin <id>` | Unpin a connection from a revision's integration slot |
113
+ | `duvo plugins list` | List plugins referenceable by name in a revision |
114
+ | `duvo queues list` | List case queues for your team |
115
+ | `duvo queues get <id>` | Get a case queue by ID |
116
+ | `duvo queues create --name <name>` | Create a new case queue |
117
+ | `duvo queues update <id>` | Update a case queue |
118
+ | `duvo queues delete <id>` | Delete a case queue (interrupts running jobs and removes all cases) |
119
+ | `duvo queues agents <queue-id>` | List producer/consumer agents bound to a queue |
120
+ | `duvo skills list [--system]` | List skills (or system skills only) |
121
+ | `duvo skills delete <id>` | Delete a custom skill |
122
+ | `duvo skills files <id>` | List files in a skill |
123
+ | `duvo skills file-get <id> <path>` | Print the content of a file in a skill |
124
+ | `duvo skills file-update <id> <path>` | Update the content of a file in a skill |
125
+ | `duvo skills download <id>` | Download a custom skill as a ZIP |
126
+ | `duvo skills generate --prompt <text>` | Generate a SKILL.md from a prompt |
127
+ | `duvo team members [--team <id>]` | List members of a team (defaults to the team scoped to the API key) |
128
+ | `duvo api <method> <path>` | Make a raw authenticated API request |
71
129
 
72
130
  Run `duvo <command> --help` for full flags on any command.
131
+
132
+ ## Publishing
133
+
134
+ The CLI is published to npm as [`@duvoai/cli`](https://www.npmjs.com/package/@duvoai/cli) via the [`Publish @duvoai/cli`](../.github/workflows/publish-duvo-cli.yml) GitHub Actions workflow.
135
+
136
+ ### How to publish a new version
137
+
138
+ 1. Bump `version` in `duvo-cli/package.json` (follow SemVer) and merge to the default branch.
139
+ 2. Open the **Actions** tab → **Publish @duvoai/cli** → **Run workflow** and dispatch it from the default branch.
140
+ 3. The workflow reads the version from `package.json`, skips if that version is already on npm, otherwise builds the CLI with prod Auth0 config baked in and publishes to npm.
141
+
142
+ ### How the workflow works
143
+
144
+ - **Trigger:** manual `workflow_dispatch` only. There is no automatic publish on push or tag.
145
+ - **Auth:** OIDC trusted publishing to npm — no `NPM_TOKEN` is stored in the repo. The npm registry has a Trusted Publisher configured for `@duvoai/cli` pointing at this repo + workflow file. See [npm Trusted Publishers](https://docs.npmjs.com/trusted-publishers).
146
+ - **Idempotent:** `npm view @duvoai/cli@<version>` runs first; if the version already exists the build/publish steps are skipped, so re-running the workflow on an unchanged version is a no-op.
147
+ - **Concurrency:** the job uses `concurrency.group: publish-duvo-cli-${{ github.ref }}` with `cancel-in-progress: false`, so two near-simultaneous dispatches serialize instead of racing past the version check.
148
+ - **Auth0 config baked at build time:** the publish step sets `DUVO_CLI_DOMAIN=login.duvo.ai`, `DUVO_CLI_AUDIENCE=https://api.duvo.ai`, and `DUVO_CLI_CLIENT_ID=${{ secrets.DUVO_CLI_PROD_CLIENT_ID }}` so the published artifact targets the prod Auth0 tenant regardless of who runs `duvo login` and where.
149
+
150
+ ### Required secrets
151
+
152
+ | Secret | Purpose |
153
+ | ------------------------- | ----------------------------------------------------------------- |
154
+ | `DUVO_CLI_PROD_CLIENT_ID` | Auth0 prod-tenant Client ID for the "Duvo CLI" Native application |
155
+
156
+ ### Yanking a bad release
157
+
158
+ `npm publish` is append-only. To pull a broken version use `npm deprecate @duvoai/cli@<version> "<reason>"` (or in extreme cases, `npm unpublish` within the 72-hour window). Then bump the version in `package.json` and re-run the workflow.