claude-code-workflow 6.3.38 → 6.3.39
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/.codex/agents/ccw-loop-b-complete.md +227 -0
- package/.codex/agents/ccw-loop-b-debug.md +172 -0
- package/.codex/agents/ccw-loop-b-develop.md +147 -0
- package/.codex/agents/ccw-loop-b-init.md +82 -0
- package/.codex/agents/ccw-loop-b-validate.md +204 -0
- package/.codex/agents/ccw-loop-executor.md +4 -4
- package/.codex/prompts/clean.md +409 -0
- package/.codex/skills/ccw-loop/README.md +3 -3
- package/.codex/skills/ccw-loop/SKILL.md +16 -16
- package/.codex/skills/ccw-loop/phases/actions/action-complete.md +4 -4
- package/.codex/skills/ccw-loop/phases/actions/action-debug.md +3 -3
- package/.codex/skills/ccw-loop/phases/actions/action-develop.md +5 -5
- package/.codex/skills/ccw-loop/phases/actions/action-init.md +5 -5
- package/.codex/skills/ccw-loop/phases/actions/action-menu.md +2 -2
- package/.codex/skills/ccw-loop/phases/actions/action-validate.md +5 -5
- package/.codex/skills/ccw-loop/phases/orchestrator.md +6 -6
- package/.codex/skills/ccw-loop/phases/state-schema.md +11 -11
- package/.codex/skills/ccw-loop-b/README.md +260 -61
- package/.codex/skills/ccw-loop-b/SKILL.md +4 -4
- package/.codex/skills/ccw-loop-b/phases/orchestrator.md +2 -2
- package/.codex/skills/ccw-loop-b/phases/state-schema.md +3 -3
- package/.codex/skills/ccw-loop-b/specs/action-catalog.md +383 -0
- package/.codex/skills/parallel-dev-cycle/README.md +382 -0
- package/.codex/skills/parallel-dev-cycle/SKILL.md +512 -0
- package/.codex/skills/parallel-dev-cycle/phases/agents/code-developer.md +242 -0
- package/.codex/skills/parallel-dev-cycle/phases/agents/exploration-planner.md +285 -0
- package/.codex/skills/parallel-dev-cycle/phases/agents/requirements-analyst.md +285 -0
- package/.codex/skills/parallel-dev-cycle/phases/agents/validation-archivist.md +381 -0
- package/.codex/skills/parallel-dev-cycle/phases/orchestrator.md +696 -0
- package/.codex/skills/parallel-dev-cycle/phases/state-schema.md +436 -0
- package/.codex/skills/parallel-dev-cycle/specs/communication-optimization.md +423 -0
- package/.codex/skills/parallel-dev-cycle/specs/coordination-protocol.md +391 -0
- package/.codex/skills/parallel-dev-cycle/specs/versioning-strategy.md +330 -0
- package/ccw/dist/commands/install.js +1 -1
- package/ccw/dist/commands/install.js.map +1 -1
- package/ccw/dist/tools/claude-cli-tools.d.ts.map +1 -1
- package/ccw/dist/tools/claude-cli-tools.js +4 -3
- package/ccw/dist/tools/claude-cli-tools.js.map +1 -1
- package/ccw/dist/tools/cli-config-manager.d.ts +1 -0
- package/ccw/dist/tools/cli-config-manager.d.ts.map +1 -1
- package/ccw/dist/tools/cli-config-manager.js +2 -1
- package/ccw/dist/tools/cli-config-manager.js.map +1 -1
- package/ccw/src/commands/install.ts +1 -1
- package/ccw/src/tools/claude-cli-tools.ts +4 -3
- package/ccw/src/tools/cli-config-manager.ts +3 -1
- package/package.json +1 -1
|
@@ -27,8 +27,8 @@ Stateless iterative development loop using Codex subagent pattern. Supports deve
|
|
|
27
27
|
+-------------------------------------------------------------+
|
|
28
28
|
| loop-v2-routes.ts (Control Plane) |
|
|
29
29
|
| |
|
|
30
|
-
| State: .loop/{loopId}.json (MASTER) |
|
|
31
|
-
| Tasks: .loop/{loopId}.tasks.jsonl |
|
|
30
|
+
| State: .workflow/.loop/{loopId}.json (MASTER) |
|
|
31
|
+
| Tasks: .workflow/.loop/{loopId}.tasks.jsonl |
|
|
32
32
|
| |
|
|
33
33
|
| /start -> Trigger ccw-loop skill with --loop-id |
|
|
34
34
|
| /pause -> Set status='paused' (skill checks before action) |
|
|
@@ -42,8 +42,8 @@ Stateless iterative development loop using Codex subagent pattern. Supports deve
|
|
|
42
42
|
| |
|
|
43
43
|
| Codex Pattern: spawn_agent -> wait -> send_input -> close |
|
|
44
44
|
| |
|
|
45
|
-
| Reads/Writes: .loop/{loopId}.json (unified state) |
|
|
46
|
-
| Writes: .loop/{loopId}.progress/* (progress files) |
|
|
45
|
+
| Reads/Writes: .workflow/.loop/{loopId}.json (unified state) |
|
|
46
|
+
| Writes: .workflow/.loop/{loopId}.progress/* (progress files) |
|
|
47
47
|
| |
|
|
48
48
|
| BEFORE each action: |
|
|
49
49
|
| -> Check status: paused/stopped -> exit gracefully |
|
|
@@ -55,9 +55,9 @@ Stateless iterative development loop using Codex subagent pattern. Supports deve
|
|
|
55
55
|
|
|
56
56
|
## Key Design Principles (Codex Adaptation)
|
|
57
57
|
|
|
58
|
-
1. **Unified State**: API and Skill share `.loop/{loopId}.json` state file
|
|
58
|
+
1. **Unified State**: API and Skill share `.workflow/.loop/{loopId}.json` state file
|
|
59
59
|
2. **Control Signals**: Skill checks status field before each action (paused/stopped)
|
|
60
|
-
3. **File-Driven**: All progress documented in `.loop/{loopId}.progress/`
|
|
60
|
+
3. **File-Driven**: All progress documented in `.workflow/.loop/{loopId}.progress/`
|
|
61
61
|
4. **Resumable**: Continue any loop with `--loop-id`
|
|
62
62
|
5. **Dual Trigger**: Supports API trigger (`--loop-id`) and direct call (task description)
|
|
63
63
|
6. **Single Agent Deep Interaction**: Use send_input for multi-phase execution instead of multiple agents
|
|
@@ -100,7 +100,7 @@ Develop -> Debug -> Validate -> (if issues) -> Develop -> ...
|
|
|
100
100
|
## Session Structure (Unified Location)
|
|
101
101
|
|
|
102
102
|
```
|
|
103
|
-
.loop/
|
|
103
|
+
.workflow/.loop/
|
|
104
104
|
+-- {loopId}.json # Master state file (API + Skill shared)
|
|
105
105
|
+-- {loopId}.tasks.jsonl # Task list (API managed)
|
|
106
106
|
+-- {loopId}.progress/ # Skill progress files
|
|
@@ -129,8 +129,8 @@ const loopId = args['--loop-id'] || (() => {
|
|
|
129
129
|
return `loop-v2-${timestamp}-${random}`
|
|
130
130
|
})()
|
|
131
131
|
|
|
132
|
-
const loopFile = `.loop/${loopId}.json`
|
|
133
|
-
const progressDir = `.loop/${loopId}.progress`
|
|
132
|
+
const loopFile = `.workflow/.loop/${loopId}.json`
|
|
133
|
+
const progressDir = `.workflow/.loop/${loopId}.progress`
|
|
134
134
|
|
|
135
135
|
// Create progress directory
|
|
136
136
|
mkdir -p "${progressDir}"
|
|
@@ -144,14 +144,14 @@ mkdir -p "${progressDir}"
|
|
|
144
144
|
// Step 1: Read or create initial state
|
|
145
145
|
let state = null
|
|
146
146
|
if (existingLoopId) {
|
|
147
|
-
state = JSON.parse(Read(`.loop/${loopId}.json`))
|
|
147
|
+
state = JSON.parse(Read(`.workflow/.loop/${loopId}.json`))
|
|
148
148
|
if (!state) {
|
|
149
149
|
console.error(`Loop not found: ${loopId}`)
|
|
150
150
|
return
|
|
151
151
|
}
|
|
152
152
|
} else {
|
|
153
153
|
state = createInitialState(loopId, taskDescription)
|
|
154
|
-
Write(`.loop/${loopId}.json`, JSON.stringify(state, null, 2))
|
|
154
|
+
Write(`.workflow/.loop/${loopId}.json`, JSON.stringify(state, null, 2))
|
|
155
155
|
}
|
|
156
156
|
|
|
157
157
|
// Step 2: Create orchestrator agent (single agent handles all phases)
|
|
@@ -169,7 +169,7 @@ const agent = spawn_agent({
|
|
|
169
169
|
## LOOP CONTEXT
|
|
170
170
|
|
|
171
171
|
- **Loop ID**: ${loopId}
|
|
172
|
-
- **State File**: .loop/${loopId}.json
|
|
172
|
+
- **State File**: .workflow/.loop/${loopId}.json
|
|
173
173
|
- **Progress Dir**: ${progressDir}
|
|
174
174
|
- **Mode**: ${mode} // 'interactive' or 'auto'
|
|
175
175
|
|
|
@@ -186,7 +186,7 @@ ${taskDescription}
|
|
|
186
186
|
You are executing CCW Loop orchestrator. Your job:
|
|
187
187
|
|
|
188
188
|
1. **Check Control Signals**
|
|
189
|
-
- Read .loop/${loopId}.json
|
|
189
|
+
- Read .workflow/.loop/${loopId}.json
|
|
190
190
|
- If status === 'paused' -> Output "PAUSED" and stop
|
|
191
191
|
- If status === 'failed' -> Output "STOPPED" and stop
|
|
192
192
|
- If status === 'running' -> Continue
|
|
@@ -200,7 +200,7 @@ You are executing CCW Loop orchestrator. Your job:
|
|
|
200
200
|
3. **Execute Action**
|
|
201
201
|
- Follow action instructions from ~/.codex/skills/ccw-loop/phases/actions/
|
|
202
202
|
- Update progress files in ${progressDir}/
|
|
203
|
-
- Update state in .loop/${loopId}.json
|
|
203
|
+
- Update state in .workflow/.loop/${loopId}.json
|
|
204
204
|
|
|
205
205
|
4. **Output Format**
|
|
206
206
|
\`\`\`
|
|
@@ -283,10 +283,10 @@ Continue with: ${actionResult.next_action}
|
|
|
283
283
|
}
|
|
284
284
|
|
|
285
285
|
// Update iteration count in state
|
|
286
|
-
const currentState = JSON.parse(Read(`.loop/${loopId}.json`))
|
|
286
|
+
const currentState = JSON.parse(Read(`.workflow/.loop/${loopId}.json`))
|
|
287
287
|
currentState.current_iteration = iteration
|
|
288
288
|
currentState.updated_at = getUtc8ISOString()
|
|
289
|
-
Write(`.loop/${loopId}.json`, JSON.stringify(currentState, null, 2))
|
|
289
|
+
Write(`.workflow/.loop/${loopId}.json`, JSON.stringify(currentState, null, 2))
|
|
290
290
|
}
|
|
291
291
|
|
|
292
292
|
// Step 4: Cleanup
|
|
@@ -20,7 +20,7 @@ Complete CCW Loop session and generate summary report.
|
|
|
20
20
|
### Step 1: Verify Control Signals
|
|
21
21
|
|
|
22
22
|
```javascript
|
|
23
|
-
const state = JSON.parse(Read(`.loop/${loopId}.json`))
|
|
23
|
+
const state = JSON.parse(Read(`.workflow/.loop/${loopId}.json`))
|
|
24
24
|
|
|
25
25
|
if (state.status !== 'running') {
|
|
26
26
|
return {
|
|
@@ -174,7 +174,7 @@ state.updated_at = timestamp
|
|
|
174
174
|
state.skill_state.last_action = 'COMPLETE'
|
|
175
175
|
state.skill_state.summary = stats
|
|
176
176
|
|
|
177
|
-
Write(`.loop/${loopId}.json`, JSON.stringify(state, null, 2))
|
|
177
|
+
Write(`.workflow/.loop/${loopId}.json`, JSON.stringify(state, null, 2))
|
|
178
178
|
```
|
|
179
179
|
|
|
180
180
|
## Output Format
|
|
@@ -190,8 +190,8 @@ ACTION_RESULT:
|
|
|
190
190
|
}
|
|
191
191
|
|
|
192
192
|
FILES_UPDATED:
|
|
193
|
-
- .loop/{loopId}.json: Status set to completed
|
|
194
|
-
- .loop/{loopId}.progress/summary.md: Summary report generated
|
|
193
|
+
- .workflow/.loop/{loopId}.json: Status set to completed
|
|
194
|
+
- .workflow/.loop/{loopId}.progress/summary.md: Summary report generated
|
|
195
195
|
|
|
196
196
|
NEXT_ACTION_NEEDED: COMPLETED
|
|
197
197
|
```
|
|
@@ -233,7 +233,7 @@ if (confirmedHypothesis) {
|
|
|
233
233
|
|
|
234
234
|
state.skill_state.last_action = 'DEBUG'
|
|
235
235
|
state.updated_at = timestamp
|
|
236
|
-
Write(`.loop/${loopId}.json`, JSON.stringify(state, null, 2))
|
|
236
|
+
Write(`.workflow/.loop/${loopId}.json`, JSON.stringify(state, null, 2))
|
|
237
237
|
```
|
|
238
238
|
|
|
239
239
|
## Output Format
|
|
@@ -249,8 +249,8 @@ ACTION_RESULT:
|
|
|
249
249
|
}
|
|
250
250
|
|
|
251
251
|
FILES_UPDATED:
|
|
252
|
-
- .loop/{loopId}.progress/debug.md: Understanding updated
|
|
253
|
-
- .loop/{loopId}.progress/hypotheses.json: Hypotheses updated
|
|
252
|
+
- .workflow/.loop/{loopId}.progress/debug.md: Understanding updated
|
|
253
|
+
- .workflow/.loop/{loopId}.progress/hypotheses.json: Hypotheses updated
|
|
254
254
|
- [Source files]: Instrumentation added
|
|
255
255
|
|
|
256
256
|
NEXT_ACTION_NEEDED: {DEBUG | VALIDATE | DEVELOP | MENU}
|
|
@@ -20,7 +20,7 @@ Execute development task and record progress to develop.md.
|
|
|
20
20
|
### Step 1: Verify Control Signals
|
|
21
21
|
|
|
22
22
|
```javascript
|
|
23
|
-
const state = JSON.parse(Read(`.loop/${loopId}.json`))
|
|
23
|
+
const state = JSON.parse(Read(`.workflow/.loop/${loopId}.json`))
|
|
24
24
|
|
|
25
25
|
if (state.status !== 'running') {
|
|
26
26
|
return {
|
|
@@ -133,7 +133,7 @@ state.skill_state.last_action = 'DEVELOP'
|
|
|
133
133
|
state.skill_state.completed_actions.push('DEVELOP')
|
|
134
134
|
state.updated_at = timestamp
|
|
135
135
|
|
|
136
|
-
Write(`.loop/${loopId}.json`, JSON.stringify(state, null, 2))
|
|
136
|
+
Write(`.workflow/.loop/${loopId}.json`, JSON.stringify(state, null, 2))
|
|
137
137
|
```
|
|
138
138
|
|
|
139
139
|
## Output Format
|
|
@@ -149,9 +149,9 @@ ACTION_RESULT:
|
|
|
149
149
|
}
|
|
150
150
|
|
|
151
151
|
FILES_UPDATED:
|
|
152
|
-
- .loop/{loopId}.json: Task status updated
|
|
153
|
-
- .loop/{loopId}.progress/develop.md: Progress entry added
|
|
154
|
-
- .loop/{loopId}.progress/changes.log: Change entry added
|
|
152
|
+
- .workflow/.loop/{loopId}.json: Task status updated
|
|
153
|
+
- .workflow/.loop/{loopId}.progress/develop.md: Progress entry added
|
|
154
|
+
- .workflow/.loop/{loopId}.progress/changes.log: Change entry added
|
|
155
155
|
|
|
156
156
|
NEXT_ACTION_NEEDED: {DEVELOP | DEBUG | VALIDATE | MENU}
|
|
157
157
|
```
|
|
@@ -19,7 +19,7 @@ Initialize CCW Loop session, create directory structure and initial state.
|
|
|
19
19
|
### Step 1: Verify Control Signals
|
|
20
20
|
|
|
21
21
|
```javascript
|
|
22
|
-
const state = JSON.parse(Read(`.loop/${loopId}.json`))
|
|
22
|
+
const state = JSON.parse(Read(`.workflow/.loop/${loopId}.json`))
|
|
23
23
|
|
|
24
24
|
if (state.status !== 'running') {
|
|
25
25
|
return {
|
|
@@ -34,7 +34,7 @@ if (state.status !== 'running') {
|
|
|
34
34
|
### Step 2: Create Directory Structure
|
|
35
35
|
|
|
36
36
|
```javascript
|
|
37
|
-
const progressDir = `.loop/${loopId}.progress`
|
|
37
|
+
const progressDir = `.workflow/.loop/${loopId}.progress`
|
|
38
38
|
|
|
39
39
|
// Directories created by orchestrator, verify they exist
|
|
40
40
|
// mkdir -p ${progressDir}
|
|
@@ -131,7 +131,7 @@ const skillState = {
|
|
|
131
131
|
|
|
132
132
|
state.skill_state = skillState
|
|
133
133
|
state.updated_at = getUtc8ISOString()
|
|
134
|
-
Write(`.loop/${loopId}.json`, JSON.stringify(state, null, 2))
|
|
134
|
+
Write(`.workflow/.loop/${loopId}.json`, JSON.stringify(state, null, 2))
|
|
135
135
|
```
|
|
136
136
|
|
|
137
137
|
## Output Format
|
|
@@ -143,8 +143,8 @@ ACTION_RESULT:
|
|
|
143
143
|
- message: Session initialized with {N} development tasks
|
|
144
144
|
|
|
145
145
|
FILES_UPDATED:
|
|
146
|
-
- .loop/{loopId}.json: skill_state initialized
|
|
147
|
-
- .loop/{loopId}.progress/develop.md: Progress document created
|
|
146
|
+
- .workflow/.loop/{loopId}.json: skill_state initialized
|
|
147
|
+
- .workflow/.loop/{loopId}.progress/develop.md: Progress document created
|
|
148
148
|
|
|
149
149
|
NEXT_ACTION_NEEDED: {DEVELOP (auto) | MENU (interactive)}
|
|
150
150
|
```
|
|
@@ -20,7 +20,7 @@ Display interactive action menu for user selection.
|
|
|
20
20
|
### Step 1: Verify Control Signals
|
|
21
21
|
|
|
22
22
|
```javascript
|
|
23
|
-
const state = JSON.parse(Read(`.loop/${loopId}.json`))
|
|
23
|
+
const state = JSON.parse(Read(`.workflow/.loop/${loopId}.json`))
|
|
24
24
|
|
|
25
25
|
if (state.status !== 'running') {
|
|
26
26
|
return {
|
|
@@ -172,7 +172,7 @@ If user selects "exit":
|
|
|
172
172
|
// Save current state
|
|
173
173
|
state.status = 'user_exit'
|
|
174
174
|
state.updated_at = getUtc8ISOString()
|
|
175
|
-
Write(`.loop/${loopId}.json`, JSON.stringify(state, null, 2))
|
|
175
|
+
Write(`.workflow/.loop/${loopId}.json`, JSON.stringify(state, null, 2))
|
|
176
176
|
|
|
177
177
|
return {
|
|
178
178
|
action: 'MENU',
|
|
@@ -21,7 +21,7 @@ Run tests and verify implementation, record results to validate.md.
|
|
|
21
21
|
### Step 1: Verify Control Signals
|
|
22
22
|
|
|
23
23
|
```javascript
|
|
24
|
-
const state = JSON.parse(Read(`.loop/${loopId}.json`))
|
|
24
|
+
const state = JSON.parse(Read(`.workflow/.loop/${loopId}.json`))
|
|
25
25
|
|
|
26
26
|
if (state.status !== 'running') {
|
|
27
27
|
return {
|
|
@@ -174,7 +174,7 @@ state.skill_state.validate.last_run_at = timestamp
|
|
|
174
174
|
|
|
175
175
|
state.skill_state.last_action = 'VALIDATE'
|
|
176
176
|
state.updated_at = timestamp
|
|
177
|
-
Write(`.loop/${loopId}.json`, JSON.stringify(state, null, 2))
|
|
177
|
+
Write(`.workflow/.loop/${loopId}.json`, JSON.stringify(state, null, 2))
|
|
178
178
|
```
|
|
179
179
|
|
|
180
180
|
## Output Format
|
|
@@ -191,9 +191,9 @@ ACTION_RESULT:
|
|
|
191
191
|
}
|
|
192
192
|
|
|
193
193
|
FILES_UPDATED:
|
|
194
|
-
- .loop/{loopId}.progress/validate.md: Validation report created
|
|
195
|
-
- .loop/{loopId}.progress/test-results.json: Test results saved
|
|
196
|
-
- .loop/{loopId}.progress/coverage.json: Coverage data saved (if available)
|
|
194
|
+
- .workflow/.loop/{loopId}.progress/validate.md: Validation report created
|
|
195
|
+
- .workflow/.loop/{loopId}.progress/test-results.json: Test results saved
|
|
196
|
+
- .workflow/.loop/{loopId}.progress/coverage.json: Coverage data saved (if available)
|
|
197
197
|
|
|
198
198
|
NEXT_ACTION_NEEDED: {COMPLETE | DEBUG | DEVELOP | MENU}
|
|
199
199
|
```
|
|
@@ -45,7 +45,7 @@ const getUtc8ISOString = () => new Date(Date.now() + 8 * 60 * 60 * 1000).toISOSt
|
|
|
45
45
|
* @param loopId - Loop ID (e.g., "loop-v2-20260122-abc123")
|
|
46
46
|
*/
|
|
47
47
|
function readLoopState(loopId) {
|
|
48
|
-
const stateFile = `.loop/${loopId}.json`
|
|
48
|
+
const stateFile = `.workflow/.loop/${loopId}.json`
|
|
49
49
|
|
|
50
50
|
if (!fs.existsSync(stateFile)) {
|
|
51
51
|
return null
|
|
@@ -63,7 +63,7 @@ function readLoopState(loopId) {
|
|
|
63
63
|
* Create new loop state (only for direct calls, API triggers have existing state)
|
|
64
64
|
*/
|
|
65
65
|
function createLoopState(loopId, taskDescription) {
|
|
66
|
-
const stateFile = `.loop/${loopId}.json`
|
|
66
|
+
const stateFile = `.workflow/.loop/${loopId}.json`
|
|
67
67
|
const now = getUtc8ISOString()
|
|
68
68
|
|
|
69
69
|
const state = {
|
|
@@ -83,7 +83,7 @@ function createLoopState(loopId, taskDescription) {
|
|
|
83
83
|
|
|
84
84
|
// Ensure directories exist
|
|
85
85
|
mkdir -p ".loop"
|
|
86
|
-
mkdir -p ".loop/${loopId}.progress"
|
|
86
|
+
mkdir -p ".workflow/.loop/${loopId}.progress"
|
|
87
87
|
|
|
88
88
|
Write(stateFile, JSON.stringify(state, null, 2))
|
|
89
89
|
return state
|
|
@@ -137,7 +137,7 @@ async function runOrchestrator(options = {}) {
|
|
|
137
137
|
return { status: 'error', message: 'Missing loopId or task' }
|
|
138
138
|
}
|
|
139
139
|
|
|
140
|
-
const progressDir = `.loop/${loopId}.progress`
|
|
140
|
+
const progressDir = `.workflow/.loop/${loopId}.progress`
|
|
141
141
|
|
|
142
142
|
// 2. Create executor agent (single agent for entire loop)
|
|
143
143
|
const agent = spawn_agent({
|
|
@@ -154,7 +154,7 @@ async function runOrchestrator(options = {}) {
|
|
|
154
154
|
## LOOP CONTEXT
|
|
155
155
|
|
|
156
156
|
- **Loop ID**: ${loopId}
|
|
157
|
-
- **State File**: .loop/${loopId}.json
|
|
157
|
+
- **State File**: .workflow/.loop/${loopId}.json
|
|
158
158
|
- **Progress Dir**: ${progressDir}
|
|
159
159
|
- **Mode**: ${mode}
|
|
160
160
|
|
|
@@ -213,7 +213,7 @@ Execution timeout reached. Please:
|
|
|
213
213
|
state = readLoopState(loopId)
|
|
214
214
|
state.current_iteration = iteration
|
|
215
215
|
state.updated_at = getUtc8ISOString()
|
|
216
|
-
Write(`.loop/${loopId}.json`, JSON.stringify(state, null, 2))
|
|
216
|
+
Write(`.workflow/.loop/${loopId}.json`, JSON.stringify(state, null, 2))
|
|
217
217
|
|
|
218
218
|
// Handle different outcomes
|
|
219
219
|
switch (actionResult.next_action) {
|
|
@@ -4,7 +4,7 @@ CCW Loop state structure definition for Codex subagent pattern.
|
|
|
4
4
|
|
|
5
5
|
## State File
|
|
6
6
|
|
|
7
|
-
**Location**: `.loop/{loopId}.json` (unified location, API + Skill shared)
|
|
7
|
+
**Location**: `.workflow/.loop/{loopId}.json` (unified location, API + Skill shared)
|
|
8
8
|
|
|
9
9
|
## Structure Definition
|
|
10
10
|
|
|
@@ -208,7 +208,7 @@ Agent checks control signals at start of every action:
|
|
|
208
208
|
* @returns { continue: boolean, action: 'pause_exit' | 'stop_exit' | 'continue' }
|
|
209
209
|
*/
|
|
210
210
|
function checkControlSignals(loopId) {
|
|
211
|
-
const state = JSON.parse(Read(`.loop/${loopId}.json`))
|
|
211
|
+
const state = JSON.parse(Read(`.workflow/.loop/${loopId}.json`))
|
|
212
212
|
|
|
213
213
|
switch (state.status) {
|
|
214
214
|
case 'paused':
|
|
@@ -338,17 +338,17 @@ State-to-file mapping:
|
|
|
338
338
|
|
|
339
339
|
| State Field | Sync File | Sync Timing |
|
|
340
340
|
|-------------|-----------|-------------|
|
|
341
|
-
| Entire LoopState | `.loop/{loopId}.json` | Every state change (master) |
|
|
342
|
-
| `skill_state.develop` | `.loop/{loopId}.progress/develop.md` | After each dev operation |
|
|
343
|
-
| `skill_state.debug` | `.loop/{loopId}.progress/debug.md` | After each debug operation |
|
|
344
|
-
| `skill_state.validate` | `.loop/{loopId}.progress/validate.md` | After each validation |
|
|
345
|
-
| Code changes log | `.loop/{loopId}.progress/changes.log` | Each file modification (NDJSON) |
|
|
346
|
-
| Debug log | `.loop/{loopId}.progress/debug.log` | Each debug log (NDJSON) |
|
|
341
|
+
| Entire LoopState | `.workflow/.loop/{loopId}.json` | Every state change (master) |
|
|
342
|
+
| `skill_state.develop` | `.workflow/.loop/{loopId}.progress/develop.md` | After each dev operation |
|
|
343
|
+
| `skill_state.debug` | `.workflow/.loop/{loopId}.progress/debug.md` | After each debug operation |
|
|
344
|
+
| `skill_state.validate` | `.workflow/.loop/{loopId}.progress/validate.md` | After each validation |
|
|
345
|
+
| Code changes log | `.workflow/.loop/{loopId}.progress/changes.log` | Each file modification (NDJSON) |
|
|
346
|
+
| Debug log | `.workflow/.loop/{loopId}.progress/debug.log` | Each debug log (NDJSON) |
|
|
347
347
|
|
|
348
348
|
### File Structure
|
|
349
349
|
|
|
350
350
|
```
|
|
351
|
-
.loop/
|
|
351
|
+
.workflow/.loop/
|
|
352
352
|
+-- loop-v2-20260122-abc123.json # Master state file (API + Skill)
|
|
353
353
|
+-- loop-v2-20260122-abc123.tasks.jsonl # Task list (API managed)
|
|
354
354
|
+-- loop-v2-20260122-abc123.progress/ # Skill progress files
|
|
@@ -366,7 +366,7 @@ If master state file corrupted, rebuild skill_state from progress files:
|
|
|
366
366
|
|
|
367
367
|
```javascript
|
|
368
368
|
function rebuildSkillStateFromProgress(loopId) {
|
|
369
|
-
const progressDir = `.loop/${loopId}.progress`
|
|
369
|
+
const progressDir = `.workflow/.loop/${loopId}.progress`
|
|
370
370
|
|
|
371
371
|
// Parse progress files to rebuild state
|
|
372
372
|
const skill_state = {
|
|
@@ -381,7 +381,7 @@ function rebuildSkillStateFromProgress(loopId) {
|
|
|
381
381
|
|
|
382
382
|
## Codex Pattern Notes
|
|
383
383
|
|
|
384
|
-
1. **Agent reads state**: Agent reads `.loop/{loopId}.json` at action start
|
|
384
|
+
1. **Agent reads state**: Agent reads `.workflow/.loop/{loopId}.json` at action start
|
|
385
385
|
2. **Agent writes state**: Agent updates state after action completion
|
|
386
386
|
3. **Orchestrator tracks iterations**: Main loop tracks `current_iteration`
|
|
387
387
|
4. **Single agent context**: All state updates in same agent conversation via send_input
|