@atollhq/skill-gemini 0.1.11 → 0.1.12
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 +19 -9
- package/bin/install.mjs +38 -9
- package/package.json +1 -1
- package/skill/SKILL.md +55 -25
- package/skill/references/api-endpoints.md +19 -3
package/README.md
CHANGED
|
@@ -7,11 +7,13 @@ Gives your Gemini agent the ability to manage tasks, goals, KPIs, initiatives, m
|
|
|
7
7
|
## Install
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
npx @atollhq/skill-gemini --key sk_atoll_... --org your-org-id
|
|
10
|
+
npx @atollhq/skill-gemini --key sk_atoll_... --org your-org-id --project project-id --team team-id
|
|
11
11
|
# or
|
|
12
12
|
ATOLL_API_KEY=sk_atoll_... ATOLL_ORG_ID=your-org-id npx @atollhq/skill-gemini
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
+
Optional defaults: `--project`, `--team`, and `--base-url` write `ATOLL_PROJECT`, `ATOLL_TEAM`, and `ATOLL_BASE_URL` for the agent.
|
|
16
|
+
|
|
15
17
|
Get an API key from **Settings > Members > Add Agent** (or **Create API Key** for integrations) in the Atoll app.
|
|
16
18
|
|
|
17
19
|
This does four things:
|
|
@@ -19,7 +21,7 @@ This does four things:
|
|
|
19
21
|
1. Installs the `atoll-api` skill to `~/.gemini/skills/atoll-api/`
|
|
20
22
|
2. Appends (or updates) an `# Atoll Integration` section in `~/.gemini/GEMINI.md`
|
|
21
23
|
3. Copies API reference files to `~/.gemini/atoll-references/`
|
|
22
|
-
4. Appends
|
|
24
|
+
4. Appends Atoll env var exports to your shell profile (`~/.zshrc` or `~/.bashrc`)
|
|
23
25
|
|
|
24
26
|
Open a fresh shell (or `source` your profile) and Gemini has the Atoll integration.
|
|
25
27
|
|
|
@@ -31,6 +33,7 @@ Once installed, ask Gemini anything task-related:
|
|
|
31
33
|
"List my Atoll tasks"
|
|
32
34
|
"Create an issue to fix the login bug, priority 1"
|
|
33
35
|
"What goals are off pace?"
|
|
36
|
+
"Check my Atoll heartbeat"
|
|
34
37
|
"Move ATOLL-42 to in_progress"
|
|
35
38
|
```
|
|
36
39
|
|
|
@@ -40,19 +43,26 @@ For terminal-first work, see [`@atollhq/cli`](https://www.npmjs.com/package/@ato
|
|
|
40
43
|
|
|
41
44
|
```bash
|
|
42
45
|
npm install -g @atollhq/cli
|
|
43
|
-
atoll auth
|
|
44
|
-
atoll
|
|
46
|
+
atoll auth login --profile agent-a --key sk_atoll_... --org your-org-slug --project project-id --team team-id
|
|
47
|
+
atoll heartbeat
|
|
48
|
+
atoll issue list --json
|
|
49
|
+
atoll agent-context
|
|
45
50
|
```
|
|
46
51
|
|
|
47
52
|
For multiple agents or orgs, use CLI auth profiles:
|
|
48
53
|
|
|
49
54
|
```bash
|
|
50
|
-
atoll auth
|
|
51
|
-
atoll auth
|
|
52
|
-
atoll auth login --profile agent-a --key sk_atoll_... --org acme --project project-uuid
|
|
53
|
-
atoll auth login --profile agent-b --key sk_atoll_... --org client
|
|
55
|
+
atoll auth login --profile agent-a --key sk_atoll_... --org acme
|
|
56
|
+
atoll auth login --profile agent-b --key sk_atoll_... --org client --project project-id --team team-id
|
|
54
57
|
atoll --profile agent-b issue list
|
|
55
|
-
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
The companion CLI also supports safer issue removal and local/upstream feedback:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
atoll issue archive ATOLL-42
|
|
64
|
+
atoll issue delete ATOLL-42 --dry-run
|
|
65
|
+
atoll feedback "The heartbeat output should include blocked issue details"
|
|
56
66
|
```
|
|
57
67
|
|
|
58
68
|
## License
|
package/bin/install.mjs
CHANGED
|
@@ -12,6 +12,9 @@ function parseArgs(argv) {
|
|
|
12
12
|
for (let i = 2; i < argv.length; i++) {
|
|
13
13
|
if (argv[i] === '--key' && argv[i + 1]) args.key = argv[++i]
|
|
14
14
|
else if (argv[i] === '--org' && argv[i + 1]) args.org = argv[++i]
|
|
15
|
+
else if (argv[i] === '--project' && argv[i + 1]) args.project = argv[++i]
|
|
16
|
+
else if (argv[i] === '--team' && argv[i + 1]) args.team = argv[++i]
|
|
17
|
+
else if (argv[i] === '--base-url' && argv[i + 1]) args.baseUrl = argv[++i]
|
|
15
18
|
else if (argv[i] === '--help' || argv[i] === '-h') args.help = true
|
|
16
19
|
}
|
|
17
20
|
return args
|
|
@@ -19,24 +22,30 @@ function parseArgs(argv) {
|
|
|
19
22
|
|
|
20
23
|
function printUsage() {
|
|
21
24
|
console.log(`
|
|
22
|
-
Usage: npx @atollhq/skill-gemini --key <api-key> --org <org-id>
|
|
25
|
+
Usage: npx @atollhq/skill-gemini --key <api-key> --org <org-id> [--project <id>] [--team <id-or-slug>] [--base-url <url>]
|
|
23
26
|
or: ATOLL_API_KEY=<api-key> ATOLL_ORG_ID=<org-id> npx @atollhq/skill-gemini
|
|
24
27
|
|
|
25
28
|
Options:
|
|
26
|
-
--key
|
|
27
|
-
--org
|
|
28
|
-
--
|
|
29
|
+
--key Atoll API key (sk_atoll_...). Defaults to ATOLL_API_KEY.
|
|
30
|
+
--org Organization ID. Defaults to ATOLL_ORG_ID.
|
|
31
|
+
--project Default project ID. Defaults to ATOLL_PROJECT.
|
|
32
|
+
--team Default team ID or slug. Defaults to ATOLL_TEAM.
|
|
33
|
+
--base-url Atoll base URL. Defaults to ATOLL_BASE_URL.
|
|
34
|
+
--help Show this help message
|
|
29
35
|
|
|
30
36
|
Installs the Atoll integration for Gemini CLI:
|
|
31
37
|
- Installs the atoll-api skill to ~/.gemini/skills/atoll-api/
|
|
32
38
|
- Writes GEMINI.md with API reference to ~/.gemini/
|
|
33
|
-
- Sets
|
|
39
|
+
- Sets Atoll env vars
|
|
34
40
|
`)
|
|
35
41
|
}
|
|
36
42
|
|
|
37
43
|
const args = parseArgs(process.argv)
|
|
38
44
|
args.key ??= process.env.ATOLL_API_KEY
|
|
39
45
|
args.org ??= process.env.ATOLL_ORG_ID
|
|
46
|
+
args.project ??= process.env.ATOLL_PROJECT
|
|
47
|
+
args.team ??= process.env.ATOLL_TEAM
|
|
48
|
+
args.baseUrl ??= process.env.ATOLL_BASE_URL
|
|
40
49
|
|
|
41
50
|
if (args.help) { printUsage(); process.exit(0) }
|
|
42
51
|
|
|
@@ -64,6 +73,11 @@ console.log(`Installed Atoll skill to ${skillDest}`)
|
|
|
64
73
|
// 2. Write GEMINI.md to ~/.gemini/
|
|
65
74
|
const skillMd = readFileSync(join(skillDir, 'SKILL.md'), 'utf-8')
|
|
66
75
|
const body = skillMd.replace(/^---[\s\S]*?---\n*/, '')
|
|
76
|
+
const optionalCredentialLines = [
|
|
77
|
+
args.project ? `- Default project ID: ${args.project}` : null,
|
|
78
|
+
args.team ? `- Default team: ${args.team}` : null,
|
|
79
|
+
args.baseUrl ? `- Base URL: ${args.baseUrl}` : null,
|
|
80
|
+
].filter(Boolean).join('\n')
|
|
67
81
|
|
|
68
82
|
const geminiMd = `# Atoll Integration
|
|
69
83
|
|
|
@@ -72,7 +86,7 @@ ${body}
|
|
|
72
86
|
## Credentials
|
|
73
87
|
|
|
74
88
|
- API Key: set as ATOLL_API_KEY environment variable
|
|
75
|
-
- Org ID: ${args.org}
|
|
89
|
+
- Org ID: ${args.org}${optionalCredentialLines ? `\n${optionalCredentialLines}` : ''}
|
|
76
90
|
`
|
|
77
91
|
|
|
78
92
|
const geminiPath = join(geminiDir, 'GEMINI.md')
|
|
@@ -117,12 +131,27 @@ if (existsSync(profilePath)) {
|
|
|
117
131
|
}
|
|
118
132
|
profile = upsertExport(profile, 'ATOLL_API_KEY', args.key)
|
|
119
133
|
profile = upsertExport(profile, 'ATOLL_ORG_ID', args.org)
|
|
134
|
+
if (args.project) profile = upsertExport(profile, 'ATOLL_PROJECT', args.project)
|
|
135
|
+
if (args.team) profile = upsertExport(profile, 'ATOLL_TEAM', args.team)
|
|
136
|
+
if (args.baseUrl) profile = upsertExport(profile, 'ATOLL_BASE_URL', args.baseUrl)
|
|
120
137
|
writeFileSync(profilePath, profile)
|
|
121
|
-
|
|
138
|
+
const configuredVars = ['ATOLL_API_KEY', 'ATOLL_ORG_ID']
|
|
139
|
+
if (args.project) configuredVars.push('ATOLL_PROJECT')
|
|
140
|
+
if (args.team) configuredVars.push('ATOLL_TEAM')
|
|
141
|
+
if (args.baseUrl) configuredVars.push('ATOLL_BASE_URL')
|
|
142
|
+
console.log(`Configured ${configuredVars.join(', ')} in ${profilePath}`)
|
|
122
143
|
} else {
|
|
123
|
-
const
|
|
144
|
+
const envLines = [
|
|
145
|
+
'# Atoll (added by @atollhq/skill-gemini)',
|
|
146
|
+
`export ATOLL_API_KEY="${args.key}"`,
|
|
147
|
+
`export ATOLL_ORG_ID="${args.org}"`,
|
|
148
|
+
args.project ? `export ATOLL_PROJECT="${args.project}"` : null,
|
|
149
|
+
args.team ? `export ATOLL_TEAM="${args.team}"` : null,
|
|
150
|
+
args.baseUrl ? `export ATOLL_BASE_URL="${args.baseUrl}"` : null,
|
|
151
|
+
].filter(Boolean)
|
|
152
|
+
const envBlock = `\n${envLines.join('\n')}\n`
|
|
124
153
|
writeFileSync(profilePath, envBlock)
|
|
125
|
-
console.log(`Created ${profilePath} with
|
|
154
|
+
console.log(`Created ${profilePath} with Atoll env vars`)
|
|
126
155
|
}
|
|
127
156
|
|
|
128
157
|
console.log(`\nDone! Restart your shell, then Gemini CLI will have access to the Atoll API.`)
|
package/package.json
CHANGED
package/skill/SKILL.md
CHANGED
|
@@ -56,45 +56,44 @@ npm install -g @atollhq/cli # or: npx @atollhq/cli ...
|
|
|
56
56
|
Configure once:
|
|
57
57
|
|
|
58
58
|
```bash
|
|
59
|
-
atoll auth
|
|
60
|
-
|
|
61
|
-
# Or configure non-interactively:
|
|
62
|
-
atoll auth login --key sk_atoll_... --org my-org
|
|
59
|
+
atoll auth login --key sk_atoll_...
|
|
60
|
+
atoll config set-org my-org
|
|
63
61
|
```
|
|
64
62
|
|
|
65
63
|
For machines or agents that need multiple credentials, use auth profiles:
|
|
66
64
|
|
|
67
65
|
```bash
|
|
68
|
-
atoll auth
|
|
69
|
-
atoll auth
|
|
66
|
+
atoll auth login --profile agent-a --key sk_atoll_... --org acme
|
|
67
|
+
atoll auth login --profile agent-b --key sk_atoll_... --org client --project project-id --team team-id
|
|
70
68
|
atoll auth profiles
|
|
71
69
|
atoll auth use agent-a
|
|
72
70
|
|
|
73
|
-
# Non-interactive profile setup can include default org/project context
|
|
74
|
-
atoll auth login --profile agent-a --key sk_atoll_... --org acme --project project-uuid
|
|
75
|
-
atoll auth login --profile agent-b --key sk_atoll_... --org client
|
|
76
|
-
|
|
77
71
|
# Run one command as a specific profile
|
|
78
72
|
atoll --profile agent-b issue list
|
|
79
|
-
|
|
80
|
-
# Remove an obsolete profile
|
|
81
|
-
atoll auth delete-profile agent-b --force
|
|
82
73
|
```
|
|
83
74
|
|
|
75
|
+
Profiles can store default project, team, and base URL values. `atoll issue list` and `atoll issue create` apply the selected default team unless a command-level `--team` override is passed.
|
|
76
|
+
|
|
84
77
|
Common commands:
|
|
85
78
|
|
|
86
79
|
```bash
|
|
80
|
+
# Agent orientation
|
|
81
|
+
atoll heartbeat
|
|
82
|
+
atoll heartbeat --signals-only
|
|
83
|
+
atoll heartbeat --severity critical
|
|
84
|
+
atoll heartbeat --json
|
|
85
|
+
atoll agent-context
|
|
86
|
+
|
|
87
87
|
# List tasks
|
|
88
|
-
atoll issue list
|
|
89
|
-
atoll issue list --
|
|
90
|
-
atoll issue list --status todo --priority 1
|
|
88
|
+
atoll issue list --json
|
|
89
|
+
atoll issue list --status todo --priority 1 --limit 25
|
|
91
90
|
|
|
92
91
|
# View a task
|
|
93
|
-
atoll issue
|
|
92
|
+
atoll issue get ATOLL-42
|
|
93
|
+
atoll issue view ATOLL-42 # alias kept for humans
|
|
94
94
|
|
|
95
95
|
# Create a task
|
|
96
96
|
atoll issue create --title "Fix login bug" --status todo --priority 1
|
|
97
|
-
atoll issue create --title "Fix login bug" --project <project-id>
|
|
98
97
|
|
|
99
98
|
# Update a task
|
|
100
99
|
atoll issue update ATOLL-42 --status in_progress
|
|
@@ -106,15 +105,28 @@ atoll issue assign ATOLL-42 --to self
|
|
|
106
105
|
# Comments
|
|
107
106
|
atoll comment add ATOLL-42 --body "Working on this now"
|
|
108
107
|
|
|
108
|
+
# Safe removal
|
|
109
|
+
atoll issue archive ATOLL-42
|
|
110
|
+
atoll issue unarchive ATOLL-42
|
|
111
|
+
atoll issue delete ATOLL-42 --dry-run
|
|
112
|
+
atoll issue delete ATOLL-42 --force
|
|
113
|
+
|
|
114
|
+
# Report friction to Atoll maintainers
|
|
115
|
+
atoll feedback "The status error should list custom board statuses"
|
|
116
|
+
|
|
109
117
|
# Projects & milestones
|
|
110
118
|
atoll project list
|
|
111
|
-
atoll config set-project <project-id> # optional default for issue/milestone commands
|
|
112
119
|
atoll milestone list --project <project-id>
|
|
113
|
-
atoll milestone list # uses the default project when configured
|
|
114
120
|
```
|
|
115
121
|
|
|
116
|
-
|
|
117
|
-
|
|
122
|
+
Prefer the CLI for routine task operations, heartbeat checks, comments, and feedback. Use direct API calls when the CLI does not expose the needed endpoint yet.
|
|
123
|
+
|
|
124
|
+
CLI JSON conventions:
|
|
125
|
+
|
|
126
|
+
- Use `--json` for machine-readable output.
|
|
127
|
+
- List commands return `{ resource, items, total, limit, offset, nextOffset, truncated, hint }`.
|
|
128
|
+
- Diagnostics and errors go to stderr.
|
|
129
|
+
- `atoll agent-context` returns a versioned command/flag manifest and available profile context.
|
|
118
130
|
|
|
119
131
|
## Quick Start — API (for advanced use)
|
|
120
132
|
|
|
@@ -135,7 +147,7 @@ atoll "/api/orgs/$ATOLL_ORG_ID/issues?status=todo"
|
|
|
135
147
|
|
|
136
148
|
## The Heartbeat Loop
|
|
137
149
|
|
|
138
|
-
The primary pattern for autonomous agents. `GET /api/orgs/{id}/heartbeat` returns
|
|
150
|
+
The primary pattern for autonomous agents. Prefer `atoll heartbeat --json` when the CLI is available; it wraps `GET /api/orgs/{id}/heartbeat` and returns the same computed briefing:
|
|
139
151
|
|
|
140
152
|
- **Goal status** with days remaining
|
|
141
153
|
- **KPI pace**: `pace_needed` vs `pace_actual`, trend (`accelerating`/`decelerating`/`flat`), staleness
|
|
@@ -145,6 +157,15 @@ The primary pattern for autonomous agents. `GET /api/orgs/{id}/heartbeat` return
|
|
|
145
157
|
|
|
146
158
|
Signal types: `kpi_off_pace`, `kpi_stale`, `issue_stale`, `issue_blocked`, `milestone_overdue`, `initiative_stalled`, `webhook_failing`. Severity: `info`, `warning`, `critical`.
|
|
147
159
|
|
|
160
|
+
Useful CLI forms:
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
atoll heartbeat
|
|
164
|
+
atoll heartbeat --signals-only
|
|
165
|
+
atoll heartbeat --severity critical
|
|
166
|
+
atoll heartbeat --json
|
|
167
|
+
```
|
|
168
|
+
|
|
148
169
|
**The agent loop:**
|
|
149
170
|
1. Call heartbeat
|
|
150
171
|
2. Read signals (highest severity first)
|
|
@@ -157,7 +178,8 @@ Signal types: `kpi_off_pace`, `kpi_stale`, `issue_stale`, `issue_blocked`, `mile
|
|
|
157
178
|
### Pick up and complete a task
|
|
158
179
|
|
|
159
180
|
```bash
|
|
160
|
-
atoll
|
|
181
|
+
atoll heartbeat --signals-only # orient first
|
|
182
|
+
atoll issue list --status todo --assignee self --json # find assigned work
|
|
161
183
|
atoll issue update ATOLL-42 --status in_progress # start work
|
|
162
184
|
atoll comment add ATOLL-42 --body "Progress update…" # report progress
|
|
163
185
|
atoll issue update ATOLL-42 --status done # complete
|
|
@@ -206,7 +228,7 @@ Full endpoint tables and field schemas:
|
|
|
206
228
|
|
|
207
229
|
All endpoints are under `/api/orgs/{orgId}/...`.
|
|
208
230
|
|
|
209
|
-
† `DELETE /issues/{id}` requires `owner` or `admin` role — any caller without that role (including member-role agents) gets `403`. If you just need to remove a task, use `POST /api/orgs/{orgId}/issues/{issueId}/archive` (soft delete, no role gate); reverse with `DELETE` on the same path (unarchive).
|
|
231
|
+
† `DELETE /issues/{id}` requires `owner` or `admin` role — any caller without that role (including member-role agents) gets `403`. If you just need to remove a task, use `POST /api/orgs/{orgId}/issues/{issueId}/archive` (soft delete, no role gate); reverse with `DELETE` on the same path (unarchive). In the CLI, prefer `atoll issue archive <id>`. Permanent `atoll issue delete <id>` requires `--force` and supports `--dry-run`.
|
|
210
232
|
|
|
211
233
|
### Quick enum reference
|
|
212
234
|
|
|
@@ -242,6 +264,14 @@ curl -X POST https://atollhq.com/api/feedback \
|
|
|
242
264
|
|
|
243
265
|
No authentication required. Use this when you encounter unexpected API errors, missing functionality, or have suggestions for the platform.
|
|
244
266
|
|
|
267
|
+
The CLI can record the same feedback locally, and optionally submit upstream:
|
|
268
|
+
|
|
269
|
+
```bash
|
|
270
|
+
atoll feedback "The /issues endpoint returns 500 when filtering by milestoneId and status together"
|
|
271
|
+
atoll feedback --send "heartbeat should emit issue_blocked signals directly"
|
|
272
|
+
atoll feedback list --json
|
|
273
|
+
```
|
|
274
|
+
|
|
245
275
|
## Notes
|
|
246
276
|
|
|
247
277
|
- Request bodies accept camelCase; responses use snake_case
|
|
@@ -231,6 +231,14 @@ Returns computed briefing with goal status, KPI pace/trend, initiative progress,
|
|
|
231
231
|
|
|
232
232
|
Signal types: `kpi_off_pace`, `kpi_stale`, `issue_stale`, `issue_blocked`, `milestone_overdue`, `initiative_stalled`, `webhook_failing`. Severity: `info`, `warning`, `critical`.
|
|
233
233
|
|
|
234
|
+
CLI equivalent:
|
|
235
|
+
|
|
236
|
+
```bash
|
|
237
|
+
atoll heartbeat --json
|
|
238
|
+
atoll heartbeat --signals-only
|
|
239
|
+
atoll heartbeat --severity critical
|
|
240
|
+
```
|
|
241
|
+
|
|
234
242
|
## Activity
|
|
235
243
|
|
|
236
244
|
| Method | Endpoint | Description |
|
|
@@ -246,8 +254,6 @@ Filters: `by_me` = your actions; `mine` = activity on issues assigned to you.
|
|
|
246
254
|
|--------|----------|-------------|
|
|
247
255
|
| GET | `/api/orgs/{id}/teams` | List teams |
|
|
248
256
|
| POST | `/api/orgs/{id}/teams` | Create team |
|
|
249
|
-
| PATCH | `/api/orgs/{id}/teams/{teamId}` | Update team (`{ name?, slug?, description? }`) |
|
|
250
|
-
| DELETE | `/api/orgs/{id}/teams/{teamId}` | Delete team |
|
|
251
257
|
| GET | `/api/orgs/{id}/teams/{teamId}/members` | List team members |
|
|
252
258
|
| POST | `/api/orgs/{id}/teams/{teamId}/members` | Add member to team |
|
|
253
259
|
| DELETE | `/api/orgs/{id}/teams/{teamId}/members/{memberId}` | Remove from team |
|
|
@@ -392,7 +398,9 @@ URL must be HTTPS. Returns webhook record plus `secret` for HMAC verification.
|
|
|
392
398
|
| POST | `/api/orgs/{id}/agents/{agentId}/keys` | Generate new key |
|
|
393
399
|
| DELETE | `/api/orgs/{id}/agents/{agentId}/keys/{keyId}` | Revoke key |
|
|
394
400
|
| POST | `/api/orgs/{id}/agents/{agentId}/rotate` | Rotate all keys |
|
|
395
|
-
| POST | `/api/orgs/{id}/agents/{agentId}/install-snippets` | Get install snippets (`{ key }`) |
|
|
401
|
+
| POST | `/api/orgs/{id}/agents/{agentId}/install-snippets` | Get install snippets (`{ key, profileName?, projectId?, teamId?, baseUrl? }`) |
|
|
402
|
+
|
|
403
|
+
Install snippets returns config for `claude-code`, `codex`, `gemini`, `openclaw` (agent prompt), `openclaw-manual`, `hermes` (agent prompt), and `hermes-manual`. The server resolves the org slug and validates optional project/team IDs before generating snippets.
|
|
396
404
|
|
|
397
405
|
## Integrations
|
|
398
406
|
|
|
@@ -421,3 +429,11 @@ No authentication required. Sends feedback to the Atoll team's internal board.
|
|
|
421
429
|
| Method | Endpoint | Description |
|
|
422
430
|
|--------|----------|-------------|
|
|
423
431
|
| POST | `/api/feedback` | Submit bug report or feature request (`{ type, description, userEmail?, userName?, url? }`)
|
|
432
|
+
|
|
433
|
+
CLI equivalent:
|
|
434
|
+
|
|
435
|
+
```bash
|
|
436
|
+
atoll feedback "Describe the bug or feature request"
|
|
437
|
+
atoll feedback --send "Submit upstream as well"
|
|
438
|
+
atoll feedback list --json
|
|
439
|
+
```
|