kiro-spec-engine 1.43.0 → 1.44.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/CHANGELOG.md +18 -0
- package/README.md +12 -1
- package/README.zh.md +12 -1
- package/docs/README.md +5 -2
- package/docs/multi-agent-coordination-guide.md +553 -0
- package/lib/collab/coordinator.js +19 -1
- package/lib/collab/index.js +5 -1
- package/lib/collab/spec-lifecycle-manager.js +304 -0
- package/lib/collab/sync-barrier.js +88 -0
- package/lib/steering/context-sync-manager.js +273 -0
- package/lib/steering/index.js +7 -1
- package/lib/steering/spec-steering.js +230 -0
- package/lib/steering/steering-loader.js +144 -0
- package/package.json +1 -1
- package/template/.kiro/README.md +130 -77
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [1.44.0] - 2026-02-12
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- **Spec-Level Steering & Multi-Agent Context Sync**: Fourth steering layer (L4) and Spec lifecycle coordination
|
|
14
|
+
- **SpecSteering** (`lib/steering/spec-steering.js`): Spec-level `steering.md` CRUD with template generation, Markdown ↔ structured object roundtrip, atomic write. Each Spec gets independent constraints/notes/decisions — zero cross-agent conflict
|
|
15
|
+
- **SteeringLoader** (`lib/steering/steering-loader.js`): Unified L1-L4 four-layer steering loader with merged output. L4 loaded via SpecSteering in multi-agent mode, skipped in single-agent mode
|
|
16
|
+
- **ContextSyncManager** (`lib/steering/context-sync-manager.js`): Multi-agent friendly CURRENT_CONTEXT.md maintenance with structured Spec progress table format, SteeringFileLock-protected concurrent writes, tasks.md-based progress computation
|
|
17
|
+
- **SpecLifecycleManager** (`lib/collab/spec-lifecycle-manager.js`): Spec state machine (planned → assigned → in-progress → completed → released) with lifecycle.json persistence, auto-completion detection, ContextSyncManager update and AgentRegistry notification on completion
|
|
18
|
+
- **SyncBarrier** (`lib/collab/sync-barrier.js`): Agent Spec-switch synchronization barrier — checks for uncommitted changes, reloads steering before switching
|
|
19
|
+
- **Coordinator Integration**: `completeTask` now auto-checks Spec completion via SpecLifecycleManager; `assignTask` runs SyncBarrier before task access
|
|
20
|
+
- All components are no-ops in single-agent mode (zero overhead, full backward compatibility)
|
|
21
|
+
|
|
22
|
+
## [1.43.1] - 2026-02-11
|
|
23
|
+
|
|
24
|
+
### Changed
|
|
25
|
+
- **Agent Onboarding Document** (`template/.kiro/README.md`, `.kiro/README.md`): Comprehensive rewrite of "kse Capabilities" section listing all commands and features (Core, Task, Spec Locking, Workspace, Environment, Multi-Repo, Collab, Multi-Agent Coordination, Autonomous Control, Scene Runtime, Document Governance, DevOps, Knowledge Management)
|
|
26
|
+
- **CORE_PRINCIPLES Principle 9**: Strengthened version sync and steering refresh principle — `.kiro/README.md` is now the authoritative agent onboarding entry point for understanding all kse capabilities
|
|
27
|
+
|
|
10
28
|
## [1.43.0] - 2026-02-11
|
|
11
29
|
|
|
12
30
|
### Added
|
package/README.md
CHANGED
|
@@ -223,6 +223,7 @@ sequenceDiagram
|
|
|
223
223
|
- 🌍 **[Environment Management](docs/environment-management-guide.md)** - Multi-environment configuration
|
|
224
224
|
- 📦 **[Multi-Repository Management](docs/multi-repo-management-guide.md)** - Manage multiple Git repositories
|
|
225
225
|
- 🎭 **[Scene Runtime](docs/scene-runtime-guide.md)** - Template engine, quality pipeline, ontology, Moqui ERP
|
|
226
|
+
- 🤖 **[Multi-Agent Coordination](docs/multi-agent-coordination-guide.md)** - Parallel agent coordination
|
|
226
227
|
- 🔌 **[Integration Modes](docs/integration-modes.md)** - Three ways to integrate kse
|
|
227
228
|
- 📝 **[Command Reference](docs/command-reference.md)** - All kse commands
|
|
228
229
|
|
|
@@ -329,6 +330,16 @@ Structure your work with Requirements → Design → Tasks workflow
|
|
|
329
330
|
- **Central Coordinator**: Dependency-driven ready task computation, task assignment, progress tracking
|
|
330
331
|
- **Zero Overhead**: All components are no-ops in single-agent mode (full backward compatibility)
|
|
331
332
|
|
|
333
|
+
[Learn more about Multi-Agent Coordination →](docs/multi-agent-coordination-guide.md)
|
|
334
|
+
|
|
335
|
+
### Spec-Level Steering & Context Sync 🚀 NEW in v1.44.0
|
|
336
|
+
- **Spec Steering (L4)**: Independent `steering.md` per Spec with constraints, notes, and decisions — zero cross-agent conflict
|
|
337
|
+
- **Steering Loader**: Unified L1-L4 four-layer steering loader with priority-based merging
|
|
338
|
+
- **Context Sync Manager**: Multi-agent friendly CURRENT_CONTEXT.md with structured Spec progress table, concurrent-safe updates
|
|
339
|
+
- **Spec Lifecycle Manager**: State machine (planned → assigned → in-progress → completed → released) with auto-completion detection
|
|
340
|
+
- **Sync Barrier**: Agent Spec-switch synchronization — uncommitted change check + steering reload
|
|
341
|
+
- **Coordinator Integration**: Auto Spec completion check on task complete, SyncBarrier on task assign
|
|
342
|
+
|
|
332
343
|
### Scene Ontology Enhancement 🚀 NEW in v1.42.0
|
|
333
344
|
- **OntologyGraph**: Semantic relationship graph for binding refs (depends_on, composes, extends, produces)
|
|
334
345
|
- **Action Abstraction**: Intent, preconditions, postconditions per binding for AI agent understanding
|
|
@@ -612,5 +623,5 @@ A deep conversation about AI development trends, Neo-Confucian philosophy, and s
|
|
|
612
623
|
|
|
613
624
|
---
|
|
614
625
|
|
|
615
|
-
**Version**: 1.
|
|
626
|
+
**Version**: 1.43.0
|
|
616
627
|
**Last Updated**: 2026-02-11
|
package/README.zh.md
CHANGED
|
@@ -219,6 +219,7 @@ sequenceDiagram
|
|
|
219
219
|
- 🔢 **[Spec 编号策略](docs/zh/spec-numbering-guide.md)** - 如何为 Spec 编号
|
|
220
220
|
- 📄 **[文档治理](docs/document-governance.md)** - 自动化文档管理
|
|
221
221
|
- 🎭 **[场景运行时指南](docs/scene-runtime-guide.md)** - 模板引擎、质量流水线、Ontology、Moqui ERP
|
|
222
|
+
- 🤖 **[多 Agent 协调指南](docs/multi-agent-coordination-guide.md)** - 多 Agent 并行协调
|
|
222
223
|
- 🔌 **[集成模式](docs/integration-modes.md)** - 三种集成 kse 的方式
|
|
223
224
|
- 📝 **[命令参考](docs/command-reference.md)** - 所有 kse 命令
|
|
224
225
|
|
|
@@ -285,6 +286,16 @@ sequenceDiagram
|
|
|
285
286
|
- **中央协调器**: 基于依赖的就绪任务计算,任务分配,进度跟踪
|
|
286
287
|
- **零开销**: 单 Agent 模式下所有组件为无操作(完全向后兼容)
|
|
287
288
|
|
|
289
|
+
[了解更多多 Agent 协调 →](docs/multi-agent-coordination-guide.md)
|
|
290
|
+
|
|
291
|
+
### Spec 级 Steering 与上下文同步 🚀 v1.44.0 新增
|
|
292
|
+
- **Spec Steering (L4)**: 每个 Spec 独立的 `steering.md`,包含约束、注意事项、决策记录 — 跨 Agent 零冲突
|
|
293
|
+
- **Steering 加载器**: 统一 L1-L4 四层 Steering 加载,优先级合并
|
|
294
|
+
- **上下文同步管理器**: 多 Agent 友好的 CURRENT_CONTEXT.md,结构化 Spec 进度表,并发安全更新
|
|
295
|
+
- **Spec 生命周期管理器**: 状态机(planned → assigned → in-progress → completed → released),自动完成检测
|
|
296
|
+
- **同步屏障**: Agent 切换 Spec 时的同步检查 — 未提交更改检测 + Steering 重新加载
|
|
297
|
+
- **Coordinator 集成**: 任务完成时自动检测 Spec 完成,任务分配时运行同步屏障
|
|
298
|
+
|
|
288
299
|
### 场景 Ontology 增强 🚀 v1.42.0 新增
|
|
289
300
|
- **OntologyGraph**: 绑定引用语义关系图(depends_on、composes、extends、produces)
|
|
290
301
|
- **Action Abstraction**: 每个绑定的 intent、preconditions、postconditions,提升 AI 可读性
|
|
@@ -475,5 +486,5 @@ kse create-spec 01-00-my-first-feature
|
|
|
475
486
|
|
|
476
487
|
---
|
|
477
488
|
|
|
478
|
-
**版本**:1.
|
|
489
|
+
**版本**:1.43.0
|
|
479
490
|
**最后更新**:2026-02-11
|
package/docs/README.md
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
**Version**: 1.
|
|
8
|
-
**Last Updated**: 2026-02-
|
|
7
|
+
**Version**: 1.44.0
|
|
8
|
+
**Last Updated**: 2026-02-12
|
|
9
9
|
|
|
10
10
|
---
|
|
11
11
|
|
|
@@ -81,6 +81,7 @@ Detailed technical documentation:
|
|
|
81
81
|
- **[Environment Management Guide](environment-management-guide.md)** - Multi-environment configuration management
|
|
82
82
|
- **[Multi-Repository Management Guide](multi-repo-management-guide.md)** - Managing multiple Git repositories
|
|
83
83
|
- **[Scene Runtime Guide](scene-runtime-guide.md)** - Scene template engine, quality pipeline, ontology, and Moqui ERP integration
|
|
84
|
+
- **[Multi-Agent Coordination Guide](multi-agent-coordination-guide.md)** - Multi-agent parallel coordination for concurrent development
|
|
84
85
|
- **[Troubleshooting](troubleshooting.md)** - Solutions to common problems
|
|
85
86
|
- **[FAQ](faq.md)** - Answers to frequently asked questions
|
|
86
87
|
|
|
@@ -93,6 +94,7 @@ Detailed technical documentation:
|
|
|
93
94
|
- **[Environment Management Guide](environment-management-guide.md)** - Managing multiple environments
|
|
94
95
|
- **[Multi-Repository Management Guide](multi-repo-management-guide.md)** - Managing multiple Git repositories
|
|
95
96
|
- **[Scene Runtime Guide](scene-runtime-guide.md)** - Scene template engine, quality pipeline, ontology, and Moqui ERP integration
|
|
97
|
+
- **[Multi-Agent Coordination Guide](multi-agent-coordination-guide.md)** - Multi-agent parallel coordination for concurrent development
|
|
96
98
|
- **[Developer Guide](developer-guide.md)** - Contributing to kse development
|
|
97
99
|
- **[Architecture](architecture.md)** - kse system architecture
|
|
98
100
|
|
|
@@ -226,6 +228,7 @@ Detailed technical documentation:
|
|
|
226
228
|
| Environment Management | ✅ Complete | 2026-01-31 |
|
|
227
229
|
| Multi-Repository Management | ✅ Complete | 2026-01-31 |
|
|
228
230
|
| Scene Runtime Guide | ✅ Complete | 2026-02-11 |
|
|
231
|
+
| Multi-Agent Coordination | ✅ Complete | 2026-02-12 |
|
|
229
232
|
|
|
230
233
|
---
|
|
231
234
|
|
|
@@ -0,0 +1,553 @@
|
|
|
1
|
+
# Multi-Agent Parallel Coordination Guide
|
|
2
|
+
|
|
3
|
+
> Enable multiple AI agents to work on the same kse project simultaneously without conflicts.
|
|
4
|
+
|
|
5
|
+
**Version**: 1.44.0
|
|
6
|
+
**Last Updated**: 2026-02-12
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Overview
|
|
11
|
+
|
|
12
|
+
When multiple AI agent instances (e.g., multiple Kiro IDE windows, Claude Code sessions, or Cursor instances) work on the same project, they can accidentally overwrite each other's changes, claim the same tasks, or corrupt shared files like `tasks.md`.
|
|
13
|
+
|
|
14
|
+
The Multi-Agent Parallel Coordination system solves this with six layers of protection:
|
|
15
|
+
|
|
16
|
+
1. **Agent Registry** — Who is working?
|
|
17
|
+
2. **Task Lock Manager** — Who owns which task?
|
|
18
|
+
3. **Task Status Store** — Safe concurrent updates to tasks.md
|
|
19
|
+
4. **Steering File Lock** — Safe concurrent updates to steering files
|
|
20
|
+
5. **Merge Coordinator** — Git branch isolation per agent
|
|
21
|
+
6. **Central Coordinator** — Intelligent task assignment (optional)
|
|
22
|
+
7. **Spec-Level Steering (L4)** — Per-Spec constraints and notes (v1.44.0)
|
|
23
|
+
8. **Steering Loader** — Unified L1-L4 four-layer steering merge (v1.44.0)
|
|
24
|
+
9. **Context Sync Manager** — Multi-agent CURRENT_CONTEXT.md maintenance (v1.44.0)
|
|
25
|
+
10. **Spec Lifecycle Manager** — Spec state machine and auto-completion (v1.44.0)
|
|
26
|
+
11. **Sync Barrier** — Agent Spec-switch synchronization (v1.44.0)
|
|
27
|
+
|
|
28
|
+
All components are **zero overhead in single-agent mode** — they become no-ops when multi-agent mode is not enabled.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Quick Start
|
|
33
|
+
|
|
34
|
+
### 1. Enable Multi-Agent Mode
|
|
35
|
+
|
|
36
|
+
Create the configuration file `.kiro/config/multi-agent.json`:
|
|
37
|
+
|
|
38
|
+
```json
|
|
39
|
+
{
|
|
40
|
+
"enabled": true,
|
|
41
|
+
"coordinator": false,
|
|
42
|
+
"heartbeatIntervalMs": 30000,
|
|
43
|
+
"heartbeatTimeoutMs": 120000
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
| Field | Description | Default |
|
|
48
|
+
|-------|-------------|---------|
|
|
49
|
+
| `enabled` | Enable multi-agent coordination | `false` |
|
|
50
|
+
| `coordinator` | Enable central task assignment | `false` |
|
|
51
|
+
| `heartbeatIntervalMs` | Heartbeat interval in ms | `30000` |
|
|
52
|
+
| `heartbeatTimeoutMs` | Agent considered inactive after this | `120000` |
|
|
53
|
+
|
|
54
|
+
### 2. Each Agent Registers Itself
|
|
55
|
+
|
|
56
|
+
When an agent starts working, it registers with the AgentRegistry:
|
|
57
|
+
|
|
58
|
+
```javascript
|
|
59
|
+
const { AgentRegistry } = require('kiro-spec-engine/lib/collab');
|
|
60
|
+
|
|
61
|
+
const registry = new AgentRegistry(workspaceRoot);
|
|
62
|
+
const { agentId } = await registry.register();
|
|
63
|
+
// agentId format: "{machineId}:{instanceIndex}"
|
|
64
|
+
// e.g., "a1b2c3d4:0", "a1b2c3d4:1"
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 3. Lock Tasks Before Working
|
|
68
|
+
|
|
69
|
+
```javascript
|
|
70
|
+
const { TaskLockManager } = require('kiro-spec-engine/lib/lock');
|
|
71
|
+
|
|
72
|
+
const lockManager = new TaskLockManager(workspaceRoot);
|
|
73
|
+
const result = await lockManager.acquireTaskLock('my-spec', '1.1', agentId);
|
|
74
|
+
|
|
75
|
+
if (result.success) {
|
|
76
|
+
// Safe to work on task 1.1
|
|
77
|
+
// ... do work ...
|
|
78
|
+
await lockManager.releaseTaskLock('my-spec', '1.1', agentId);
|
|
79
|
+
} else {
|
|
80
|
+
// Task is locked by another agent
|
|
81
|
+
console.log(`Locked by: ${result.lockedBy}`);
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### 4. Deregister When Done
|
|
86
|
+
|
|
87
|
+
```javascript
|
|
88
|
+
await registry.deregister(agentId);
|
|
89
|
+
// Automatically releases all locks held by this agent
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Architecture
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
┌─────────────────────────────────────────────────────┐
|
|
98
|
+
│ Coordinator (optional) │
|
|
99
|
+
│ Ready task computation + assignment │
|
|
100
|
+
│ v1.44.0: auto Spec completion + sync barrier │
|
|
101
|
+
├──────────┬──────────┬──────────┬────────────────────┤
|
|
102
|
+
│ Agent │ Task │ Task │ Steering │ Merge │
|
|
103
|
+
│ Registry │ Lock │ Status │ File Lock │ Coord │
|
|
104
|
+
│ │ Manager │ Store │ │ │
|
|
105
|
+
├──────────┴──────────┴──────────┴────────────┴────────┤
|
|
106
|
+
│ MultiAgentConfig │
|
|
107
|
+
│ .kiro/config/multi-agent.json │
|
|
108
|
+
├──────────────────────────────────────────────────────┤
|
|
109
|
+
│ v1.44.0: Spec-Level Steering & Context Sync │
|
|
110
|
+
│ SpecSteering │ SteeringLoader │ ContextSyncManager │
|
|
111
|
+
│ SpecLifecycleManager │ SyncBarrier │
|
|
112
|
+
└─────────────────────────────────────────────────────┘
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Components
|
|
118
|
+
|
|
119
|
+
### Agent Registry
|
|
120
|
+
|
|
121
|
+
Manages agent lifecycle with heartbeat-based health monitoring.
|
|
122
|
+
|
|
123
|
+
**File**: `lib/collab/agent-registry.js`
|
|
124
|
+
**Storage**: `.kiro/config/agent-registry.json`
|
|
125
|
+
|
|
126
|
+
```javascript
|
|
127
|
+
const { AgentRegistry } = require('kiro-spec-engine/lib/collab');
|
|
128
|
+
const registry = new AgentRegistry(workspaceRoot);
|
|
129
|
+
|
|
130
|
+
// Register a new agent
|
|
131
|
+
const { agentId } = await registry.register();
|
|
132
|
+
|
|
133
|
+
// Send heartbeat (call periodically)
|
|
134
|
+
await registry.heartbeat(agentId);
|
|
135
|
+
|
|
136
|
+
// List active agents
|
|
137
|
+
const agents = await registry.getActiveAgents();
|
|
138
|
+
|
|
139
|
+
// Clean up inactive agents (heartbeat timeout)
|
|
140
|
+
const cleaned = await registry.cleanupInactive();
|
|
141
|
+
// Also releases all locks held by inactive agents
|
|
142
|
+
|
|
143
|
+
// Deregister when done
|
|
144
|
+
await registry.deregister(agentId);
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
**Agent ID format**: `{machineId}:{instanceIndex}`
|
|
148
|
+
- `machineId` is derived from MachineIdentifier (hardware-based)
|
|
149
|
+
- `instanceIndex` increments for multiple instances on the same machine
|
|
150
|
+
- Example: `a1b2c3d4e5f6:0`, `a1b2c3d4e5f6:1`
|
|
151
|
+
|
|
152
|
+
### Task Lock Manager
|
|
153
|
+
|
|
154
|
+
File-based mutual exclusion for task ownership.
|
|
155
|
+
|
|
156
|
+
**File**: `lib/lock/task-lock-manager.js`
|
|
157
|
+
**Lock files**: `.kiro/specs/{specName}/locks/{taskId}.lock`
|
|
158
|
+
|
|
159
|
+
```javascript
|
|
160
|
+
const { TaskLockManager } = require('kiro-spec-engine/lib/lock');
|
|
161
|
+
const lockManager = new TaskLockManager(workspaceRoot);
|
|
162
|
+
|
|
163
|
+
// Acquire a task lock
|
|
164
|
+
const result = await lockManager.acquireTaskLock(specName, taskId, agentId);
|
|
165
|
+
// result: { success: true } or { success: false, lockedBy: "other-agent-id" }
|
|
166
|
+
|
|
167
|
+
// Release a task lock
|
|
168
|
+
await lockManager.releaseTaskLock(specName, taskId, agentId);
|
|
169
|
+
|
|
170
|
+
// Release ALL locks for an agent (used during cleanup)
|
|
171
|
+
await lockManager.releaseAllLocks(agentId);
|
|
172
|
+
|
|
173
|
+
// Check lock status
|
|
174
|
+
const status = await lockManager.getTaskLockStatus(specName, taskId);
|
|
175
|
+
// status: { locked: true, agentId: "...", timestamp: "..." } or { locked: false }
|
|
176
|
+
|
|
177
|
+
// List all locked tasks in a spec
|
|
178
|
+
const locked = await lockManager.listLockedTasks(specName);
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**Lock file content** (JSON):
|
|
182
|
+
```json
|
|
183
|
+
{
|
|
184
|
+
"agentId": "a1b2c3d4e5f6:0",
|
|
185
|
+
"timestamp": "2026-02-11T10:30:00.000Z",
|
|
186
|
+
"reason": "task-execution"
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Task Status Store
|
|
191
|
+
|
|
192
|
+
Concurrent-safe updates to `tasks.md` with conflict detection and retry.
|
|
193
|
+
|
|
194
|
+
**File**: `lib/task/task-status-store.js`
|
|
195
|
+
|
|
196
|
+
```javascript
|
|
197
|
+
const { TaskStatusStore } = require('kiro-spec-engine/lib/task');
|
|
198
|
+
const store = new TaskStatusStore(workspaceRoot);
|
|
199
|
+
|
|
200
|
+
// Update task status with file locking
|
|
201
|
+
await store.updateStatus(specName, taskId, 'in-progress');
|
|
202
|
+
|
|
203
|
+
// Claim a task (with lock + retry)
|
|
204
|
+
const result = await store.claimTask(specName, taskId, agentId, username);
|
|
205
|
+
|
|
206
|
+
// Unclaim a task
|
|
207
|
+
await store.unclaimTask(specName, taskId, agentId, username);
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
**Conflict resolution strategy**:
|
|
211
|
+
1. Acquire file lock on `tasks.md.lock`
|
|
212
|
+
2. Read current file content
|
|
213
|
+
3. Validate target line hasn't changed (line-content comparison)
|
|
214
|
+
4. Write updated content atomically
|
|
215
|
+
5. Release file lock
|
|
216
|
+
6. On conflict: exponential backoff retry (up to 5 attempts, starting at 100ms)
|
|
217
|
+
7. After retries exhausted: return conflict error, original file preserved
|
|
218
|
+
|
|
219
|
+
### Steering File Lock
|
|
220
|
+
|
|
221
|
+
Write serialization for steering files (`.kiro/steering/*.md`).
|
|
222
|
+
|
|
223
|
+
**File**: `lib/lock/steering-file-lock.js`
|
|
224
|
+
|
|
225
|
+
```javascript
|
|
226
|
+
const { SteeringFileLock } = require('kiro-spec-engine/lib/lock');
|
|
227
|
+
const steeringLock = new SteeringFileLock(workspaceRoot);
|
|
228
|
+
|
|
229
|
+
// Execute callback with lock held
|
|
230
|
+
await steeringLock.withLock('CURRENT_CONTEXT.md', async () => {
|
|
231
|
+
// Safe to write to CURRENT_CONTEXT.md
|
|
232
|
+
await fs.writeFile(contextPath, newContent);
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
// Manual lock management
|
|
236
|
+
const { lockId } = await steeringLock.acquireLock('CURRENT_CONTEXT.md');
|
|
237
|
+
// ... write file ...
|
|
238
|
+
await steeringLock.releaseLock('CURRENT_CONTEXT.md', lockId);
|
|
239
|
+
|
|
240
|
+
// Degraded write (when lock cannot be acquired)
|
|
241
|
+
await steeringLock.writePending('CURRENT_CONTEXT.md', content, agentId);
|
|
242
|
+
// Creates: .kiro/steering/CURRENT_CONTEXT.md.pending.{agentId}
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### Merge Coordinator
|
|
246
|
+
|
|
247
|
+
Git branch isolation per agent for conflict-free parallel development.
|
|
248
|
+
|
|
249
|
+
**File**: `lib/collab/merge-coordinator.js`
|
|
250
|
+
|
|
251
|
+
```javascript
|
|
252
|
+
const { MergeCoordinator } = require('kiro-spec-engine/lib/collab');
|
|
253
|
+
const merger = new MergeCoordinator(workspaceRoot);
|
|
254
|
+
|
|
255
|
+
// Create agent-specific branch
|
|
256
|
+
const { branchName, created } = await merger.createAgentBranch(agentId, specName);
|
|
257
|
+
// branchName: "agent/a1b2c3d4e5f6:0/my-spec"
|
|
258
|
+
|
|
259
|
+
// Check for conflicts before merging
|
|
260
|
+
const { hasConflicts, files } = await merger.detectConflicts(branchName, 'main');
|
|
261
|
+
|
|
262
|
+
// Merge back to main
|
|
263
|
+
const result = await merger.merge(branchName, 'main');
|
|
264
|
+
// result.strategy: "fast-forward" | "merge-commit" | null (conflicts)
|
|
265
|
+
|
|
266
|
+
// Clean up merged branch
|
|
267
|
+
await merger.cleanupBranch(branchName);
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
**Branch naming**: `agent/{agentId}/{specName}`
|
|
271
|
+
|
|
272
|
+
### Central Coordinator (Optional)
|
|
273
|
+
|
|
274
|
+
When `coordinator: true` in config, provides intelligent task assignment based on dependency analysis.
|
|
275
|
+
|
|
276
|
+
**File**: `lib/collab/coordinator.js`
|
|
277
|
+
**Log**: `.kiro/config/coordination-log.json`
|
|
278
|
+
|
|
279
|
+
```javascript
|
|
280
|
+
const { Coordinator } = require('kiro-spec-engine/lib/collab');
|
|
281
|
+
const coordinator = new Coordinator(workspaceRoot, depManager, registry, lockManager);
|
|
282
|
+
|
|
283
|
+
// Get tasks ready to execute (dependencies satisfied, not locked)
|
|
284
|
+
const readyTasks = await coordinator.getReadyTasks(specName);
|
|
285
|
+
|
|
286
|
+
// Request a task assignment
|
|
287
|
+
const assignment = await coordinator.assignTask(agentId);
|
|
288
|
+
// assignment: { specName, taskId, task } or null
|
|
289
|
+
|
|
290
|
+
// Mark task complete (releases lock, computes newly ready tasks)
|
|
291
|
+
// v1.44.0: also auto-checks Spec completion via SpecLifecycleManager
|
|
292
|
+
const { newReadyTasks } = await coordinator.completeTask(specName, taskId, agentId);
|
|
293
|
+
|
|
294
|
+
// Get progress across all specs
|
|
295
|
+
const { specs, agents } = await coordinator.getProgress();
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### Spec-Level Steering (L4) — v1.44.0
|
|
299
|
+
|
|
300
|
+
Per-Spec `steering.md` providing independent constraints, notes, and decisions for each Spec. Eliminates cross-agent write conflicts on global steering files.
|
|
301
|
+
|
|
302
|
+
**File**: `lib/steering/spec-steering.js`
|
|
303
|
+
**Storage**: `.kiro/specs/{spec-name}/steering.md`
|
|
304
|
+
|
|
305
|
+
```javascript
|
|
306
|
+
const { SpecSteering } = require('kiro-spec-engine/lib/steering');
|
|
307
|
+
const specSteering = new SpecSteering(workspaceRoot);
|
|
308
|
+
|
|
309
|
+
// Create a steering template for a new Spec
|
|
310
|
+
await specSteering.createTemplate(specName, { description: 'My feature' });
|
|
311
|
+
|
|
312
|
+
// Read Spec-level steering
|
|
313
|
+
const steering = await specSteering.read(specName);
|
|
314
|
+
// steering: { specName, description, constraints: [], notes: [], decisions: [] }
|
|
315
|
+
|
|
316
|
+
// Write updated steering
|
|
317
|
+
await specSteering.write(specName, updatedSteering);
|
|
318
|
+
|
|
319
|
+
// Parse raw Markdown to structured object
|
|
320
|
+
const parsed = specSteering.parse(markdownContent);
|
|
321
|
+
|
|
322
|
+
// Format structured object back to Markdown
|
|
323
|
+
const markdown = specSteering.format(steeringObj);
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
### Steering Loader — v1.44.0
|
|
327
|
+
|
|
328
|
+
Unified loader that merges all four steering layers (L1-L4) into a single context.
|
|
329
|
+
|
|
330
|
+
**File**: `lib/steering/steering-loader.js`
|
|
331
|
+
|
|
332
|
+
```javascript
|
|
333
|
+
const { SteeringLoader } = require('kiro-spec-engine/lib/steering');
|
|
334
|
+
const loader = new SteeringLoader(workspaceRoot);
|
|
335
|
+
|
|
336
|
+
// Load a specific layer
|
|
337
|
+
const l1 = await loader.loadL1(); // CORE_PRINCIPLES.md
|
|
338
|
+
const l2 = await loader.loadL2(); // ENVIRONMENT.md
|
|
339
|
+
const l3 = await loader.loadL3(); // CURRENT_CONTEXT.md
|
|
340
|
+
const l4 = await loader.loadL4(specName); // specs/{specName}/steering.md
|
|
341
|
+
|
|
342
|
+
// Load all layers merged (L4 only in multi-agent mode)
|
|
343
|
+
const merged = await loader.loadMerged(specName);
|
|
344
|
+
// merged: { l1, l2, l3, l4, merged: "combined content" }
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
### Context Sync Manager — v1.44.0
|
|
348
|
+
|
|
349
|
+
Multi-agent friendly maintenance of `CURRENT_CONTEXT.md` with structured Spec progress table format.
|
|
350
|
+
|
|
351
|
+
**File**: `lib/steering/context-sync-manager.js`
|
|
352
|
+
|
|
353
|
+
```javascript
|
|
354
|
+
const { ContextSyncManager } = require('kiro-spec-engine/lib/steering');
|
|
355
|
+
const syncManager = new ContextSyncManager(workspaceRoot);
|
|
356
|
+
|
|
357
|
+
// Read current context
|
|
358
|
+
const context = await syncManager.readContext();
|
|
359
|
+
|
|
360
|
+
// Update Spec progress entry (SteeringFileLock-protected)
|
|
361
|
+
await syncManager.updateSpecProgress(specName, {
|
|
362
|
+
status: 'in-progress',
|
|
363
|
+
progress: '3/8 tasks',
|
|
364
|
+
agent: 'a1b2c3d4:0'
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
// Compute progress from tasks.md
|
|
368
|
+
const progress = await syncManager.computeProgress(specName);
|
|
369
|
+
// progress: { total: 8, completed: 3, percentage: 37.5 }
|
|
370
|
+
|
|
371
|
+
// Write full context (SteeringFileLock-protected)
|
|
372
|
+
await syncManager.writeContext(newContext);
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
### Spec Lifecycle Manager — v1.44.0
|
|
376
|
+
|
|
377
|
+
State machine managing Spec lifecycle transitions with auto-completion detection.
|
|
378
|
+
|
|
379
|
+
**File**: `lib/collab/spec-lifecycle-manager.js`
|
|
380
|
+
**Storage**: `.kiro/specs/{spec-name}/lifecycle.json`
|
|
381
|
+
|
|
382
|
+
Valid transitions: `planned → assigned → in-progress → completed → released`
|
|
383
|
+
|
|
384
|
+
```javascript
|
|
385
|
+
const { SpecLifecycleManager } = require('kiro-spec-engine/lib/collab');
|
|
386
|
+
const lifecycle = new SpecLifecycleManager(workspaceRoot);
|
|
387
|
+
|
|
388
|
+
// Get current Spec status
|
|
389
|
+
const status = await lifecycle.getStatus(specName);
|
|
390
|
+
// status: "planned" | "assigned" | "in-progress" | "completed" | "released"
|
|
391
|
+
|
|
392
|
+
// Transition to next state
|
|
393
|
+
await lifecycle.transition(specName, 'in-progress');
|
|
394
|
+
|
|
395
|
+
// Check if all tasks are completed (auto-transitions to "completed")
|
|
396
|
+
const isComplete = await lifecycle.checkCompletion(specName);
|
|
397
|
+
|
|
398
|
+
// Read full lifecycle data
|
|
399
|
+
const data = await lifecycle.readLifecycle(specName);
|
|
400
|
+
// data: { status, transitions: [...], completedAt, ... }
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
### Sync Barrier — v1.44.0
|
|
404
|
+
|
|
405
|
+
Ensures agents synchronize state before switching between Specs.
|
|
406
|
+
|
|
407
|
+
**File**: `lib/collab/sync-barrier.js`
|
|
408
|
+
|
|
409
|
+
```javascript
|
|
410
|
+
const { SyncBarrier } = require('kiro-spec-engine/lib/collab');
|
|
411
|
+
const barrier = new SyncBarrier(workspaceRoot);
|
|
412
|
+
|
|
413
|
+
// Check before switching Specs
|
|
414
|
+
const ready = await barrier.prepareSwitch(agentId, fromSpec, toSpec);
|
|
415
|
+
// Checks: uncommitted changes, reloads steering
|
|
416
|
+
|
|
417
|
+
// Check for uncommitted changes
|
|
418
|
+
const hasChanges = await barrier.hasUncommittedChanges();
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
---
|
|
422
|
+
|
|
423
|
+
## Typical Workflow
|
|
424
|
+
|
|
425
|
+
```
|
|
426
|
+
Agent A Agent B
|
|
427
|
+
│ │
|
|
428
|
+
├─ register() → agentId:0 ├─ register() → agentId:1
|
|
429
|
+
│ │
|
|
430
|
+
├─ acquireTaskLock(1.1) ✅ ├─ acquireTaskLock(1.1) ❌ (locked)
|
|
431
|
+
│ ├─ acquireTaskLock(1.2) ✅
|
|
432
|
+
│ │
|
|
433
|
+
├─ work on task 1.1 ├─ work on task 1.2
|
|
434
|
+
│ │
|
|
435
|
+
├─ releaseTaskLock(1.1) ├─ releaseTaskLock(1.2)
|
|
436
|
+
│ │
|
|
437
|
+
├─ acquireTaskLock(2.1) ✅ ├─ acquireTaskLock(2.2) ✅
|
|
438
|
+
│ ... │ ...
|
|
439
|
+
│ │
|
|
440
|
+
├─ deregister() ├─ deregister()
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
---
|
|
444
|
+
|
|
445
|
+
## Failure Recovery
|
|
446
|
+
|
|
447
|
+
### Agent Crashes
|
|
448
|
+
|
|
449
|
+
When an agent crashes without deregistering:
|
|
450
|
+
|
|
451
|
+
1. Its heartbeat stops updating
|
|
452
|
+
2. Another agent (or periodic cleanup) calls `registry.cleanupInactive()`
|
|
453
|
+
3. All locks held by the crashed agent are automatically released
|
|
454
|
+
4. Other agents can now claim those tasks
|
|
455
|
+
|
|
456
|
+
### File Write Conflicts
|
|
457
|
+
|
|
458
|
+
When two agents try to update `tasks.md` simultaneously:
|
|
459
|
+
|
|
460
|
+
1. TaskStatusStore uses file-level locking (`tasks.md.lock`)
|
|
461
|
+
2. The second writer detects the lock and retries with exponential backoff
|
|
462
|
+
3. Line-content validation ensures no silent overwrites
|
|
463
|
+
4. After 5 retries, returns a conflict error (original file preserved)
|
|
464
|
+
|
|
465
|
+
### Steering File Conflicts
|
|
466
|
+
|
|
467
|
+
When two agents try to update a steering file:
|
|
468
|
+
|
|
469
|
+
1. SteeringFileLock serializes writes
|
|
470
|
+
2. If lock cannot be acquired after 3 retries, the agent writes to a `.pending` file
|
|
471
|
+
3. The pending file can be manually merged later
|
|
472
|
+
|
|
473
|
+
### Git Merge Conflicts
|
|
474
|
+
|
|
475
|
+
When agent branches have conflicting changes:
|
|
476
|
+
|
|
477
|
+
1. `detectConflicts()` performs a dry-run merge to check
|
|
478
|
+
2. If conflicts exist, `merge()` returns the list of conflicting files
|
|
479
|
+
3. Conflicts must be resolved manually before merging
|
|
480
|
+
|
|
481
|
+
---
|
|
482
|
+
|
|
483
|
+
## Single-Agent Backward Compatibility
|
|
484
|
+
|
|
485
|
+
All components check `MultiAgentConfig.isEnabled()` before doing anything:
|
|
486
|
+
|
|
487
|
+
| Component | Single-Agent Behavior |
|
|
488
|
+
|-----------|----------------------|
|
|
489
|
+
| AgentRegistry | Not used |
|
|
490
|
+
| TaskLockManager | Delegates to existing LockManager |
|
|
491
|
+
| TaskStatusStore | Delegates to existing TaskClaimer (no lock, no retry) |
|
|
492
|
+
| SteeringFileLock | Not used |
|
|
493
|
+
| MergeCoordinator | Returns current branch, no branch creation |
|
|
494
|
+
| Coordinator | All methods return empty results |
|
|
495
|
+
|
|
496
|
+
**Zero overhead**: No extra file I/O, no lock files, no registry files.
|
|
497
|
+
|
|
498
|
+
---
|
|
499
|
+
|
|
500
|
+
## Configuration Reference
|
|
501
|
+
|
|
502
|
+
### `.kiro/config/multi-agent.json`
|
|
503
|
+
|
|
504
|
+
```json
|
|
505
|
+
{
|
|
506
|
+
"enabled": true,
|
|
507
|
+
"coordinator": false,
|
|
508
|
+
"heartbeatIntervalMs": 30000,
|
|
509
|
+
"heartbeatTimeoutMs": 120000
|
|
510
|
+
}
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
### File Locations
|
|
514
|
+
|
|
515
|
+
| File | Purpose |
|
|
516
|
+
|------|---------|
|
|
517
|
+
| `.kiro/config/multi-agent.json` | Multi-agent configuration |
|
|
518
|
+
| `.kiro/config/agent-registry.json` | Active agent registry |
|
|
519
|
+
| `.kiro/config/coordination-log.json` | Coordinator assignment log |
|
|
520
|
+
| `.kiro/specs/{spec}/locks/{taskId}.lock` | Task lock files |
|
|
521
|
+
| `.kiro/specs/{spec}/tasks.md.lock` | tasks.md file lock |
|
|
522
|
+
| `.kiro/specs/{spec}/steering.md` | Spec-level steering (L4) |
|
|
523
|
+
| `.kiro/specs/{spec}/lifecycle.json` | Spec lifecycle state |
|
|
524
|
+
| `.kiro/steering/{file}.lock` | Steering file locks |
|
|
525
|
+
| `.kiro/steering/{file}.pending.{agentId}` | Pending steering writes |
|
|
526
|
+
|
|
527
|
+
---
|
|
528
|
+
|
|
529
|
+
## API Reference
|
|
530
|
+
|
|
531
|
+
### Module Exports
|
|
532
|
+
|
|
533
|
+
```javascript
|
|
534
|
+
// Collaboration modules
|
|
535
|
+
const { AgentRegistry, Coordinator, MergeCoordinator, MultiAgentConfig, SpecLifecycleManager, SyncBarrier } = require('kiro-spec-engine/lib/collab');
|
|
536
|
+
|
|
537
|
+
// Steering modules
|
|
538
|
+
const { SpecSteering, SteeringLoader, ContextSyncManager } = require('kiro-spec-engine/lib/steering');
|
|
539
|
+
|
|
540
|
+
// Lock modules
|
|
541
|
+
const { TaskLockManager, SteeringFileLock } = require('kiro-spec-engine/lib/lock');
|
|
542
|
+
|
|
543
|
+
// Task modules
|
|
544
|
+
const { TaskStatusStore } = require('kiro-spec-engine/lib/task');
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
---
|
|
548
|
+
|
|
549
|
+
## Related Documentation
|
|
550
|
+
|
|
551
|
+
- [Spec-Level Collaboration Guide](spec-collaboration-guide.md) — Coordinate multiple Specs across AI instances
|
|
552
|
+
- [Spec Locking Guide](spec-locking-guide.md) — Single-agent Spec locking mechanism
|
|
553
|
+
- [Team Collaboration Guide](team-collaboration-guide.md) — Multi-user team workflows
|