@forloop-cc/forloop-opencode-plugin-planner 2.2.13 → 2.2.15
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/CHANGELOG.md +6 -6
- package/CONTRIBUTING.md +1 -1
- package/docs/CONFIGURATION.md +1 -1
- package/docs/DEVELOPER-VS-USER.md +3 -3
- package/docs/PLANNER-AGENT-IMPROVEMENTS.md +1 -1
- package/docs/PLUGIN-ARCHITECTURE.md +1 -1
- package/docs/QUICKSTART-NON-DEV.md +3 -3
- package/docs/USER-INTERACTION-MODEL.md +5 -5
- package/docs/superpowers/plans/2026-05-03-sprint-isolated-directory-structure.md +2 -2
- package/docs/superpowers/plans/2026-05-29-install-system.md +1 -1
- package/docs/superpowers/specs/2026-06-08-plugin-test-docker-design.md +1 -1
- package/package.json +1 -1
- package/plugins/forloop-plugin.ts +6 -6
- package/plugins/tools/agent-sprint-tools.ts +1 -1
- package/plugins/tools/ai-trigger-tools.ts +5 -5
- package/plugins/tools/sprint-tools.ts +16 -16
package/CHANGELOG.md
CHANGED
|
@@ -10,13 +10,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
10
10
|
### Added - Sprint & Story API Enhancements
|
|
11
11
|
|
|
12
12
|
#### New Sprint Tools
|
|
13
|
-
- **
|
|
13
|
+
- **forloopSpaceSprintCreate** - Create new space with dates and settings
|
|
14
14
|
- Arguments: title, description, startDate, endDate, isPrivate, organizationId
|
|
15
|
-
- Confirmation messages with
|
|
16
|
-
- **
|
|
15
|
+
- Confirmation messages with space details
|
|
16
|
+
- **forloopSpaceSprintUpdate** - Update space details
|
|
17
17
|
- Arguments: sprintId, title, description, startDate, endDate, isPrivate
|
|
18
18
|
- Partial updates supported
|
|
19
|
-
- **
|
|
19
|
+
- **forloopSpaceSprintDelete** - Delete sprint (with confirmation)
|
|
20
20
|
- Arguments: sprintId, confirm (required for safety)
|
|
21
21
|
- Warning message before deletion
|
|
22
22
|
|
|
@@ -155,8 +155,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
155
155
|
#### Core Features
|
|
156
156
|
- `forloopTokenSet` - Set/update ForLoop API token
|
|
157
157
|
- `forloopTokenGet` - Check if API token is configured
|
|
158
|
-
- `
|
|
159
|
-
- `
|
|
158
|
+
- `forloopSpaceSprintGet` - Get space details with stories and files
|
|
159
|
+
- `forloopSpaceSprintList` - List all accessible spaces
|
|
160
160
|
- `forloopStoryCreate` - Create new stories
|
|
161
161
|
- `forloopStoryUpdate` - Update existing stories
|
|
162
162
|
- `forloopStoryDelete` - Delete stories
|
package/CONTRIBUTING.md
CHANGED
|
@@ -137,7 +137,7 @@ Before submitting your PR, ensure:
|
|
|
137
137
|
|
|
138
138
|
Example:
|
|
139
139
|
```typescript
|
|
140
|
-
describe('
|
|
140
|
+
describe('forloopSpaceSprintList', () => {
|
|
141
141
|
it('should list sprints successfully', async () => {
|
|
142
142
|
// Arrange
|
|
143
143
|
mockClient.listSprints.mockResolvedValue([...])
|
package/docs/CONFIGURATION.md
CHANGED
|
@@ -110,7 +110,7 @@ opencode
|
|
|
110
110
|
|
|
111
111
|
```bash
|
|
112
112
|
# Quick test without permanent config
|
|
113
|
-
FORLOOP_API_URL=https://api.dev.forloop.cc opencode run "
|
|
113
|
+
FORLOOP_API_URL=https://api.dev.forloop.cc opencode run "forloopSpaceSprintList"
|
|
114
114
|
```
|
|
115
115
|
|
|
116
116
|
### Production Deployment
|
|
@@ -37,7 +37,7 @@ This document clarifies the difference between **developing** the plugin and **u
|
|
|
37
37
|
│ $ opencode │
|
|
38
38
|
│ ───────────────────────────────────────────────────────── │
|
|
39
39
|
│ │
|
|
40
|
-
│ You:
|
|
40
|
+
│ You: forloopSpaceSprintList │
|
|
41
41
|
│ └─ Lists all sprints │
|
|
42
42
|
│ │
|
|
43
43
|
│ You: forloopStoryCreate │
|
|
@@ -83,7 +83,7 @@ npm run install:local
|
|
|
83
83
|
|
|
84
84
|
# Test in opencode
|
|
85
85
|
opencode
|
|
86
|
-
>
|
|
86
|
+
> forloopSpaceSprintList
|
|
87
87
|
```
|
|
88
88
|
|
|
89
89
|
### Users (Simple Setup)
|
|
@@ -96,7 +96,7 @@ npm install @forloop/opencode-plugin
|
|
|
96
96
|
|
|
97
97
|
# Then just use in opencode
|
|
98
98
|
opencode
|
|
99
|
-
>
|
|
99
|
+
> forloopSpaceSprintList
|
|
100
100
|
```
|
|
101
101
|
|
|
102
102
|
## When Do You Need TypeScript Knowledge?
|
|
@@ -51,7 +51,7 @@ name: ForLoop Planner ← THIS should be passed
|
|
|
51
51
|
```typescript
|
|
52
52
|
1. Check if .forloop/manifest.json exists
|
|
53
53
|
2. If NOT exists or empty:
|
|
54
|
-
- Call
|
|
54
|
+
- Call forloopSpaceSprintList to get sprints
|
|
55
55
|
- Call forloopSyncS3ToLocal to sync latest context
|
|
56
56
|
3. Load context files
|
|
57
57
|
```
|
|
@@ -249,7 +249,7 @@ npm update @forloop/opencode-plugin
|
|
|
249
249
|
|
|
250
250
|
**Stored in:** `~/.cache/opencode/node_modules/@forloop/opencode-plugin/`
|
|
251
251
|
|
|
252
|
-
**Visible to user:** Only the tools (`
|
|
252
|
+
**Visible to user:** Only the tools (`forloopSpaceSprintList`, etc.)
|
|
253
253
|
|
|
254
254
|
### What You See as a User
|
|
255
255
|
|
|
@@ -44,7 +44,7 @@ Just use commands in opencode chat:
|
|
|
44
44
|
|
|
45
45
|
### List Sprints
|
|
46
46
|
```
|
|
47
|
-
|
|
47
|
+
forloopSpaceSprintList
|
|
48
48
|
```
|
|
49
49
|
|
|
50
50
|
### Create a Story
|
|
@@ -61,8 +61,8 @@ forloopAgentBreakdown --storyId 78
|
|
|
61
61
|
|
|
62
62
|
| What You Want to Do | Command |
|
|
63
63
|
|---------------------|---------|
|
|
64
|
-
| See all sprints | `
|
|
65
|
-
| See sprint details | `
|
|
64
|
+
| See all sprints | `forloopSpaceSprintList` |
|
|
65
|
+
| See sprint details | `forloopSpaceSprintGet --sprintId 14` |
|
|
66
66
|
| Create story | `forloopStoryCreate --title "..." --sprintId 14` |
|
|
67
67
|
| Update story | `forloopStoryUpdate --storyId 78 --status done` |
|
|
68
68
|
| Get AI breakdown | `forloopAgentBreakdown --storyId 78` |
|
|
@@ -9,7 +9,7 @@ The ForLoop Plugin is **NOT a CLI tool** that you run directly. It's an **openco
|
|
|
9
9
|
```bash
|
|
10
10
|
# These DON'T work:
|
|
11
11
|
node plugins/tools/sprint-tools.ts ✗
|
|
12
|
-
npm run
|
|
12
|
+
npm run forloopSpaceSprintList ✗
|
|
13
13
|
./plugins/forloop-plugin.ts ✗
|
|
14
14
|
```
|
|
15
15
|
|
|
@@ -22,7 +22,7 @@ Users interact through **opencode chat** using tool commands:
|
|
|
22
22
|
opencode
|
|
23
23
|
|
|
24
24
|
# 2. In the chat, use tool commands:
|
|
25
|
-
|
|
25
|
+
forloopSpaceSprintList
|
|
26
26
|
forloopStoryCreate --title "As a user, I want to login" --sprintId 14
|
|
27
27
|
forloopAgentBreakdown --storyId 78
|
|
28
28
|
```
|
|
@@ -56,7 +56,7 @@ forloopAgentBreakdown --storyId 78
|
|
|
56
56
|
|
|
57
57
|
| TypeScript Function | User Command |
|
|
58
58
|
|---------------------|--------------|
|
|
59
|
-
| `createSprintListTool()` | `
|
|
59
|
+
| `createSprintListTool()` | `forloopSpaceSprintList` |
|
|
60
60
|
| `createStoryCreateTool()` | `forloopStoryCreate --title "..."` |
|
|
61
61
|
| `createAgentBreakdownTool()` | `forloopAgentBreakdown --storyId 78` |
|
|
62
62
|
|
|
@@ -76,7 +76,7 @@ npm run install:local
|
|
|
76
76
|
|
|
77
77
|
# 4. Test in opencode
|
|
78
78
|
opencode
|
|
79
|
-
>
|
|
79
|
+
> forloopSpaceSprintList
|
|
80
80
|
```
|
|
81
81
|
|
|
82
82
|
If you're **using** the plugin:
|
|
@@ -84,7 +84,7 @@ If you're **using** the plugin:
|
|
|
84
84
|
```bash
|
|
85
85
|
# Just use opencode chat
|
|
86
86
|
opencode
|
|
87
|
-
>
|
|
87
|
+
> forloopSpaceSprintList
|
|
88
88
|
|
|
89
89
|
# That's it! No TypeScript knowledge needed.
|
|
90
90
|
```
|
|
@@ -444,7 +444,7 @@ Replace lines 106-117:
|
|
|
444
444
|
- Confirm active sprint
|
|
445
445
|
3. **IF manifest missing or empty:**
|
|
446
446
|
- ⚠️ **STOP searching immediately**
|
|
447
|
-
- ✅ **Call `
|
|
447
|
+
- ✅ **Call `forloopSpaceSprintList` to get sprints from API**
|
|
448
448
|
- ✅ **Call `forloopUserProfile` to get user info from API**
|
|
449
449
|
- Ask user to select/confirm sprint
|
|
450
450
|
- Create `$HOME/.forloop/manifest.json` after selection
|
|
@@ -459,7 +459,7 @@ With:
|
|
|
459
459
|
- Confirm active sprint
|
|
460
460
|
3. **IF manifest missing or empty:**
|
|
461
461
|
- ⚠️ **STOP searching immediately**
|
|
462
|
-
- ✅ **Call `
|
|
462
|
+
- ✅ **Call `forloopSpaceSprintList` to get sprints from API**
|
|
463
463
|
- ✅ **Call `forloopUserProfile` to get user info from API**
|
|
464
464
|
- Ask user to select/confirm sprint
|
|
465
465
|
- Create `$HOME/.forloop/manifest.json` after selection
|
|
@@ -371,7 +371,7 @@ show_summary() {
|
|
|
371
371
|
echo ""
|
|
372
372
|
echo " Next steps:"
|
|
373
373
|
echo " 1. Start opencode: opencode"
|
|
374
|
-
echo " 2. List sprints:
|
|
374
|
+
echo " 2. List sprints: forloopSpaceSprintList"
|
|
375
375
|
echo " 3. Create a story: forloopStoryCreate --title 'My feature'"
|
|
376
376
|
echo ""
|
|
377
377
|
echo " Docs: https://github.com/forloop-cc/forloop-opencode-plugin-planner"
|
|
@@ -70,7 +70,7 @@ The Docker container installs in this order:
|
|
|
70
70
|
|
|
71
71
|
### Stage E: Tool Discovery
|
|
72
72
|
**Assert:** `opencode run --agent forLoopPlanner "what tools and skills do you have"` produces output that:
|
|
73
|
-
- Lists or references ForLoop plugin tools (
|
|
73
|
+
- Lists or references ForLoop plugin tools (forloopSpaceSprintList, forloopStoryCreate, forloopAgentQuery, etc.)
|
|
74
74
|
- References skills loaded from the plugin (sprint-planning, task-tracking, file-management, forloop-skill)
|
|
75
75
|
|
|
76
76
|
## No Token Behavior
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "@forloop-cc/forloop-opencode-plugin-planner",
|
|
4
|
-
"version": "2.2.
|
|
4
|
+
"version": "2.2.15",
|
|
5
5
|
"description": "ForLoop integration plugin for opencode — Sprint, story, and agent tools for the ForLoop platform",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"license": "MIT",
|
|
@@ -100,11 +100,11 @@ export default async (ctx: any) => {
|
|
|
100
100
|
'forloopTokenGet': createTokenGetTool(),
|
|
101
101
|
|
|
102
102
|
// Sprint Operations
|
|
103
|
-
'
|
|
104
|
-
'
|
|
105
|
-
'
|
|
106
|
-
'
|
|
107
|
-
'
|
|
103
|
+
'forloopSpaceSprintList': createSprintListTool(client),
|
|
104
|
+
'forloopSpaceSprintGet': createSprintGetTool(client),
|
|
105
|
+
'forloopSpaceSprintCreate': createSprintCreateTool(client),
|
|
106
|
+
'forloopSpaceSprintUpdate': createSprintUpdateTool(client),
|
|
107
|
+
'forloopSpaceSprintDelete': createSprintDeleteTool(client),
|
|
108
108
|
|
|
109
109
|
// Sub-Sprint (Iteration) Operations
|
|
110
110
|
'forloopSubSprintList' : createSubSprintListTool(client),
|
|
@@ -162,7 +162,7 @@ export default async (ctx: any) => {
|
|
|
162
162
|
'forloopAgentHistory': createConversationHistoryTool(client),
|
|
163
163
|
'forloopAgentClear': createClearHistoryTool(client),
|
|
164
164
|
'forloopAiAgentList': createAgentListTool(client),
|
|
165
|
-
'
|
|
165
|
+
'forloopSpaceSprintAiAgentsUpdate': createSprintAiAgentsUpdateTool(client),
|
|
166
166
|
|
|
167
167
|
// AI Execution Tools
|
|
168
168
|
...aiTriggerTools,
|
|
@@ -44,7 +44,7 @@ export function createAgentListTool(client: ForLoopAPIClient) {
|
|
|
44
44
|
|
|
45
45
|
export function createSprintAiAgentsUpdateTool(client: ForLoopAPIClient) {
|
|
46
46
|
return tool({
|
|
47
|
-
description: 'Enable or disable AI agents for a
|
|
47
|
+
description: 'Enable or disable AI agents for a space',
|
|
48
48
|
args: {
|
|
49
49
|
sprintId: tool.schema.number()
|
|
50
50
|
.optional()
|
|
@@ -8,18 +8,18 @@ import { validateToken } from '../capabilities/auth';
|
|
|
8
8
|
export function createAITriggerTools(client: ForLoopAPIClient) {
|
|
9
9
|
const tools: Record<string, ReturnType<typeof tool>> = {};
|
|
10
10
|
|
|
11
|
-
tools['
|
|
11
|
+
tools['forloopAiDeveloperSpaceSprint'] = createDeveloperSprintTool(client);
|
|
12
12
|
|
|
13
13
|
return tools;
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
|
-
*
|
|
17
|
+
* forloopAiDeveloperSpaceSprint - Trigger developer agent for space work
|
|
18
18
|
* Triggers the forLoopTaskSupervisor agent via EventBridge → Step Functions → ECS
|
|
19
19
|
*/
|
|
20
20
|
function createDeveloperSprintTool(client: ForLoopAPIClient) {
|
|
21
21
|
return tool({
|
|
22
|
-
description: 'Trigger forLoopTaskSupervisor agent to execute
|
|
22
|
+
description: 'Trigger forLoopTaskSupervisor agent to execute space work. This sends stories to the developer agent for implementation via EventBridge → Step Functions → ECS Fargate.',
|
|
23
23
|
args: {
|
|
24
24
|
sprintId: tool.schema.number()
|
|
25
25
|
.describe('Sprint ID to execute'),
|
|
@@ -35,7 +35,7 @@ function createDeveloperSprintTool(client: ForLoopAPIClient) {
|
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
try {
|
|
38
|
-
console.log('[
|
|
38
|
+
console.log('[forloopAiDeveloperSpaceSprint] Triggering developer agent', {
|
|
39
39
|
sprintId: args.sprintId,
|
|
40
40
|
});
|
|
41
41
|
|
|
@@ -71,7 +71,7 @@ function createDeveloperSprintTool(client: ForLoopAPIClient) {
|
|
|
71
71
|
- Check the ForLoop dashboard for story status updates
|
|
72
72
|
- Wait for email notification upon completion`
|
|
73
73
|
} catch (error: any) {
|
|
74
|
-
console.error('[
|
|
74
|
+
console.error('[forloopAiDeveloperSpaceSprint] Failed to trigger developer', error)
|
|
75
75
|
return `❌ Failed to trigger forLoopTaskSupervisor: ${error.message}`
|
|
76
76
|
}
|
|
77
77
|
},
|
|
@@ -6,7 +6,7 @@ import { getToken } from '../capabilities/token-storage';
|
|
|
6
6
|
|
|
7
7
|
export function createSprintGetTool(client: ForLoopAPIClient) {
|
|
8
8
|
return tool({
|
|
9
|
-
description: 'Get
|
|
9
|
+
description: 'Get space details including stories, files, and AI agents',
|
|
10
10
|
args: {
|
|
11
11
|
sprintId: tool.schema.number()
|
|
12
12
|
.optional()
|
|
@@ -49,7 +49,7 @@ export function createSprintGetTool(client: ForLoopAPIClient) {
|
|
|
49
49
|
});
|
|
50
50
|
|
|
51
51
|
const lines = [
|
|
52
|
-
`📋
|
|
52
|
+
`📋 Space #${sprint.id}: ${sprint.title}`,
|
|
53
53
|
'',
|
|
54
54
|
`**Status**: ${sprint.status}`,
|
|
55
55
|
`**Period**: ${formatDate(sprint.startDate)} - ${formatDate(sprint.endDate)}`,
|
|
@@ -80,7 +80,7 @@ export function createSprintGetTool(client: ForLoopAPIClient) {
|
|
|
80
80
|
|
|
81
81
|
export function createSprintListTool(client: ForLoopAPIClient) {
|
|
82
82
|
return tool({
|
|
83
|
-
description: 'List all accessible
|
|
83
|
+
description: 'List all accessible spaces',
|
|
84
84
|
args: {
|
|
85
85
|
organizationId: tool.schema.number()
|
|
86
86
|
.optional()
|
|
@@ -106,10 +106,10 @@ export function createSprintListTool(client: ForLoopAPIClient) {
|
|
|
106
106
|
});
|
|
107
107
|
|
|
108
108
|
if (!sprints.length) {
|
|
109
|
-
return 'No
|
|
109
|
+
return 'No spaces found.';
|
|
110
110
|
}
|
|
111
111
|
|
|
112
|
-
const lines = ['📋
|
|
112
|
+
const lines = ['📋 Spaces:', ''];
|
|
113
113
|
for (const sprint of sprints) {
|
|
114
114
|
const statusIcon = getStatusIcon(sprint.status);
|
|
115
115
|
const orgInfo = sprint.organizationName ? ` (${sprint.organizationName})` : '';
|
|
@@ -155,7 +155,7 @@ function getStatusIcon(status: string): string {
|
|
|
155
155
|
|
|
156
156
|
export function createSprintCreateTool(client: ForLoopAPIClient) {
|
|
157
157
|
return tool({
|
|
158
|
-
description: 'Create a new
|
|
158
|
+
description: 'Create a new space with specified dates and settings',
|
|
159
159
|
args: {
|
|
160
160
|
title: tool.schema.string()
|
|
161
161
|
.describe('Sprint title'),
|
|
@@ -191,7 +191,7 @@ export function createSprintCreateTool(client: ForLoopAPIClient) {
|
|
|
191
191
|
});
|
|
192
192
|
|
|
193
193
|
const lines = [
|
|
194
|
-
'✅
|
|
194
|
+
'✅ Space created successfully!',
|
|
195
195
|
'',
|
|
196
196
|
`**#${sprint.id}**: ${sprint.title}`,
|
|
197
197
|
`**Period**: ${formatDate(sprint.startDate)} - ${formatDate(sprint.endDate)}`,
|
|
@@ -212,7 +212,7 @@ export function createSprintCreateTool(client: ForLoopAPIClient) {
|
|
|
212
212
|
|
|
213
213
|
export function createSprintUpdateTool(client: ForLoopAPIClient) {
|
|
214
214
|
return tool({
|
|
215
|
-
description: 'Update
|
|
215
|
+
description: 'Update space details',
|
|
216
216
|
args: {
|
|
217
217
|
sprintId: tool.schema.number()
|
|
218
218
|
.describe('Sprint ID to update'),
|
|
@@ -249,7 +249,7 @@ export function createSprintUpdateTool(client: ForLoopAPIClient) {
|
|
|
249
249
|
|
|
250
250
|
const sprint = await client.updateSprint(args.sprintId, updateData);
|
|
251
251
|
|
|
252
|
-
return `✅
|
|
252
|
+
return `✅ Space #${sprint.id} updated successfully!`;
|
|
253
253
|
} catch (error: any) {
|
|
254
254
|
return `❌ Error: ${error.message}`;
|
|
255
255
|
}
|
|
@@ -259,7 +259,7 @@ export function createSprintUpdateTool(client: ForLoopAPIClient) {
|
|
|
259
259
|
|
|
260
260
|
export function createSprintDeleteTool(client: ForLoopAPIClient) {
|
|
261
261
|
return tool({
|
|
262
|
-
description: 'Delete a
|
|
262
|
+
description: 'Delete a space (use with caution)',
|
|
263
263
|
args: {
|
|
264
264
|
sprintId: tool.schema.number()
|
|
265
265
|
.describe('Sprint ID to delete'),
|
|
@@ -276,7 +276,7 @@ export function createSprintDeleteTool(client: ForLoopAPIClient) {
|
|
|
276
276
|
|
|
277
277
|
if (!args.confirm) {
|
|
278
278
|
return [
|
|
279
|
-
'⚠️ Warning: This will permanently delete the
|
|
279
|
+
'⚠️ Warning: This will permanently delete the space and all its stories.',
|
|
280
280
|
'',
|
|
281
281
|
'Use --confirm true to proceed.',
|
|
282
282
|
].join('\n');
|
|
@@ -285,7 +285,7 @@ export function createSprintDeleteTool(client: ForLoopAPIClient) {
|
|
|
285
285
|
try {
|
|
286
286
|
await client.deleteSprint(args.sprintId);
|
|
287
287
|
|
|
288
|
-
return `✅
|
|
288
|
+
return `✅ Space #${args.sprintId} deleted successfully!`;
|
|
289
289
|
} catch (error: any) {
|
|
290
290
|
return `❌ Error: ${error.message}`;
|
|
291
291
|
}
|
|
@@ -295,7 +295,7 @@ export function createSprintDeleteTool(client: ForLoopAPIClient) {
|
|
|
295
295
|
|
|
296
296
|
export function createSubSprintListTool(client: ForLoopAPIClient) {
|
|
297
297
|
return tool({
|
|
298
|
-
description: 'List all iterations (sub-sprints) within a
|
|
298
|
+
description: 'List all iterations (sub-sprints) within a space',
|
|
299
299
|
args: {
|
|
300
300
|
sprintId: tool.schema.number()
|
|
301
301
|
.optional()
|
|
@@ -313,9 +313,9 @@ export function createSubSprintListTool(client: ForLoopAPIClient) {
|
|
|
313
313
|
try {
|
|
314
314
|
const subSprints = await client.getSubSprints(resolution.sprintId)
|
|
315
315
|
if (subSprints.length === 0) {
|
|
316
|
-
return `
|
|
316
|
+
return `Space #${resolution.sprintId} has no iterations yet.`
|
|
317
317
|
}
|
|
318
|
-
const lines = [`Iterations for
|
|
318
|
+
const lines = [`Iterations for space #${resolution.sprintId}:`, '']
|
|
319
319
|
for (const s of subSprints) {
|
|
320
320
|
const active = s.status === 'in_progress' ? ' ▶ ACTIVE' : ''
|
|
321
321
|
lines.push(
|
|
@@ -414,7 +414,7 @@ export function createSubSprintUpdateTool(client: ForLoopAPIClient) {
|
|
|
414
414
|
|
|
415
415
|
export function createSubSprintDeleteTool(client: ForLoopAPIClient) {
|
|
416
416
|
return tool({
|
|
417
|
-
description: 'Soft-delete an iteration (sub-sprint). Linked stories retain their subSprintId and will not appear in default
|
|
417
|
+
description: 'Soft-delete an iteration (sub-sprint). Linked stories retain their subSprintId and will not appear in default space views.',
|
|
418
418
|
args: {
|
|
419
419
|
subSprintId: tool.schema.number()
|
|
420
420
|
.describe('Sub-sprint ID to delete'),
|