agent-step-gate 0.3.0 โ†’ 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -13,6 +13,38 @@ It only maintains an external execution ledger and verifies that planned steps h
13
13
 
14
14
  ---
15
15
 
16
+ ## ๐Ÿš€ Quick Start
17
+
18
+ ```bash
19
+ # Install globally
20
+ npm install -g agent-step-gate
21
+
22
+ # Create a task with steps
23
+ step-gate start-plan '{
24
+ "title":"Refactor auth module",
25
+ "steps":[
26
+ {"id":"extract","title":"Extract middleware","dependsOn":[]},
27
+ {"id":"jwt","title":"Add JWT validation","dependsOn":[]},
28
+ {"id":"routes","title":"Update routes","dependsOn":["extract","jwt"]},
29
+ {"id":"test","title":"Write tests","dependsOn":["routes"]}
30
+ ]
31
+ }'
32
+ # โ†’ Returns taskId + stepKeys for unlocked steps
33
+
34
+ # Complete a step (unlocks downstream)
35
+ step-gate checkpoint '{"taskId":"tsk_XXX","stepId":"tsk_XXX_extract","stepKey":"K8F2QZ"}'
36
+ # โ†’ Returns nextSteps + nextStepKeys
37
+
38
+ # Finalize when all steps are done
39
+ step-gate finalize '{"taskId":"tsk_XXX","taskKey":"A1B2C3"}'
40
+ ```
41
+
42
+ **One interaction = One Task.** Create a task, checkpoint each step, finalize. The external ledger ensures nothing is skipped.
43
+
44
+ For multi-session projects, see [Program mode](#program-level-usage). For multi-agent orchestration, see [Weaver.md](Weaver.md).
45
+
46
+ ---
47
+
16
48
  ## โ“ Why
17
49
 
18
50
  Long-context agents are capable, but they often miss steps in long-running tasks.
package/SKILL.md CHANGED
@@ -185,6 +185,3 @@ The CLI auto-discovers the session from binding files. No manual session managem
185
185
  - `Weaver.md` โ€” Multi-agent orchestration: how a Main Agent spawns Sub Agents, injects
186
186
  taskId + stepKey, and verifies returned taskKeys. Read this before orchestrating
187
187
  parallel Sub Agents.
188
- - `ARCHITECTURE.md` โ€” Full architecture: 4-layer model, 7 DB tables, 5 credential types,
189
- 12 CLI commands, 20+ core functions
190
- - `docs/security-stress-test-report.md` โ€” Security audit: 9 issues, all resolved
package/Weaver.md CHANGED
@@ -1,140 +1,145 @@
1
- # Weaver โ€” Step Gate ็ผ–ๆŽ’ๅผ•ๆ“Ž
1
+ # Weaver โ€” Multi-Agent Orchestration Protocol
2
2
 
3
- ## ไธ‰ๅฑ‚่ง’่‰ฒ
3
+ ## Role model
4
4
 
5
5
  ```
6
- Main Agent (็ผ–ๆŽ’่€…) โ† ๆŒๆœ‰ Node/Program ๅ…จๅฑ€่ง†่ง’
7
- โ”‚ ๅชๅšไธ‰ไปถไบ‹: ๆดพๅ‘ใ€ๆ ก้ชŒใ€ๆŽจ่ฟ›
8
- โ”‚ ไธๅ†™ไปฃ็ ใ€ไธๆ‰ง่กŒ Step
6
+ Main Agent (orchestrator)
7
+ โ”‚ Only three jobs: dispatch, verify, advance
8
+ โ”‚ Never writes code, never executes steps
9
9
  โ”‚
10
- โ”œโ”€โ”€ Sub Agent A โ† ๅช็Ÿฅ้“่‡ชๅทฑ็š„ taskId + taskGoal
11
- โ”œโ”€โ”€ Sub Agent B โ† ไธ็Ÿฅ้“ๅ…ถไป– Taskใ€ไธ็Ÿฅ้“ DAG
12
- โ””โ”€โ”€ Sub Agent C โ† ไธ็Ÿฅ้“ Node/Program ๅ…จๅฑ€
10
+ โ”œโ”€โ”€ Sub Agent A Knows: taskId + taskGoal + its stepKeys
11
+ โ”œโ”€โ”€ Sub Agent B Does NOT know: full DAG, other tasks, Node/Program
12
+ โ””โ”€โ”€ Sub Agent C Does NOT know: validation logic (the Gate handles it)
13
13
  ```
14
14
 
15
- Sub Agent ็š„ไธŠไธ‹ๆ–‡็”ฑ Main Agent ๅœจ Spawn ๆ—ถ็ฒพ็กฎๆณจๅ…ฅใ€‚็œ‹ไธๅˆฐๅ…จๅฑ€่ฎกๅˆ’๏ผŒไธ็Ÿฅ้“ๅ‰ๅŽ Task๏ผŒไธๆŒๆœ‰้ชŒ่ฏ้€ป่พ‘ใ€‚
15
+ The Main Agent injects precisely what each Sub Agent needs. No more, no less.
16
+
17
+ ## Protocol: what gets passed
18
+
19
+ ### Main Agent โ†’ Sub Agent (dispatch)
20
+
21
+ ```json
22
+ {
23
+ "taskId": "tsk_XXXXXX",
24
+ "taskGoal": "Extract auth middleware into a standalone module",
25
+ "stepKeys": {
26
+ "tsk_XXXXXX_extract": "K8F2QZ"
27
+ },
28
+ "constraints": [
29
+ "Only work on this task's scope",
30
+ "Run step-gate checkpoint after each step",
31
+ "Return the taskKey when all steps are done"
32
+ ]
33
+ }
34
+ ```
35
+
36
+ Critical: `stepKeys` contains the keys for currently-unlocked steps. The Sub Agent
37
+ needs these to call `checkpoint`. Without them, it can't advance. The Main Agent
38
+ gets them from the `start-plan` or `checkpoint` response.
16
39
 
17
- ## ๅฎŒๆ•ดๆ‰ง่กŒๆต็จ‹
40
+ ### Sub Agent โ†’ Main Agent (return)
18
41
 
42
+ ```json
43
+ {
44
+ "taskId": "tsk_XXXXXX",
45
+ "taskKey": "A1B2C3",
46
+ "summary": "Extracted auth middleware to src/middleware/auth.ts",
47
+ "artifacts": ["src/middleware/auth.ts", "src/middleware/index.ts"]
48
+ }
19
49
  ```
20
- โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
21
- Phase 0 โ€” ่ง„ๅˆ’
22
- โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
23
- Main Agent:
24
- program init โ†’ ๆ‹†ๅˆ† Node
25
- reconcile โ†’ ๆ—ฅๅธธ่ฏŠๆ–ญ
26
50
 
27
- โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
28
- Phase 1 โ€” ๅฏๅŠจ Node
29
- โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
30
- Main Agent:
31
- program start <node-id> โ† ็ป‘ๅฎš session ๅˆฐ node
32
- start-plan โ†’ ๅˆ›ๅปบ Task(DAG) โ† ไธ€ๆฌกไบคไบ’ = ไธ€ไธช Task
33
- โ†’ ๆ‹ฟๅˆฐ taskId + stepKeys
34
-
35
- โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
36
- Phase 2 โ€” ๆดพๅ‘
37
- โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
38
- Main Agent โ†’ Sub Agent:
39
- {
40
- "taskId": "tsk_XXX",
41
- "taskGoal": "ๆŠฝ็ฆป่ฎค่ฏไธญ้—ดไปถ",
42
- "constraints": ["ๅชๅค„็†ๆœฌTask่Œƒๅ›ด", "ๅฎŒๆˆๅŽ่ฐƒcheckpoint"]
43
- }
44
-
45
- Sub Agent ๅœจๅŒไธ€ๅทฅไฝœ็›ฎๅฝ•ๅฏๅŠจ:
46
- โ†’ ensureSession() ่‡ชๅŠจไปŽ .step-gate/bindings/ ๅ‘็Žฐ session
47
- โ†’ ๆ— ้œ€ๆ‰‹ๅŠจไผ  sessionId
48
-
49
- โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
50
- Phase 3 โ€” Sub Agent ๆ‰ง่กŒๅพช็Žฏ
51
- โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
52
- Sub Agent:
53
- current(taskId)
54
- โ†’ { currentSteps, stepKeys }
55
-
56
- for each step:
57
- ๆ‰ง่กŒ step
58
- checkpoint(taskId, stepId, stepKey)
59
- โ†’ { nextSteps, nextStepKeys }
60
- โ†’ ๆˆ– { allStepsCompleted: true, taskKey }
61
-
62
- โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
63
- Phase 4 โ€” ไบคๅ›žๅ‡ญ่ฏ
64
- โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
65
- Sub Agent โ†’ Main Agent:
66
- {
67
- "taskId": "tsk_XXX",
68
- "taskKey": "A1B2C3",
69
- "summary": "ๅฎŒๆˆ่ฎค่ฏไธญ้—ดไปถๆŠฝ็ฆป",
70
- "artifacts": ["src/middleware/auth.ts"]
71
- }
72
-
73
- โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
74
- Phase 5 โ€” Main Agent ๆ ก้ชŒ + ่‡ชๅŠจๆŽจ่ฟ›
75
- โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
51
+ If the Sub Agent failed to complete all steps, it returns the current step it's
52
+ stuck on โ€” the Main Agent can re-dispatch or reassign.
53
+
54
+ ## Full lifecycle
55
+
56
+ ### Phase 1 โ€” Plan and create
57
+
58
+ ```
76
59
  Main Agent:
77
- finalize(taskId, taskKey)
78
-
79
- โœ… ้€š่ฟ‡:
80
- โ†’ ่ฟ”ๅ›ž { ok: true, level, ... }
81
- โ†’ level="task": Node ่ฟ˜ๆœ‰ๆœชๅฎŒๆˆ็š„ Task๏ผŒ็ปง็ปญๆดพๅ‘
82
- โ†’ level="node": Node ๅฎŒๆˆ! nodeKey ่ฟ”ๅ›ž๏ผŒ่‡ชๅŠจๆŽจ่ฟ›
83
- โ†’ level="program": ๅ…จ้ƒจ Node ๅฎŒๆˆ! ๆ”ถๅทฅ
84
- โ†’ Sub Agent ้‡Šๆ”พ
85
-
86
- โŒ ไธ้€š่ฟ‡:
87
- โ†’ ่ฟ”ๅ›ž { actualStatus, completedSteps, missingSteps,
88
- currentStepId, stepKey }
89
- โ†’ Main Agent ๆŠŠ็œŸๅฎž่ดฆๆœฌๅ‘ๅ›ž Sub Agent:
90
- "ไฝ ็š„ TaskKey ๆœช้€š่ฟ‡ Gate ๆ ก้ชŒใ€‚
91
- ๅทฒๅฎŒๆˆ: step_001, step_002
92
- ็ผบๅคฑ: step_003, step_004
93
- ๅฝ“ๅ‰ๅบ”็ปง็ปญ step_003๏ผŒStepKey: SK_REAL33"
94
- โ†’ Sub Agent ไปŽ currentStepId ็ปง็ปญ checkpoint
95
- โ†’ ไฟฎๅฎŒ้‡ๆ–ฐ finalize
96
-
97
- โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
98
- Phase 6 โ€” ไธ‹ไธ€ไธช Node (่‡ชๅŠจ)
99
- โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
100
- finalize ่ฟ”ๅ›ž level="node" ๆ—ถ๏ผŒMain Agent:
101
- program status โ†’ ๆ‰พไธ‹ไธ€ไธช ready node
102
- program start <next-node>
103
- โ†’ ๅˆ›ๅปบๆ–ฐ Task โ†’ ๆดพๅ‘ โ†’ ๅพช็Žฏ
60
+ start-plan โ†’ creates Task with DAG steps
61
+ Receives: taskId + currentSteps + stepKeys (for unlocked steps)
62
+ ```
104
63
 
105
- โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
106
- ๆ”ถๅฐพ
107
- โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
108
- ๆœ€ๅŽไธ€ไธช Node ๅฎŒๆˆ:
109
- finalize โ†’ level="program" โ†’ Program completed
110
- ๆ”ถๅทฅ
64
+ ### Phase 2 โ€” Dispatch to Sub Agent
65
+
66
+ ```
67
+ Main Agent spawns Sub Agent with the injection payload above.
68
+ Sub Agent auto-discovers session from .step-gate/bindings/.
111
69
  ```
112
70
 
113
- ## ๅ…ณ้”ฎ่ฎพ่ฎก็‚น
71
+ ### Phase 3 โ€” Sub Agent executes
114
72
 
115
- **Main Agent ๅช่ฐƒไธ€ไธชๅ‘ฝไปค**๏ผš`finalize(taskKey)`ใ€‚ๅ‰ฉไธ‹็š„็ณป็ปŸ่‡ชๅŠจไปŽ Task โ†’ Node โ†’ Program ไผ ๆ’ญใ€‚
73
+ ```
74
+ Sub Agent loop:
75
+ 1. Read stepKey from the injected payload (or checkpoint response)
76
+ 2. Execute the step
77
+ 3. step-gate checkpoint '{"taskId":"...","stepId":"...","stepKey":"..."}'
78
+ 4. Response gives nextSteps + nextStepKeys (if deps satisfied)
79
+ OR allStepsCompleted: true + taskKey (if this was the last step)
80
+ ```
116
81
 
117
- **TaskKey ๆ ก้ชŒๅณๆถˆ่ดน**๏ผšfinalize ไผšๆถˆ่€— taskKey ๅนถๆŽจ่ฟ› DAG๏ผŒไธๅญ˜ๅœจ"ๆ ก้ชŒ้€š่ฟ‡ไฝ†ไธๆŽจ่ฟ›"็š„็Šถๆ€ใ€‚
82
+ If a merge point hasn't been reached yet (parallel branches), `nextSteps` is
83
+ empty. The Sub Agent must wait for other branches to complete before the merge
84
+ step unlocks.
118
85
 
119
- **Sub Agent ไธ้œ€่ฆ็Ÿฅ้“**๏ผš
120
- - taskId ็š„็ป“ๆž„ๅซไน‰
121
- - ๅฎŒๆ•ด็š„ DAG
122
- - ๅ‰ๅŽ Task ๆ˜ฏไป€ไนˆ
123
- - Node/Program ๅ…จๅฑ€
124
- - ้ชŒ่ฏ้€ป่พ‘๏ผˆ็ณป็ปŸ่‡ชๅทฑๆ ก้ชŒ๏ผ‰
86
+ ### Phase 4 โ€” Sub Agent returns
125
87
 
126
- **ไธญๆ–ญๆขๅค**๏ผštaskId + skipKey ้‡ๅปบ๏ผŒๆ—ง step ๅ‡ญ่ฏๆฐธไน…ไฟ็•™ใ€‚
88
+ ```
89
+ Sub Agent โ†’ Main Agent: { taskId, taskKey, summary, artifacts }
90
+ Main Agent: step-gate finalize '{"taskId":"...","taskKey":"..."}'
91
+ ```
92
+
93
+ ### Phase 5 โ€” Verify and propagate
127
94
 
128
- **็บฏ Task ๆจกๅผ**๏ผšไธ็”จ Program/Node ๆ—ถ๏ผŒๅช้œ€ `start-plan โ†’ checkpoint โ†’ finalize`ใ€‚ๆฏไธชไบคไบ’ไธ€ไธช Task๏ผŒไบคไบ’็ป“ๆŸ Stop Hook ่‡ชๅŠจๆฃ€ๆŸฅใ€‚
95
+ ```
96
+ finalize returns:
97
+ { level: "task" } โ†’ Node has more tasks, dispatch next Sub Agent
98
+ { level: "node" } โ†’ Node complete, auto-generated nodeKey returned
99
+ { level: "program" } โ†’ All nodes done, program complete
100
+
101
+ If finalize REJECTS:
102
+ { accepted: false, pendingSteps: [...] }
103
+ โ†’ Sub Agent missed steps. Send it the pendingSteps list, continue checkpointing.
104
+ ```
129
105
 
130
- ## ๆธ่ฟ›ๅผๆŠซ้œฒ
106
+ ### Phase 6 โ€” Next node
131
107
 
132
108
  ```
133
- SKILL.md (ๆ‰ง่กŒๅ่ฎฎ) โ† ๆ‰€ๆœ‰ Agent ๅฟ…่ฏป๏ผŒๅŸบ็ก€ CLI ๅ‘ฝไปค
134
- โ””โ”€ Weaver.md (็ผ–ๆŽ’ๅผ•ๆ“Ž) โ† Main Agent ่ฏป๏ผŒๅฆ‚ไฝ•็ผ–ๆŽ’ Sub Agent
135
- โ””โ”€ CLI (็Šถๆ€ๆœบ) โ† ๅบ•ๅฑ‚ๅฎž็Žฐ
136
- โ””โ”€ SQLite (ๆŒไน…ๅŒ–)
109
+ When level="node", Main Agent:
110
+ program status โ†’ find next ready node
111
+ program start <next-node>
112
+ โ†’ start-plan โ†’ dispatch โ†’ repeat
137
113
  ```
138
114
 
139
- Sub Agent ๅช้œ€่ฆ SKILL.md ไธญ็š„ CLI ๅ‘ฝไปค๏ผŒไธ้œ€่ฆ Weaver.mdใ€‚
140
- Main Agent ้œ€่ฆ SKILL.md + Weaver.mdใ€‚
115
+ ## Key design rules
116
+
117
+ 1. **Sub Agent never sees the full DAG.** It only knows the steps it's been given
118
+ keys for. This prevents hallucinated dependencies and keeps context lean.
119
+
120
+ 2. **Main Agent only calls `finalize`.** It doesn't need to inspect execution
121
+ traces. The taskKey is a cryptographic proof โ€” it either matches or it doesn't.
122
+
123
+ 3. **Keys are single-use and appear once.** The Sub Agent captures them from the
124
+ checkpoint response. The `current` command does NOT return keys. If a key is
125
+ lost, the task must be cancelled and rebuilt with skipKey.
126
+
127
+ 4. **SkipKey recovery.** If a Sub Agent dies mid-task, the Main Agent rebuilds:
128
+ ```
129
+ cancel-task โ†’ start-plan (with skipKey + skipTaskId for completed steps)
130
+ ```
131
+ Completed steps are marked `skipped`, remaining steps get fresh keys.
132
+
133
+ 5. **Pure Task mode.** When Program/Node layers aren't needed, just use:
134
+ ```
135
+ start-plan โ†’ checkpoint ร— N โ†’ finalize
136
+ ```
137
+ The Stop Hook checks for unfinalized tasks at session end.
138
+
139
+ ## Progressive disclosure
140
+
141
+ ```
142
+ SKILL.md โ†’ All agents. CLI commands + rules.
143
+ Weaver.md โ†’ Main Agent only. How to dispatch and verify Sub Agents.
144
+ CLI + SQLite โ†’ The Gate itself. Agents don't read this.
145
+ ```
package/package.json CHANGED
@@ -1,9 +1,8 @@
1
1
  {
2
2
  "name": "agent-step-gate",
3
- "version": "0.3.0",
4
- "description": "CLI + Skill-based Step Ledger & Key Gate for long-running multi-agent orchestration",
3
+ "version": "0.3.1",
4
+ "description": "External cryptographic step ledger for long-running multi-agent orchestration",
5
5
  "type": "module",
6
- "main": "dist/index.js",
7
6
  "bin": {
8
7
  "step-gate": "dist/cli.js"
9
8
  },
@@ -22,12 +21,10 @@
22
21
  "dist/",
23
22
  "scripts/",
24
23
  "SKILL.md",
25
- "Weaver.md",
26
- "ARCHITECTURE.md"
24
+ "Weaver.md"
27
25
  ],
28
26
  "license": "MIT",
29
27
  "dependencies": {
30
- "@modelcontextprotocol/sdk": "^1.0.0",
31
28
  "better-sqlite3": "^11.0.0",
32
29
  "zod": "^4.0"
33
30
  },
@@ -40,9 +37,6 @@
40
37
  "scripts": {
41
38
  "build": "tsc",
42
39
  "dev": "tsc --watch",
43
- "start": "node dist/index.js",
44
- "cli": "node dist/cli.js",
45
- "test": "vitest run",
46
- "test:watch": "vitest"
40
+ "cli": "node dist/cli.js"
47
41
  }
48
42
  }
package/ARCHITECTURE.md DELETED
@@ -1,393 +0,0 @@
1
- # Agent Step Gate โ€” ๅฎŒๆ•ดๆžถๆž„ๆ–‡ๆกฃ
2
-
3
- **็‰ˆๆœฌ**: 0.3.0 | **ๆ—ฅๆœŸ**: 2026-05-30 | **ๆต‹่ฏ•**: 116/116
4
-
5
- ---
6
-
7
- ## 1. ๅ››ๅฑ‚ๆžถๆž„
8
-
9
- ```
10
- Program (pgm_XXXXXX) โ† ่ทจ Session ๅคง่ฎกๅˆ’
11
- โ””โ”€ Node (pg-xxx) โ† ไธ€ไธช Session ็š„ๅทฅไฝœๅ•ๅ…ƒ
12
- โ””โ”€ Task (tsk_XXXXXX) โ† ไธ€ไธช DAG ่ฎกๅˆ’
13
- โ””โ”€ Step โ† ๆœ€ๅฐๆ‰ง่กŒๅ•ๅ…ƒ
14
- ```
15
-
16
- ๆฏๅฑ‚้ƒฝๆœ‰ๅฏนๅบ”็š„ๅฎŒๆˆๅ‡ญ่ฏ๏ผš
17
- ```
18
- stepKey โ”€โ”€โ†’ taskKey โ”€โ”€โ†’ nodeKey โ”€โ”€โ†’ program (่‡ชๆฃ€)
19
- (ๅ‡บ็คบ) (ๅ‡บ็คบ) (ๆ”ถๆฎ) (่‡ชๅŠจ)
20
- ```
21
-
22
- ### ่‡ชๅบ•ๅ‘ไธŠไผ ๆ’ญ
23
-
24
- `finalize` ๅ‘ฝไปคไธ€ๆฌก่ฐƒ็”จ๏ผŒ่‡ชๅŠจ้€ๅฑ‚ไธŠๆตฎ๏ผš
25
-
26
- ```
27
- finalize(taskKey)
28
- โ†’ task completed
29
- โ†’ ๆฃ€ๆŸฅ: ๅŒ node ๅ…จ้ƒจ task completed?
30
- โ†’ ๆ˜ฏ โ†’ ็”Ÿๆˆ nodeKey โ†’ node completed
31
- โ†’ ๆฃ€ๆŸฅ: ๅŒ program ๅ…จ้ƒจ node completed?
32
- โ†’ ๆ˜ฏ โ†’ program completed
33
- ```
34
-
35
- Agent ไธ้œ€่ฆๅˆคๆ–ญๅฑ‚็บงโ€”โ€”็ณป็ปŸ่‡ชๅทฑ็Ÿฅ้“่ฏฅไผ ๆ’ญๅˆฐๅ“ชใ€‚
36
-
37
- ---
38
-
39
- ## 2. ๆ•ฐๆฎๅบ“ โ€” 7 ๅผ ่กจ
40
-
41
- ### programs
42
- ```sql
43
- program_id TEXT PK -- pgm_XXXXXX
44
- title TEXT
45
- status TEXT -- active | completed
46
- total_nodes INTEGER
47
- created_at / updated_at
48
- ```
49
-
50
- ### program_nodes
51
- ```sql
52
- node_id TEXT PK -- user-defined or pg_xxx_N
53
- program_id TEXT FK
54
- title / description / order_index
55
- status TEXT -- pending | in_progress | completed
56
- session_id TEXT
57
- node_key_hash TEXT -- SHA-256(6-char nodeKey), system-generated
58
- completed_at / created_at
59
- ```
60
-
61
- ### sessions
62
- ```sql
63
- session_id TEXT PK -- ses_XXXXXX
64
- session_secret_hash TEXT -- SHA-256(6-char)
65
- recovery_token_hash TEXT -- SHA-256(6-char)
66
- title / workspace
67
- program_id / program_node_id
68
- status TEXT -- active | completed | abandoned
69
- created_by_cli / created_at / updated_at
70
- ```
71
-
72
- ### cli_instances
73
- ```sql
74
- cli_instance_id TEXT PK -- cli_XXXXXX
75
- session_id / hostname / pid / workspace
76
- status TEXT -- active | dead | detached
77
- created_at / last_seen_at
78
- ```
79
-
80
- ### tasks
81
- ```sql
82
- id TEXT PK -- tsk_XXXXXX
83
- title / status -- active | completed | cancelled
84
- current_index / total_steps
85
- final_key_hash TEXT -- SHA-256(taskKey)
86
- session_id TEXT FK
87
- created_at / updated_at
88
- ```
89
-
90
- ### steps
91
- ```sql
92
- id TEXT PK -- {taskId}_{nodeId}
93
- task_id / parent_path / title / path
94
- order_index / depends_on (JSON)
95
- status TEXT -- pending | current | completed | skipped
96
- step_key_hash TEXT -- SHA-256(stepKey), ๅฎŒๆˆๅŽไฟ็•™ไธบๆฐธไน…ๅ‡ญ่ฏ
97
- completed_at / created_at
98
- ```
99
-
100
- ### events
101
- ```sql
102
- id / task_id / step_id
103
- event_type TEXT -- plan_created | step_activated | step_completed
104
- -- all_steps_completed | task_finalized | task_cancelled
105
- -- skip_key_consumed
106
- payload / created_at
107
- ```
108
-
109
- ---
110
-
111
- ## 3. ๅฎ‰ๅ…จๆจกๅž‹ โ€” 5 ็งๅ‡ญ่ฏ
112
-
113
- | ๅ‡ญ่ฏ | ้•ฟๅบฆ | ็”จ้€” | ็”Ÿๆˆ่€… | ้ชŒ่ฏๆ–นๅผ | ็”Ÿๅ‘ฝๅ‘จๆœŸ |
114
- |------|------|------|--------|---------|---------|
115
- | **stepKey** | 6ไฝ | ่ฏๆ˜Žๅ•ไธช step ๅฎŒๆˆ | ็ณป็ปŸ(plan/checkpoint) | SHA-256 hash ๅŒน้… | ไธ€ๆฌกๆ€ง๏ผŒcheckpoint ๅŽๆถˆ่€— |
116
- | **taskKey** | 6ไฝ | ่ฏๆ˜Žๅ…จ้ƒจ step ๅฎŒๆˆ | ็ณป็ปŸ(ๆœ€ๅŽไธ€ๆญฅ checkpoint) | SHA-256 hash ๅŒน้… | ไธ€ๆฌกๆ€ง๏ผŒfinalize ๅŽๆถˆ่€— |
117
- | **nodeKey** | 6ไฝ | Node ๅฎŒๆˆๅ‡ญ่ฏ(ๆ”ถๆฎ) | ็ณป็ปŸ(finalize ่‡ชๅŠจไผ ๆ’ญ) | SHA-256 hash ๅญ˜ DB | ไฝœไธบๅฎŒๆˆๅ‡ญ่ฏ่ฟ”ๅ›ž็ป™ Agent |
118
- | **sessionSecret** | 6ไฝ | Session ่บซไปฝ่ฎค่ฏ | ็ณป็ปŸ(createSession) | SHA-256 hash ๅŒน้… | Session ็”Ÿๅ‘ฝๅ‘จๆœŸ |
119
- | **recoveryToken** | 6ไฝ | ๅดฉๆบƒๆขๅค + ็ฎก็†ๆ“ไฝœ | ็ณป็ปŸ(createSession) | SHA-256 hash ๅŒน้… | Session ็”Ÿๅ‘ฝๅ‘จๆœŸ |
120
-
121
- ### ้š”็ฆป่ง„ๅˆ™
122
- - Task ๅ†™ๆ“ไฝœ๏ผšsession_id ๅˆ—ๅผบๅˆถ่ฟ‡ๆปค
123
- - cancel-task๏ผšๅฟ…้กปๅŒ session๏ผŒๆˆ–ๅ‡บ็คบ recoveryToken (--admin)
124
- - checkpoint ๅŽŸๅญๆ€ง๏ผš`WHERE status='current' + affected rows` ้˜ฒๅŒๆถˆ่ดน
125
- - stepKey ไธ€ๆฌกๆ€ง๏ผškey_hash ไฟ็•™ไฝœๆฐธไน…ๅ‡ญ่ฏ๏ผŒไฝ† step ๅช่ƒฝ checkpoint ไธ€ๆฌก
126
-
127
- ### skipKey ้ชŒ่ฏ (ไธญๆ–ญๆขๅค)
128
- - ๆ—ง task ็š„ completed step ๅฏไฝœ skipKey ่ทณ่ฟ‡ๆ–ฐ task ็š„้‡ๅคๆญฅ้ชค
129
- - `verifySkipKey()` ๆฃ€ๆŸฅ๏ผšhash ๅŒน้… + status='completed' + events ่กจๆ—  `skip_key_consumed`
130
- - ้ชŒ่ฏ้€š่ฟ‡ๅŽ็ซ‹ๅณๅ†™ๅ…ฅ `skip_key_consumed` ไบ‹ไปถโ€”โ€”็กฎไฟไธ€ๆฌกๆ€งไฝฟ็”จ
131
- - ่ทณ่ฟ‡ๆญฅ้ชคๆ ‡่ฎฐไธบ `skipped`๏ผˆ้ž `completed`๏ผ‰๏ผŒไฟ็•™ๆบฏๆบ
132
-
133
- ---
134
-
135
- ## 4. DAG ๅผ•ๆ“Ž
136
-
137
- ### ่พ“ๅ…ฅๆ ผๅผ
138
- ```json
139
- {
140
- "title": "Plan",
141
- "steps": [
142
- {"id":"a","title":"A","dependsOn":[]},
143
- {"id":"b","title":"B","dependsOn":["a"]},
144
- {"id":"c","title":"C","dependsOn":[],"skipKey":"OLD","skipTaskId":"tsk_OLD"}
145
- ]
146
- }
147
- ```
148
-
149
- ### ๅฑ•ๅผ€่ง„ๅˆ™
150
- 1. `dependsOn: []` โ†’ ๅนถ่กŒ่ตท็‚น๏ผŒๅˆๅง‹ๅณๆฟ€ๆดป
151
- 2. `dependsOn: undefined` โ†’ ่‡ชๅŠจไธฒ่กŒ๏ผŒไพ่ต–ๅ‰ไธ€ไธชๅถๅญ
152
- 3. `dependsOn: ["b","c"]` โ†’ b ๅ’Œ c ้ƒฝๅฎŒๆˆๅŽๆ‰่งฃ้”
153
- 4. `skipKey + skipTaskId` โ†’ ้ชŒ่ฏ้€š่ฟ‡ๅŽๆ ‡่ฎฐ `skipped`
154
- 5. ๅตŒๅฅ— children โ†’ ้€’ๅฝ’ๅฑ•ๅผ€ไธบๅถๅญ่Š‚็‚น
155
-
156
- ### ่งฃ้”็ฎ—ๆณ•
157
- ```
158
- checkpoint(stepX):
159
- 1. ๆ ‡่ฎฐ stepX = completed (ไฟ็•™ key_hash)
160
- 2. ๆ‰ซๆ pending steps๏ผš
161
- dependsOn ๅ…จ้ƒจ completed/skipped โ†’ ๆ ‡่ฎฐ current๏ผŒ็”Ÿๆˆ key
162
- 3. ๆ— ๆ–ฐ่งฃ้” + ๅ…จ้ƒจ completed/skipped โ†’ ็”Ÿๆˆ taskKey
163
- ```
164
-
165
- ---
166
-
167
- ## 5. CLI ๅ‘ฝไปคๅ…จ้›† (12 ไธช)
168
-
169
- ### Task ็บง
170
- | ๅ‘ฝไปค | ่พ“ๅ…ฅ | ่พ“ๅ‡บ |
171
- |------|------|------|
172
- | `start-plan '<json>'` | title + steps[] | taskId, session, totalSteps, currentSteps, stepKeys |
173
- | `checkpoint '<json>'` | taskId + stepId + stepKey | completedStep, nextSteps, nextStepKeys, taskKey |
174
- | `current '<json>'` | taskId | status, totalSteps, completedSteps, currentSteps |
175
- | `finalize '<json>'` | taskId + taskKey | level(task/node/program), nodeKey(if), program(if) |
176
- | `cancel-task '<json>'` | taskId | ok / error(NO_SESSION) |
177
- | `active-task` | โ€” | activeTasks[] (session-filtered) |
178
- | `active-task --all` | โ€” | activeTasks[] (่ทจ session) |
179
-
180
- ### Program ็บง
181
- | ๅ‘ฝไปค | ่พ“ๅ…ฅ | ่พ“ๅ‡บ |
182
- |------|------|------|
183
- | `program init '<json>'` | title + nodes[] | programId, totalNodes, nodes |
184
- | `program status '<json>'` | programId | programId, title, nodes[] |
185
- | `program ready '<json>'` | programId | readyNodes[] |
186
- | `program start '<json>'` | programId + nodeId | ok, nodeId, sessionId |
187
- | `program finalize '<json>'` | programId | ok, pending[] |
188
-
189
- ### Session ็ป‘ๅฎšๆ–นๅผ
190
- - `--session-file <path>` โ€” ๆ˜พๅผๆŒ‡ๅฎš session ๆ–‡ไปถ
191
- - `--binding-file <path>` โ€” ้€š่ฟ‡ binding ๆ–‡ไปถ้—ดๆŽฅๆŒ‡ๅฎš
192
- - `STEP_GATE_SESSION_FILE` / `STEP_GATE_BINDING_FILE` ็Žฏๅขƒๅ˜้‡
193
- - ่‡ชๅŠจๅ‘็Žฐ `.step-gate/bindings/` ไธญๆœ€ๆ–ฐ็š„ binding๏ผˆๅ›ž้€€๏ผ‰
194
-
195
- ### Admin ๆจกๅผ
196
- - `cancel-task --admin --recovery-token <token>` โ€” ่ทจ session ๅ–ๆถˆ
197
-
198
- ---
199
-
200
- ## 6. ๆ ธๅฟƒๅ‡ฝๆ•ฐ (20+)
201
-
202
- ### src/core/plan.ts
203
- | ๅ‡ฝๆ•ฐ | ไฝœ็”จ |
204
- |------|------|
205
- | `flattenPlan(nodes, taskId) โ†’ LeafStep[]` | ๅตŒๅฅ—ๅฑ•ๅผ€ + DAG ไพ่ต–่งฃๆž |
206
-
207
- ### src/core/keys.ts
208
- | ๅ‡ฝๆ•ฐ | ไฝœ็”จ |
209
- |------|------|
210
- | `randomCode(length) โ†’ string` | [A-Z0-9] ้šๆœบ็  |
211
- | `generateStepKey() โ†’ {plaintext, hash}` | 6ไฝ step key |
212
- | `generateTaskKey() โ†’ {plaintext, hash}` | 6ไฝ task key |
213
- | `generateNodeKey() โ†’ {plaintext, hash}` | 6ไฝ node key |
214
- | `hashKey(plaintext) โ†’ string` | SHA-256 |
215
-
216
- ### src/core/gate.ts
217
- | ๅ‡ฝๆ•ฐ | ไฝœ็”จ |
218
- |------|------|
219
- | `validateCheckpoint(repo, taskId, stepId, stepKey)` | 5ๆญฅๆ ก้ชŒ๏ผˆtaskๅญ˜ๅœจ/active/currentๅŒน้…/keyๅŒน้…๏ผ‰ |
220
- | `advanceSteps(repo, task, completedStepId)` | ่งฃ้”ๅŽ็ปงๆญฅ้ชคๆˆ–็”Ÿๆˆ taskKey |
221
- | `GateRepository` (interface) | ไป“ๅบ“ๆŠฝ่ฑก๏ผšgetTask/getCurrentSteps/getTaskSteps/completeAndAdvance/updateTaskStatus/verifyTaskKey |
222
-
223
- ### src/core/session.ts
224
- | ๅ‡ฝๆ•ฐ | ไฝœ็”จ |
225
- |------|------|
226
- | `createSession(workspace) โ†’ SessionInfo` | ๅˆ›ๅปบ session + ๅ†™ๅ…ฅๆ–‡ไปถ |
227
- | `verifySessionSecret(sessionId, secret)` | ๆ ก้ชŒ session ๅ‡ญๆฎ |
228
- | `verifyRecoveryToken(sessionId, token)` | ๆ ก้ชŒๆขๅคๅ‡ญๆฎ |
229
- | `isSessionActive(sessionId)` | ๆฃ€ๆŸฅ็Šถๆ€ |
230
- | `getCurrentSessionId()` | ่ฟ›็จ‹ๅ†…ๅ…ฑไบซ sessionId |
231
-
232
- ### src/core/program.ts
233
- | ๅ‡ฝๆ•ฐ | ไฝœ็”จ |
234
- |------|------|
235
- | `createProgram(title, nodes[]) โ†’ ProgramInfo` | ๅˆ›ๅปบ Program |
236
- | `getProgramStatus(programId) โ†’ ProgramInfo` | ๆŸฅ่ฏข็Šถๆ€ |
237
- | `getReadyNodes(programId) โ†’ ProgramNodeInfo[]` | ๅฏๅผ€ๅง‹็š„ node |
238
- | `startProgramNode(programId, nodeId, sessionId)` | ็ป‘ๅฎš session |
239
- | `commitProgramNode(sessionId)` | ่‡ชๅŠจ็”Ÿๆˆ nodeKey + ๆ ‡่ฎฐ node ๅฎŒๆˆ |
240
- | `finalizeProgram(programId)` | ๅ…จๅฑ€ๅฎŒๆ•ดๆ€งๆฃ€ๆŸฅ |
241
-
242
- ### src/storage/repository.ts
243
- | ๅ‡ฝๆ•ฐ | ไฝœ็”จ |
244
- |------|------|
245
- | `createTask(task, steps[])` | ๅŽŸๅญๅ†™ๅ…ฅ task + steps |
246
- | `getTask(taskId)` | ๆŸฅ่ฏข task |
247
- | `getCurrentSteps(taskId)` | ๆŸฅ่ฏขๆดป่ทƒๆญฅ้ชค |
248
- | `getTaskSteps(taskId)` | ๆŸฅ่ฏขๆ‰€ๆœ‰ๆญฅ้ชค |
249
- | `getActiveTasks(sessionId?)` | ๆดป่ทƒ task๏ผˆๅฏ้€‰ session ่ฟ‡ๆปค๏ผ‰ |
250
- | `completeAndAdvance(...)` | ๅŽŸๅญๅฎŒๆˆ+ๆŽจ่ฟ›๏ผˆไบ‹ๅŠกไฟๆŠค๏ผ‰ |
251
- | `verifyStepKey(taskId, stepId, key)` | ไธฅๆ ผๆ ก้ชŒ๏ผˆstatus='current'๏ผ‰ |
252
- | `verifyTaskKey(taskId, key)` | ๆ ก้ชŒ taskKey |
253
- | `verifySkipKey(oldTaskId, stepId, oldKey)` | ้ชŒ่ฏ skip ๅ‡ญ่ฏ + ๆฃ€ๆŸฅๆถˆ่ดนไบ‹ไปถ |
254
- | `recordSkipConsumed(taskId, stepId)` | ๅ†™ๅ…ฅ skip_key_consumed ไบ‹ไปถ |
255
- | `cancelTask(taskId, sessionId)` | ๅ–ๆถˆ๏ผˆsession ้—จๆŽง๏ผ‰ |
256
- | `updateTaskStatus(taskId, status)` | ๆ›ดๆ–ฐ็Šถๆ€ |
257
- | `addEvent(taskId, stepId, type, payload?)` | ไบ‹ไปถ่ฎฐๅฝ• |
258
- | `getEvents(taskId)` | ๆŸฅ่ฏขไบ‹ไปถ |
259
-
260
- ---
261
-
262
- ## 7. Hook ็ณป็ปŸ
263
-
264
- ### SessionStart (`scripts/session-start-hook.sh`)
265
- ```
266
- ่งฆๅ‘: ๆฏๆฌก็ปˆ็ซฏๅฏๅŠจ
267
- ็ญ–็•ฅ: ่ฝป้‡ไผ˜ๅ…ˆ โ€” ่ฏป data/state.json (1ms)๏ผŒๆ— ็ป“ๆžœๆ‰่ฐƒ CLI
268
- ่กŒไธบ:
269
- 1. ่ฏป state.json โ†’ ๆœ‰ๆดป่ทƒ task โ†’ ่ญฆๅ‘Š + ๅˆ—ๅ‡บ่ฟ›ๅบฆ
270
- 2. state ไธบ็ฉบ โ†’ active-task --all โ†’ ่ทจ session ๆฃ€ๆŸฅ
271
- 3. ๆ— ๆœชๅฎŒๆˆ โ†’ ๆ้†’ๅฏ็”จๅ‘ฝไปค
272
- ```
273
-
274
- ### Stop (`.claude/settings.local.json`)
275
- ```
276
- ่งฆๅ‘: Session ็ป“ๆŸๅ‰
277
- ่กŒไธบ:
278
- ่ฐƒ็”จ finalize(taskKey) โ†’ ็ณป็ปŸ่‡ชๅŠจไผ ๆ’ญๅˆฐ node/program
279
- ๅฆ‚ๆ—  taskKey โ†’ ๆ‹ฆๆˆชๆ้†’
280
- ```
281
-
282
- ### State File (`data/state.json`)
283
- ```
284
- ๅ†™ๅ…ฅๆ—ถๆœบ: start-plan / checkpoint / finalize / cancel-task ๅŽ
285
- ๅ†…ๅฎน: { hasActiveTask, activeTasks: [{taskId, title, completed, total, current}] }
286
- ็”จ้€”: SessionStart 1ms ๅฟซ็…ง๏ผŒ่ทจไบ’ๅŠจๆ้†’
287
- ```
288
-
289
- ---
290
-
291
- ## 8. ๆ–‡ไปถๅธƒๅฑ€
292
-
293
- ```
294
- project/
295
- src/
296
- cli.ts โ† CLI ๅ…ฅๅฃ (504่กŒ, 12ๅ‘ฝไปค)
297
- index.ts โ† MCP Server ๅ…ฅๅฃ (ๅค‡็”จ)
298
- core/
299
- plan.ts โ† DAG ๅฑ•ๅผ€
300
- keys.ts โ† ไธ‰ๅฑ‚ๅฏ†้’ฅ็”Ÿๆˆ
301
- gate.ts โ† ๆ ก้ชŒ + ่งฃ้”็Šถๆ€ๆœบ
302
- session.ts โ† Session ็ฎก็†
303
- program.ts โ† Program ๅฑ‚
304
- errors.ts โ† GateError
305
- storage/
306
- db.ts โ† SQLite (WAL, busy_timeout=5000)
307
- repository.ts โ† ๆ•ฐๆฎๅฑ‚ (20+ ๅ‡ฝๆ•ฐ)
308
- tools/ โ† MCP ๅทฅๅ…ท (ๅค‡็”จ)
309
- startPlan.ts / checkpoint.ts / current.ts
310
- finalize.ts / cancelTask.ts / activeTask.ts / index.ts
311
- types/
312
- index.ts โ† ๅ…จ้ƒจ็ฑปๅž‹ๅฎšไน‰
313
- tests/
314
- core.test.ts โ† 36 tests
315
- storage.test.ts โ† 34 tests
316
- tools.test.ts โ† 29 tests (ๅซ A1/B1)
317
- ci-blackbox.test.ts โ† 15 tests (MCP ๅ่ฎฎ็บง)
318
- e2e-smoking-app.test.ts โ† E2E ๅผบๅˆถๅ›ž้€€
319
- e2e-multi-agent.test.ts โ† E2E ๅคšAgentๅไฝœ
320
- scripts/
321
- session-start-hook.sh
322
- prompt-check-hook.sh
323
- mcp-backup/ โ† MCP ๅฎŒๆ•ดๅค‡ไปฝ
324
- data/
325
- gate.db โ† SQLite ๆ•ฐๆฎๅบ“
326
- state.json โ† ่ฝป้‡ๅฟซ็…ง
327
- .step-gate/
328
- sessions/ โ† Session ๅ‡ญๆฎๆ–‡ไปถ
329
- bindings/ โ† CLI ็ป‘ๅฎšๆ–‡ไปถ
330
- openspec/changes/ โ† ๅ˜ๆ›ดๆ–‡ๆกฃ
331
- SKILL.md โ† Skill ๅฎšไน‰
332
- ARCHITECTURE.md โ† ๆœฌๆ–‡ๆกฃ
333
- ```
334
-
335
- ---
336
-
337
- ## 9. ้”™่ฏฏ็ 
338
-
339
- | ้”™่ฏฏ็  | ๅซไน‰ |
340
- |--------|------|
341
- | TASK_NOT_FOUND | taskId ไธๅญ˜ๅœจ |
342
- | TASK_ALREADY_COMPLETED | ไปปๅŠกๅทฒๅฎŒๆˆ |
343
- | NO_STEPS | ่ฎกๅˆ’ๆ— ๆญฅ้ชค |
344
- | INVALID_CURRENT_STEP | ๆญฅ้ชคไธๅœจๅฝ“ๅ‰็Šถๆ€ |
345
- | INVALID_STEP_KEY | stepKey ๆ ก้ชŒๅคฑ่ดฅ |
346
- | INVALID_FINAL_KEY | taskKey ๆ ก้ชŒๅคฑ่ดฅ |
347
- | INVALID_RECOVERY_TOKEN | recoveryToken ๆ ก้ชŒๅคฑ่ดฅ |
348
- | PLAN_SCHEMA_INVALID | ่ฎกๅˆ’ๆ ผๅผ้”™่ฏฏ |
349
- | SKIP_VERIFY_FAILED | skip ๅ‡ญ่ฏ้ชŒ่ฏๅคฑ่ดฅๆˆ–ๅทฒๆถˆ่ดน |
350
- | NO_SESSION | ๆ—  session ็ป‘ๅฎš |
351
- | INTERNAL_ERROR | ๆ•ฐๆฎๅบ“/ๅ†…้ƒจ้”™่ฏฏ |
352
-
353
- ---
354
-
355
- ## 10. ๅ…ธๅž‹ๆต็จ‹
356
-
357
- ### ๅ• Session
358
- ```bash
359
- start-plan โ†’ checkpoint ร— N โ†’ finalize taskKey
360
- # โ†’ ่‡ชๅบ•ๅ‘ไธŠ: task โ†’ node โ†’ program (ๅฆ‚ๆœ‰)
361
- ```
362
-
363
- ### ไธญๆ–ญๆขๅค
364
- ```bash
365
- start-plan โ†’ checkpoint auth โœ…
366
- โ†’ current (ๆŸฅ็Šถๆ€) โ†’ cancel-task
367
- โ†’ start-plan (skipKey+skipTaskId ้‡ๅปบ๏ผŒๆ—ง key ่ขซๆถˆ่ดน)
368
- โ†’ checkpoint โ†’ finalize taskKey
369
- ```
370
-
371
- ### ่ทจ Session Program
372
- ```bash
373
- program init โ†’ program start pg-1
374
- โ†’ start-plan โ†’ checkpoint ร— N โ†’ finalize taskKey
375
- # โ†‘ ่‡ชๅŠจๆ ‡่ฎฐ pg-1 completed + nodeKey ็”Ÿๆˆ
376
-
377
- program start pg-2
378
- โ†’ start-plan โ†’ checkpoint ร— N โ†’ finalize taskKey
379
- # โ†‘ ่‡ชๅŠจๆ ‡่ฎฐ pg-2 completed๏ผŒprogram completed
380
- ```
381
-
382
- ---
383
-
384
- ## 11. ๆŠ€ๆœฏๆ ˆ
385
-
386
- - **Runtime**: Node.js 20+
387
- - **Language**: TypeScript ESM
388
- - **Storage**: better-sqlite3 (WAL, synchronous=NORMAL, busy_timeout=5000)
389
- - **Validation**: Zod v4 (MCP tools)
390
- - **Test**: vitest (116 tests, 6 suites)
391
- - **Key**: crypto.randomBytes โ†’ [A-Z0-9]{6} โ†’ SHA-256
392
- - **IDs**: 6ไฝ [A-Z0-9] (36^6 โ‰ˆ 21ไบฟ็†ต)
393
- - **MCP SDK**: @modelcontextprotocol/sdk v1.x (ๅค‡็”จ)