@rlarua/agentteams-cli 0.0.9 → 0.0.11

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 (118) hide show
  1. package/API-CLI-WORKFLOW.md +418 -0
  2. package/LICENSE +201 -0
  3. package/README.md +220 -128
  4. package/dist/api/comment.d.ts +11 -0
  5. package/dist/api/comment.d.ts.map +1 -0
  6. package/dist/api/comment.js +33 -0
  7. package/dist/api/comment.js.map +1 -0
  8. package/dist/api/plan.d.ts +13 -0
  9. package/dist/api/plan.d.ts.map +1 -0
  10. package/dist/api/plan.js +43 -0
  11. package/dist/api/plan.js.map +1 -0
  12. package/dist/api/postmortem.d.ts +6 -0
  13. package/dist/api/postmortem.d.ts.map +1 -0
  14. package/dist/api/postmortem.js +33 -0
  15. package/dist/api/postmortem.js.map +1 -0
  16. package/dist/api/report.d.ts +6 -0
  17. package/dist/api/report.d.ts.map +1 -0
  18. package/dist/api/report.js +33 -0
  19. package/dist/api/report.js.map +1 -0
  20. package/dist/api/status.d.ts +12 -0
  21. package/dist/api/status.d.ts.map +1 -0
  22. package/dist/api/status.js +33 -0
  23. package/dist/api/status.js.map +1 -0
  24. package/dist/commands/agentConfig.d.ts.map +1 -1
  25. package/dist/commands/agentConfig.js +10 -3
  26. package/dist/commands/agentConfig.js.map +1 -1
  27. package/dist/commands/agentConfigCommand.d.ts +2 -0
  28. package/dist/commands/agentConfigCommand.d.ts.map +1 -0
  29. package/dist/commands/agentConfigCommand.js +20 -0
  30. package/dist/commands/agentConfigCommand.js.map +1 -0
  31. package/dist/commands/comment.d.ts +2 -0
  32. package/dist/commands/comment.d.ts.map +1 -0
  33. package/dist/commands/comment.js +55 -0
  34. package/dist/commands/comment.js.map +1 -0
  35. package/dist/commands/config.d.ts +2 -0
  36. package/dist/commands/config.d.ts.map +1 -0
  37. package/dist/commands/config.js +30 -0
  38. package/dist/commands/config.js.map +1 -0
  39. package/dist/commands/convention.d.ts +25 -0
  40. package/dist/commands/convention.d.ts.map +1 -1
  41. package/dist/commands/convention.js +492 -43
  42. package/dist/commands/convention.js.map +1 -1
  43. package/dist/commands/conventionRouter.d.ts +3 -0
  44. package/dist/commands/conventionRouter.d.ts.map +1 -0
  45. package/dist/commands/conventionRouter.js +46 -0
  46. package/dist/commands/conventionRouter.js.map +1 -0
  47. package/dist/commands/dependency.d.ts.map +1 -1
  48. package/dist/commands/dependency.js +2 -1
  49. package/dist/commands/dependency.js.map +1 -1
  50. package/dist/commands/dependencyCommand.d.ts +2 -0
  51. package/dist/commands/dependencyCommand.d.ts.map +1 -0
  52. package/dist/commands/dependencyCommand.js +27 -0
  53. package/dist/commands/dependencyCommand.js.map +1 -0
  54. package/dist/commands/index.d.ts.map +1 -1
  55. package/dist/commands/index.js +13 -485
  56. package/dist/commands/index.js.map +1 -1
  57. package/dist/commands/init.d.ts.map +1 -1
  58. package/dist/commands/init.js +3 -2
  59. package/dist/commands/init.js.map +1 -1
  60. package/dist/commands/plan.d.ts +11 -0
  61. package/dist/commands/plan.d.ts.map +1 -0
  62. package/dist/commands/plan.js +370 -0
  63. package/dist/commands/plan.js.map +1 -0
  64. package/dist/commands/postmortem.d.ts +2 -0
  65. package/dist/commands/postmortem.d.ts.map +1 -0
  66. package/dist/commands/postmortem.js +114 -0
  67. package/dist/commands/postmortem.js.map +1 -0
  68. package/dist/commands/report.d.ts +2 -0
  69. package/dist/commands/report.d.ts.map +1 -0
  70. package/dist/commands/report.js +221 -0
  71. package/dist/commands/report.js.map +1 -0
  72. package/dist/commands/status.d.ts +2 -0
  73. package/dist/commands/status.d.ts.map +1 -0
  74. package/dist/commands/status.js +60 -0
  75. package/dist/commands/status.js.map +1 -0
  76. package/dist/index.js +214 -34
  77. package/dist/index.js.map +1 -1
  78. package/dist/types/index.d.ts +11 -6
  79. package/dist/types/index.d.ts.map +1 -1
  80. package/dist/utils/errors.d.ts.map +1 -1
  81. package/dist/utils/errors.js +60 -6
  82. package/dist/utils/errors.js.map +1 -1
  83. package/dist/utils/formatter.js +11 -1
  84. package/dist/utils/formatter.js.map +1 -1
  85. package/dist/utils/git.d.ts +19 -0
  86. package/dist/utils/git.d.ts.map +1 -0
  87. package/dist/utils/git.js +41 -0
  88. package/dist/utils/git.js.map +1 -0
  89. package/dist/utils/httpHeaders.d.ts +3 -0
  90. package/dist/utils/httpHeaders.d.ts.map +1 -0
  91. package/dist/utils/httpHeaders.js +11 -0
  92. package/dist/utils/httpHeaders.js.map +1 -0
  93. package/dist/utils/initOutput.d.ts +3 -0
  94. package/dist/utils/initOutput.d.ts.map +1 -0
  95. package/dist/utils/initOutput.js +34 -0
  96. package/dist/utils/initOutput.js.map +1 -0
  97. package/dist/utils/legacyCompat.d.ts +3 -0
  98. package/dist/utils/legacyCompat.d.ts.map +1 -0
  99. package/dist/utils/legacyCompat.js +20 -0
  100. package/dist/utils/legacyCompat.js.map +1 -0
  101. package/dist/utils/outputPolicy.d.ts +12 -0
  102. package/dist/utils/outputPolicy.d.ts.map +1 -0
  103. package/dist/utils/outputPolicy.js +132 -0
  104. package/dist/utils/outputPolicy.js.map +1 -0
  105. package/dist/utils/parsers.d.ts +7 -0
  106. package/dist/utils/parsers.d.ts.map +1 -0
  107. package/dist/utils/parsers.js +52 -0
  108. package/dist/utils/parsers.js.map +1 -0
  109. package/dist/utils/planFormat.d.ts +17 -0
  110. package/dist/utils/planFormat.d.ts.map +1 -0
  111. package/dist/utils/planFormat.js +80 -0
  112. package/dist/utils/planFormat.js.map +1 -0
  113. package/dist/utils/spinner.d.ts +6 -0
  114. package/dist/utils/spinner.d.ts.map +1 -0
  115. package/dist/utils/spinner.js +34 -0
  116. package/dist/utils/spinner.js.map +1 -0
  117. package/package.json +8 -3
  118. package/DEVELOPMENT.md +0 -234
package/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # @rlarua/agentteams-cli
2
2
 
3
- Command-line interface for managing AI agent teams. Configure agents, sync conventions, track tasks, and report status from your terminal.
3
+ A CLI for working with the AgentTeams API from your terminal.
4
+ It supports convention sync, status reporting, and plan/comment/report management.
4
5
 
5
6
  ## Installation
6
7
 
@@ -8,7 +9,7 @@ Command-line interface for managing AI agent teams. Configure agents, sync conve
8
9
  npm install -g @rlarua/agentteams-cli
9
10
  ```
10
11
 
11
- Or use with npx:
12
+ Or run with `npx`:
12
13
 
13
14
  ```bash
14
15
  npx @rlarua/agentteams-cli init
@@ -22,247 +23,319 @@ npx @rlarua/agentteams-cli init
22
23
  agentteams init
23
24
  ```
24
25
 
25
- This command:
26
- - Opens your browser for OAuth authentication
27
- - Creates `.agentteams/config.json` with credentials
28
- - Downloads convention index to `.agentteams/convention.md`
29
- - Runs sync to download category conventions into `.agentteams/<category>/*.md`
30
- - Detects your AI environment (Claude Code, opencode, codex)
26
+ The `init` command:
31
27
 
32
- You can run `agentteams sync` later to refresh them again.
28
+ - Opens a browser for OAuth authentication
29
+ - Creates `.agentteams/config.json`
30
+ - Saves the convention template to `.agentteams/convention.md`
31
+ - Syncs convention files into `.agentteams/<category>/*.md`
33
32
 
34
- **What gets created:**
33
+ In SSH/remote environments, open the URL printed in the terminal manually.
35
34
 
35
+ ### Service URLs (Defaults and Overrides)
36
+
37
+ The CLI talks to two services:
38
+
39
+ - Web app (OAuth flow): defaults to `https://agent-web.justin-mk.me`
40
+ - API: no hardcoded default; it is read from `.agentteams/config.json` (created by `init`) or overridden via `AGENTTEAMS_API_URL` (commonly `https://agent-api.justin-mk.me`)
41
+
42
+ Typical usage:
43
+
44
+ - Production: run `agentteams init` and do not set any URL overrides.
45
+ - If you need to point the CLI to a different environment, override URLs with environment variables.
46
+
47
+ Override examples (production):
48
+
49
+ ```bash
50
+ export AGENTTEAMS_API_URL="https://agent-api.justin-mk.me"
36
51
  ```
37
- your-project/
38
- ├── .agentteams/
39
- │ ├── config.json # API credentials
40
- │ └── convention.md # Convention index template
52
+
53
+ Override examples (advanced):
54
+
55
+ ```bash
56
+ # Override the web app used by `agentteams init` (OAuth authorize page)
57
+ export AGENTTEAMS_WEB_URL="https://your-agentteams-web.example.com"
58
+
59
+ # Override the API base URL used by all API calls
60
+ export AGENTTEAMS_API_URL="https://your-agentteams-api.example.com"
41
61
  ```
42
62
 
43
- ### 2. Add to .gitignore
63
+ ### 2. Protect Sensitive Data
44
64
 
45
- Protect your API keys by adding this to `.gitignore`:
65
+ `.agentteams` may contain API keys, so do not commit it to git.
46
66
 
47
67
  ```gitignore
48
68
  # AgentTeams CLI config (contains API keys)
49
69
  .agentteams
50
70
  ```
51
71
 
52
- ### 3. Use conventions
53
-
54
- After initialization, conventions are available to your AI agent. The CLI provides setup instructions based on your environment.
72
+ ### 3. Use Conventions
55
73
 
56
74
  ```bash
57
- # List conventions
58
75
  agentteams convention list
59
-
60
- # Show full conventions
61
76
  agentteams convention show
62
-
63
- # Download all conventions from server
64
77
  agentteams convention download
78
+ agentteams convention create --file .agentteams/rules/new-rule.md
79
+ agentteams convention update --file .agentteams/rules/context.md
80
+ agentteams convention update --file .agentteams/rules/context.md --apply
81
+ agentteams convention delete --file .agentteams/rules/context.md
82
+ agentteams convention delete --file .agentteams/rules/context.md --apply
65
83
  ```
66
84
 
67
- ## Commands
85
+ ## Core Commands
68
86
 
69
87
  ### `init`
70
88
 
71
- Initialize with OAuth authentication.
89
+ Initialize the CLI via OAuth and download conventions.
72
90
 
73
91
  ```bash
74
92
  agentteams init
75
93
  ```
76
94
 
77
- Opens browser for authentication, saves config, and downloads conventions. For SSH/remote environments, manually copy the displayed URL if the browser doesn't open automatically.
78
-
79
95
  ### `convention`
80
96
 
81
97
  Manage project conventions.
82
98
 
83
99
  ```bash
84
- # List conventions
85
100
  agentteams convention list
86
-
87
- # Show all convention markdown in terminal
88
101
  agentteams convention show
89
-
90
- # Download all conventions and save dev files
91
102
  agentteams convention download
103
+ agentteams convention create --file .agentteams/rules/new-rule.md
104
+ agentteams convention update --file .agentteams/rules/context.md
105
+ agentteams convention update --file .agentteams/rules/context.md --apply
106
+ agentteams convention delete --file .agentteams/rules/context.md
107
+ agentteams convention delete --file .agentteams/rules/context.md --apply
92
108
  ```
93
109
 
94
- `convention download` saves files by category directory (for example: `.agentteams/rules/<name>.md`).
95
- If duplicate names exist in the same category, numeric suffixes are added (for example: `rules.md`, `rules-2.md`).
96
- Before saving, the CLI cleans up existing files in each target category directory.
110
+ `convention download` saves files by category in `.agentteams/<category>/`.
111
+ If file names collide within the same category, suffixes like `-2`, `-3` are added.
97
112
 
98
- ### `sync`
113
+ #### `convention create`
114
+
115
+ Create a new convention.
99
116
 
100
- Sync local convention files from API.
117
+ - The input file must be under `.agentteams/<category>/*.md`, and `<category>` is inferred from the path.
118
+ - Frontmatter is optional. Supported fields: `trigger`, `description`, `agentInstruction`, `title` (optional).
119
+ - After creation, the CLI immediately updates `.agentteams/conventions.manifest.json`, so you can `update/delete` the same file right away.
120
+ - Run `agentteams convention download` if you want to refresh `convention.md` and the server-normalized (downloadable) markdown.
121
+
122
+ Examples:
101
123
 
102
124
  ```bash
103
- # Download conventions by category into .agentteams/<category>/*.md
104
- agentteams sync
125
+ agentteams convention create --file .agentteams/rules/new-rule.md
105
126
  ```
106
127
 
107
- `sync` also refreshes `.agentteams/convention.md` template.
128
+ #### `convention update` / `convention delete`
108
129
 
109
- ### `agent-config`
130
+ - By default, `update` and `delete` run in **dry-run** mode. They print a diff/plan and do not modify the server.
131
+ - Use `--apply` to actually update/delete the server resource.
132
+ - Only files produced by `agentteams convention download` are allowed. The CLI uses `.agentteams/conventions.manifest.json` to map local files to server conventions.
110
133
 
111
- Manage agent configurations.
134
+ Examples:
112
135
 
113
136
  ```bash
114
- # List all configs
115
- agentteams agent-config list
116
- agentteams agent-config list --format text
137
+ # Preview changes (dry-run)
138
+ agentteams convention update --file .agentteams/rules/context.md
117
139
 
118
- # Get specific config
119
- agentteams agent-config get --id <config-id>
140
+ # Apply update to server
141
+ agentteams convention update --file .agentteams/rules/context.md --apply
120
142
 
121
- # Delete config
122
- agentteams agent-config delete --id <config-id>
143
+ # Preview deletion (dry-run)
144
+ agentteams convention delete --file .agentteams/rules/context.md
145
+
146
+ # Apply deletion to server
147
+ agentteams convention delete --file .agentteams/rules/context.md --apply
148
+ ```
149
+
150
+ Common errors:
151
+
152
+ - `403 Forbidden`: the server rejected the operation due to missing write permissions.
153
+ - `409 Conflict`: optimistic-lock conflict (someone else updated the convention). Download again and retry.
154
+
155
+ ### `sync`
156
+
157
+ Resync convention files.
158
+
159
+ ```bash
160
+ agentteams sync
123
161
  ```
124
162
 
125
163
  ### `status`
126
164
 
127
- Manage agent status reports.
165
+ Manage agent statuses.
128
166
 
129
167
  ```bash
130
- # Report status
131
168
  agentteams status report \
132
169
  --agent "my-agent" \
133
170
  --status "IN_PROGRESS" \
134
- --task "작업 " \
171
+ --task "Working on task" \
135
172
  --issues "" \
136
173
  --remaining "next step"
137
174
 
138
- # List statuses
139
175
  agentteams status list
140
-
141
- # Get specific status
142
176
  agentteams status get --id <status-id>
143
-
144
- # Update status
145
177
  agentteams status update --id <status-id> --status "DONE"
146
-
147
- # Delete status
148
178
  agentteams status delete --id <status-id>
149
179
  ```
150
180
 
151
- **Status values:** `IN_PROGRESS`, `DONE`, `BLOCKED`
181
+ Note: `--agent` is optional, but your server may require it depending on your setup.
152
182
 
153
- `--issues`, `--remaining` are comma-separated strings.
154
- Examples:
155
- - `--issues "api timeout,auth failure"`
156
- - `--remaining "add tests,write docs"`
157
- - empty list: `--issues ""`
183
+ Status values: `IN_PROGRESS`, `DONE`, `BLOCKED`
158
184
 
159
185
  ### `plan`
160
186
 
161
187
  Manage plans.
162
188
 
189
+ Note: Plans are always created as `DRAFT`. Even if you pass `--status` to `plan create`, the server will ignore it. Use `plan update` to change status after creation.
190
+
163
191
  ```bash
164
- # List plans
165
192
  agentteams plan list
193
+ agentteams plan get --id <plan-id>
194
+ agentteams plan get --id <plan-id> --include-deps --format text
195
+ agentteams plan show --id <plan-id> # alias of get
196
+
197
+ agentteams plan create \
198
+ --title "Implement feature" \
199
+ --content "Detailed content" \
200
+ --priority "HIGH"
201
+
202
+ # optional checklist template for create
203
+ agentteams plan create \
204
+ --title "Refactor module" \
205
+ --template "refactor-minimal"
206
+
207
+ agentteams plan update --id <plan-id> --status "PENDING"
208
+ agentteams plan update --id <plan-id> --status "IN_PROGRESS"
209
+ agentteams plan assign --id <plan-id> --agent "agent-name"
210
+ agentteams plan download --id <plan-id>
211
+ agentteams plan cleanup --id <plan-id>
212
+ agentteams plan delete --id <plan-id>
213
+ ```
166
214
 
167
- # Get plan
168
- agentteams plan get --id 1
169
-
170
- # Create plan
171
- agentteams plan create \
172
- --title "Implement feature X" \
173
- --content "Details here" \
174
- --status "PENDING" \
175
- --priority "HIGH"
176
-
177
- # Update plan
178
- agentteams plan update --id 1 --status "IN_PROGRESS"
215
+ Status values: `DRAFT`, `PENDING`, `ASSIGNED`, `IN_PROGRESS`, `BLOCKED`, `DONE`, `CANCELLED`
179
216
 
180
- # Assign plan
181
- agentteams plan assign --id 1 --agent "agent-name"
217
+ Priorities: `LOW`, `MEDIUM`, `HIGH`
182
218
 
183
- # Delete plan
184
- agentteams plan delete --id 1
185
- ```
219
+ Plan template values (create): `refactor-minimal`
186
220
 
187
- **Plan statuses:** `DRAFT`, `PENDING`, `IN_PROGRESS`, `DONE`, `CANCELLED`
188
- **Priorities:** `LOW`, `MEDIUM`, `HIGH`
221
+ `--include-deps` (get/show): also fetches dependency data and appends a `Dependencies` section in text output; in json output it adds `data.dependencies` with `blocking` and `dependents` arrays.
189
222
 
190
223
  ### `comment`
191
224
 
192
225
  Manage plan comments.
193
226
 
194
227
  ```bash
228
+ agentteams comment list --plan-id <plan-id>
229
+
195
230
  agentteams comment create \
196
231
  --plan-id <plan-id> \
197
232
  --type GENERAL \
198
- --content "Great work!"
233
+ --content "Work completed"
199
234
 
200
- # Types: RISK, MODIFICATION, GENERAL
235
+ agentteams comment update --id <comment-id> --content "Updated content"
236
+ agentteams comment delete --id <comment-id>
201
237
  ```
202
238
 
239
+ Types: `RISK`, `MODIFICATION`, `GENERAL`
240
+
203
241
  ### `dependency`
204
242
 
205
243
  Manage plan dependencies.
206
244
 
207
245
  ```bash
208
- # List dependencies for a plan
209
246
  agentteams dependency list --plan-id <plan-id>
210
-
211
- # Add dependency
212
247
  agentteams dependency create --plan-id <plan-id> --blocking-plan-id <blocking-plan-id>
213
-
214
- # Delete dependency
215
248
  agentteams dependency delete --plan-id <plan-id> --dep-id <dependency-id>
216
249
  ```
217
250
 
251
+ ### `agent-config`
252
+
253
+ View or delete agent configurations.
254
+
255
+ ```bash
256
+ agentteams agent-config list
257
+ agentteams agent-config get --id <config-id>
258
+ agentteams agent-config delete --id <config-id>
259
+ ```
260
+
218
261
  ### `report`
219
262
 
220
- Create completion reports (stored as Markdown).
263
+ Manage completion reports.
264
+
265
+ Tip: Include reproducible verification evidence (commands + outcomes), but keep outcomes short: `pass/fail + 1–3 lines of summary`. Do not paste long raw logs into the report body.
221
266
 
222
267
  ```bash
223
- # Create from inline markdown
268
+ agentteams report list
269
+
224
270
  agentteams report create \
225
- --title "AgentBoard MVP 구현" \
271
+ --title "AgentTeams completion report" \
226
272
  --content "## TL;DR\n- done" \
227
273
  --report-type IMPL_PLAN \
228
274
  --status COMPLETED
275
+
276
+ # with metrics (auto + manual)
277
+ agentteams report create \
278
+ --title "CLI metrics report" \
279
+ --content "## Summary\n- done" \
280
+ --files-modified 5 \
281
+ --lines-added 120 \
282
+ --lines-deleted 30 \
283
+ --quality-score 95
284
+
285
+ # disable git auto collection
286
+ agentteams report create \
287
+ --title "Manual metrics report" \
288
+ --content "## Summary\n- done" \
289
+ --no-git
229
290
  ```
230
291
 
292
+ Report types: `IMPL_PLAN`, `COMMIT_RANGE`, `TASK_COMPLETION`
293
+
294
+ Status values: `COMPLETED`, `FAILED`, `PARTIAL`
295
+
296
+ Metrics behavior:
297
+
298
+ - Auto-collected on `report create` (unless `--no-git`): `commitHash`, `branchName`, `filesModified`, `linesAdded`, `linesDeleted`
299
+ - Manual only: `durationSeconds`, `commitStart`, `commitEnd`, `pullRequestId`
300
+ - Manual options always override auto-collected values
301
+
231
302
  ### `postmortem`
232
303
 
233
- Create post mortems (content supports Markdown).
304
+ Manage post mortems.
305
+
306
+ Tip: If you have platform guides downloaded under `.agentteams/platform/guides/`, prefer the template in `post-mortem-guide.md`.
234
307
 
235
308
  ```bash
309
+ agentteams postmortem list
310
+
236
311
  agentteams postmortem create \
237
- --title "배포 장애 사후분석" \
238
- --content "## 원인\n- 설정 누락" \
239
- --action-items "롤백 자동화,사전 점검 체크리스트" \
312
+ --title "Deployment incident analysis" \
313
+ --content "## Root cause\n- Missing configuration" \
314
+ --action-items "Automate rollback,Pre-release checklist" \
240
315
  --status RESOLVED
241
316
  ```
242
317
 
243
- ### `config`
318
+ Status values: `OPEN`, `IN_PROGRESS`, `RESOLVED`
244
319
 
245
- View current configuration.
320
+ ### `config`
246
321
 
247
322
  ```bash
248
323
  agentteams config whoami
249
324
  agentteams config whoami --format text
250
325
  ```
251
326
 
252
- ## Configuration
327
+ `config whoami` prints current environment variable values for `AGENTTEAMS_API_KEY` and `AGENTTEAMS_API_URL`.
253
328
 
254
- ### Priority Order
329
+ ## Configuration
255
330
 
256
- Configuration is merged from multiple sources (highest to lowest priority):
331
+ Configuration is merged in this priority order (highest first):
257
332
 
258
- 1. CLI options (command-line arguments)
333
+ 1. CLI options
259
334
  2. Environment variables (`AGENTTEAMS_*`)
260
335
  3. Project config (`.agentteams/config.json`)
261
336
  4. Global config (`~/.agentteams/config.json`)
262
337
 
263
- ### Config File
264
-
265
- `.agentteams/config.json`:
338
+ ### Config File Example
266
339
 
267
340
  ```json
268
341
  {
@@ -274,7 +347,7 @@ Configuration is merged from multiple sources (highest to lowest priority):
274
347
  }
275
348
  ```
276
349
 
277
- ### Environment Variables
350
+ ### Environment Variable Example
278
351
 
279
352
  ```bash
280
353
  export AGENTTEAMS_API_KEY="key_your_api_key_here"
@@ -284,36 +357,55 @@ export AGENTTEAMS_PROJECT_ID="proj_xxx"
284
357
  export AGENTTEAMS_AGENT_NAME="my-agent"
285
358
  ```
286
359
 
287
- Useful for CI/CD pipelines and temporary overrides.
360
+ ## Output Format
288
361
 
289
- ## Output Formats
362
+ Most resource commands support `--format json|text`.
290
363
 
291
- All commands support `--format` option:
364
+ Output behavior by default:
365
+
366
+ - `plan create|update|start|finish`: prints short summary lines on stdout by default.
367
+ - `plan list|get` and other read-oriented commands: keep full output by default.
368
+ - `--verbose`: always prints full output to stdout.
369
+ - `--output-file <path>`: always writes full output to file and keeps stdout short.
370
+
371
+ Compatibility note:
372
+
373
+ - If you need full JSON on stdout for automation, pass `--format json` explicitly.
292
374
 
293
375
  ```bash
294
- # JSON (default, machine-readable)
295
376
  agentteams plan list --format json
296
-
297
- # Text (human-friendly tables)
298
377
  agentteams plan list --format text
378
+ agentteams plan update --id <plan-id> --status IN_PROGRESS --format json
299
379
  ```
300
380
 
301
- ## Error Handling
381
+ Note: `convention` does not support `--format`.
382
+
383
+ ## Error Guide
302
384
 
303
- | Error | Meaning | Solution |
304
- |-------|---------|----------|
305
- | **401 Unauthorized** | Invalid API key | Check `apiKey` in config or `AGENTTEAMS_API_KEY` |
306
- | **403 Forbidden** | Cross-project access denied | Verify `projectId` matches resource |
307
- | **404 Not Found** | Resource doesn't exist | Check ID or create resource first |
308
- | **Network errors** | Can't connect to server | Verify `apiUrl` and server status |
309
- | **Config not found** | No config file or env vars | Run `agentteams init` first |
385
+ The API may include an optional machine-readable `errorCode` in error responses:
310
386
 
311
- ## Development
387
+ ```json
388
+ {
389
+ "statusCode": 403,
390
+ "error": "Forbidden",
391
+ "message": "Cross-project access denied",
392
+ "errorCode": "CROSS_PROJECT_ACCESS_DENIED"
393
+ }
394
+ ```
312
395
 
313
- For contributors and developers who want to work on the CLI:
396
+ The CLI prioritizes `errorCode` when present and falls back to message/status-based handling for older API responses.
314
397
 
315
- **See [DEVELOPMENT.md](https://github.com/rlarua/AgentTeams/blob/main/cli/DEVELOPMENT.md)** for detailed development setup, testing, and contribution guidelines.
398
+ | Error | Meaning | Resolution |
399
+ |---|---|---|
400
+ | `401 Unauthorized` | Invalid API key | Check `apiKey` or `AGENTTEAMS_API_KEY` |
401
+ | `403 Forbidden` | No access to project | Verify `projectId` |
402
+ | `404 Not Found` | Resource does not exist | Verify ID or create the resource |
403
+ | Network error | Cannot reach server | Check `apiUrl` and server status |
404
+ | Missing config | Config file/env vars not found | Run `agentteams init` |
316
405
 
317
406
  ## License
318
407
 
319
- MIT
408
+ Apache-2.0
409
+
410
+ This license applies to the CLI code distributed in this package.
411
+ Use of the AgentTeams service/API may require credentials and is governed by separate service terms/policies.
@@ -0,0 +1,11 @@
1
+ export declare function listComments(apiUrl: string, projectId: string, headers: any, planId: string, params?: Record<string, string | number>): Promise<any>;
2
+ export declare function getComment(apiUrl: string, projectId: string, headers: any, commentId: string): Promise<any>;
3
+ export declare function createComment(apiUrl: string, projectId: string, headers: any, planId: string, body: {
4
+ type: string;
5
+ content: string;
6
+ }): Promise<any>;
7
+ export declare function updateComment(apiUrl: string, projectId: string, headers: any, commentId: string, body: {
8
+ content: string;
9
+ }): Promise<any>;
10
+ export declare function deleteComment(apiUrl: string, projectId: string, headers: any, commentId: string): Promise<any>;
11
+ //# sourceMappingURL=comment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment.d.ts","sourceRoot":"","sources":["../../src/api/comment.ts"],"names":[],"mappings":"AAGA,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,GAAG,EACZ,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GACvC,OAAO,CAAC,GAAG,CAAC,CAQd;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,GAAG,EACZ,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,GAAG,CAAC,CAId;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,GAAG,EACZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IACJ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,GACA,OAAO,CAAC,GAAG,CAAC,CAId;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,GAAG,EACZ,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE;IACJ,OAAO,EAAE,MAAM,CAAC;CACjB,GACA,OAAO,CAAC,GAAG,CAAC,CAId;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,GAAG,EACZ,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,GAAG,CAAC,CAMd"}
@@ -0,0 +1,33 @@
1
+ import axios from 'axios';
2
+ import { withoutJsonContentType } from '../utils/httpHeaders.js';
3
+ export async function listComments(apiUrl, projectId, headers, planId, params) {
4
+ const baseUrl = `${apiUrl}/api/projects/${projectId}/plans/${planId}/comments`;
5
+ const requestConfig = params && Object.keys(params).length > 0
6
+ ? { headers, params }
7
+ : { headers };
8
+ const response = await axios.get(baseUrl, requestConfig);
9
+ return response.data;
10
+ }
11
+ export async function getComment(apiUrl, projectId, headers, commentId) {
12
+ const baseUrl = `${apiUrl}/api/projects/${projectId}/comments/${commentId}`;
13
+ const response = await axios.get(baseUrl, { headers });
14
+ return response.data;
15
+ }
16
+ export async function createComment(apiUrl, projectId, headers, planId, body) {
17
+ const baseUrl = `${apiUrl}/api/projects/${projectId}/plans/${planId}/comments`;
18
+ const response = await axios.post(baseUrl, body, { headers });
19
+ return response.data;
20
+ }
21
+ export async function updateComment(apiUrl, projectId, headers, commentId, body) {
22
+ const baseUrl = `${apiUrl}/api/projects/${projectId}/comments/${commentId}`;
23
+ const response = await axios.put(baseUrl, body, { headers });
24
+ return response.data;
25
+ }
26
+ export async function deleteComment(apiUrl, projectId, headers, commentId) {
27
+ const baseUrl = `${apiUrl}/api/projects/${projectId}/comments/${commentId}`;
28
+ const response = await axios.delete(baseUrl, {
29
+ headers: withoutJsonContentType(headers),
30
+ });
31
+ return response.data;
32
+ }
33
+ //# sourceMappingURL=comment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment.js","sourceRoot":"","sources":["../../src/api/comment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAc,EACd,SAAiB,EACjB,OAAY,EACZ,MAAc,EACd,MAAwC;IAExC,MAAM,OAAO,GAAG,GAAG,MAAM,iBAAiB,SAAS,UAAU,MAAM,WAAW,CAAC;IAC/E,MAAM,aAAa,GAAG,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC;QAC5D,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE;QACrB,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;IAEhB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IACzD,OAAO,QAAQ,CAAC,IAAI,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAc,EACd,SAAiB,EACjB,OAAY,EACZ,SAAiB;IAEjB,MAAM,OAAO,GAAG,GAAG,MAAM,iBAAiB,SAAS,aAAa,SAAS,EAAE,CAAC;IAC5E,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IACvD,OAAO,QAAQ,CAAC,IAAI,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAc,EACd,SAAiB,EACjB,OAAY,EACZ,MAAc,EACd,IAGC;IAED,MAAM,OAAO,GAAG,GAAG,MAAM,iBAAiB,SAAS,UAAU,MAAM,WAAW,CAAC;IAC/E,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9D,OAAO,QAAQ,CAAC,IAAI,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAc,EACd,SAAiB,EACjB,OAAY,EACZ,SAAiB,EACjB,IAEC;IAED,MAAM,OAAO,GAAG,GAAG,MAAM,iBAAiB,SAAS,aAAa,SAAS,EAAE,CAAC;IAC5E,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7D,OAAO,QAAQ,CAAC,IAAI,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAc,EACd,SAAiB,EACjB,OAAY,EACZ,SAAiB;IAEjB,MAAM,OAAO,GAAG,GAAG,MAAM,iBAAiB,SAAS,aAAa,SAAS,EAAE,CAAC;IAC5E,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE;QAC3C,OAAO,EAAE,sBAAsB,CAAC,OAAO,CAAC;KACzC,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC,IAAI,CAAC;AACvB,CAAC"}
@@ -0,0 +1,13 @@
1
+ export declare function listPlans(apiUrl: string, projectId: string, headers: any, params?: Record<string, string | number>): Promise<any>;
2
+ export declare function getPlan(apiUrl: string, projectId: string, headers: any, id: string): Promise<any>;
3
+ export declare function getPlanDependencies(apiUrl: string, projectId: string, headers: any, id: string): Promise<any>;
4
+ export declare function createPlan(apiUrl: string, projectId: string, headers: any, body: {
5
+ title: string;
6
+ content: string;
7
+ priority: string;
8
+ status: 'DRAFT';
9
+ }): Promise<any>;
10
+ export declare function updatePlan(apiUrl: string, projectId: string, headers: any, id: string, body: Record<string, unknown>): Promise<any>;
11
+ export declare function assignPlan(apiUrl: string, projectId: string, headers: any, id: string, assignedTo: string): Promise<any>;
12
+ export declare function deletePlan(apiUrl: string, projectId: string, headers: any, id: string): Promise<any>;
13
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/api/plan.ts"],"names":[],"mappings":"AAGA,wBAAsB,SAAS,CAC7B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,GAAG,EACZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GACvC,OAAO,CAAC,GAAG,CAAC,CAQd;AAED,wBAAsB,OAAO,CAC3B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,GAAG,EACZ,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,GAAG,CAAC,CAId;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,GAAG,EACZ,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,GAAG,CAAC,CAId;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,GAAG,EACZ,IAAI,EAAE;IACJ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;CACjB,GACA,OAAO,CAAC,GAAG,CAAC,CAId;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,GAAG,EACZ,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,GAAG,CAAC,CAId;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,GAAG,EACZ,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,GAAG,CAAC,CAId;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,GAAG,EACZ,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,GAAG,CAAC,CAMd"}
@@ -0,0 +1,43 @@
1
+ import axios from 'axios';
2
+ import { withoutJsonContentType } from '../utils/httpHeaders.js';
3
+ export async function listPlans(apiUrl, projectId, headers, params) {
4
+ const baseUrl = `${apiUrl}/api/projects/${projectId}/plans`;
5
+ const requestConfig = params && Object.keys(params).length > 0
6
+ ? { headers, params }
7
+ : { headers };
8
+ const response = await axios.get(baseUrl, requestConfig);
9
+ return response.data;
10
+ }
11
+ export async function getPlan(apiUrl, projectId, headers, id) {
12
+ const baseUrl = `${apiUrl}/api/projects/${projectId}/plans`;
13
+ const response = await axios.get(`${baseUrl}/${id}`, { headers });
14
+ return response.data;
15
+ }
16
+ export async function getPlanDependencies(apiUrl, projectId, headers, id) {
17
+ const baseUrl = `${apiUrl}/api/projects/${projectId}/plans`;
18
+ const response = await axios.get(`${baseUrl}/${id}/dependencies`, { headers });
19
+ return response.data;
20
+ }
21
+ export async function createPlan(apiUrl, projectId, headers, body) {
22
+ const baseUrl = `${apiUrl}/api/projects/${projectId}/plans`;
23
+ const response = await axios.post(baseUrl, body, { headers });
24
+ return response.data;
25
+ }
26
+ export async function updatePlan(apiUrl, projectId, headers, id, body) {
27
+ const baseUrl = `${apiUrl}/api/projects/${projectId}/plans`;
28
+ const response = await axios.put(`${baseUrl}/${id}`, body, { headers });
29
+ return response.data;
30
+ }
31
+ export async function assignPlan(apiUrl, projectId, headers, id, assignedTo) {
32
+ const baseUrl = `${apiUrl}/api/projects/${projectId}/plans`;
33
+ const response = await axios.post(`${baseUrl}/${id}/assign`, { assignedTo }, { headers });
34
+ return response.data;
35
+ }
36
+ export async function deletePlan(apiUrl, projectId, headers, id) {
37
+ const baseUrl = `${apiUrl}/api/projects/${projectId}/plans`;
38
+ const response = await axios.delete(`${baseUrl}/${id}`, {
39
+ headers: withoutJsonContentType(headers),
40
+ });
41
+ return response.data;
42
+ }
43
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/api/plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function listPostMortems(apiUrl: string, projectId: string, headers: any, params?: Record<string, string | number>): Promise<any>;
2
+ export declare function getPostMortem(apiUrl: string, projectId: string, headers: any, id: string): Promise<any>;
3
+ export declare function createPostMortem(apiUrl: string, projectId: string, headers: any, body: Record<string, unknown>): Promise<any>;
4
+ export declare function updatePostMortem(apiUrl: string, projectId: string, headers: any, id: string, body: Record<string, unknown>): Promise<any>;
5
+ export declare function deletePostMortem(apiUrl: string, projectId: string, headers: any, id: string): Promise<any>;
6
+ //# sourceMappingURL=postmortem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postmortem.d.ts","sourceRoot":"","sources":["../../src/api/postmortem.ts"],"names":[],"mappings":"AAGA,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,GAAG,EACZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GACvC,OAAO,CAAC,GAAG,CAAC,CAQd;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,GAAG,EACZ,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,GAAG,CAAC,CAId;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,GAAG,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,GAAG,CAAC,CAId;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,GAAG,EACZ,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,GAAG,CAAC,CAId;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,GAAG,EACZ,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,GAAG,CAAC,CAMd"}