@@ -10,7 +10,7 @@ use serde_json::json;
1010use crate :: output:: { error_exit, json_output, pretty_output} ;
1111
1212use flowctl_core:: id:: is_epic_id;
13- use flowctl_db :: { FlowStore , GapEntry } ;
13+ use flowctl_core :: json_store :: { self , GapEntry } ;
1414
1515use super :: helpers:: get_flow_dir;
1616
@@ -112,8 +112,8 @@ fn validate_epic(_json: bool, epic_id: &str) {
112112 error_exit ( & format ! ( "Epic not found: {}" , epic_id) ) ;
113113}
114114
115- fn gap_store ( ) -> FlowStore {
116- FlowStore :: new ( get_flow_dir ( ) )
115+ fn gap_flow_dir ( ) -> std :: path :: PathBuf {
116+ get_flow_dir ( )
117117}
118118
119119// ── Commands ───────────────────────────────────────────────────────
@@ -126,10 +126,9 @@ fn cmd_gap_add(
126126 source : & str ,
127127) {
128128 validate_epic ( json_mode, epic_id) ;
129- let store = gap_store ( ) ;
130- let gap_store = store. gaps ( ) ;
129+ let flow_dir = gap_flow_dir ( ) ;
131130
132- let mut gaps = gap_store . read ( epic_id) . unwrap_or_default ( ) ;
131+ let mut gaps = json_store :: gaps_read ( & flow_dir , epic_id) . unwrap_or_default ( ) ;
133132
134133 // Check for existing gap with same capability (idempotent)
135134 let cap_lower = capability. trim ( ) . to_lowercase ( ) ;
@@ -166,7 +165,7 @@ fn cmd_gap_add(
166165 resolved : false ,
167166 } ) ;
168167
169- if let Err ( e) = gap_store . write ( epic_id, & gaps) {
168+ if let Err ( e) = json_store :: gaps_write ( & flow_dir , epic_id, & gaps) {
170169 error_exit ( & format ! ( "Failed to add gap: {e}" ) ) ;
171170 }
172171
@@ -190,8 +189,8 @@ fn cmd_gap_add(
190189
191190fn cmd_gap_list ( json_mode : bool , epic_id : & str , status_filter : Option < & str > ) {
192191 validate_epic ( json_mode, epic_id) ;
193- let store = gap_store ( ) ;
194- let gaps = store . gaps ( ) . read ( epic_id) . unwrap_or_default ( ) ;
192+ let flow_dir = gap_flow_dir ( ) ;
193+ let gaps = json_store :: gaps_read ( & flow_dir , epic_id) . unwrap_or_default ( ) ;
195194
196195 let filtered: Vec < & GapEntry > = gaps. iter ( ) . filter ( |g| {
197196 match status_filter {
@@ -244,9 +243,8 @@ fn cmd_gap_resolve(
244243 _evidence : & str ,
245244) {
246245 validate_epic ( json_mode, epic_id) ;
247- let store = gap_store ( ) ;
248- let gap_st = store. gaps ( ) ;
249- let mut gaps = gap_st. read ( epic_id) . unwrap_or_default ( ) ;
246+ let flow_dir = gap_flow_dir ( ) ;
247+ let mut gaps = json_store:: gaps_read ( & flow_dir, epic_id) . unwrap_or_default ( ) ;
250248
251249 if let Some ( direct_id) = gap_id_direct {
252250 let gap_id: u32 = direct_id
@@ -259,7 +257,7 @@ fn cmd_gap_resolve(
259257 error_exit ( & format ! ( "Gap {} not found" , gap_id) ) ;
260258 }
261259
262- gap_st . write ( epic_id, & gaps) . unwrap_or_else ( |e| {
260+ json_store :: gaps_write ( & flow_dir , epic_id, & gaps) . unwrap_or_else ( |e| {
263261 error_exit ( & format ! ( "Failed to resolve gap: {e}" ) ) ;
264262 } ) ;
265263
@@ -281,7 +279,7 @@ fn cmd_gap_resolve(
281279 error_exit ( & format ! ( "Gap for capability '{}' not found" , cap) ) ;
282280 }
283281
284- gap_st . write ( epic_id, & gaps) . unwrap_or_else ( |e| {
282+ json_store :: gaps_write ( & flow_dir , epic_id, & gaps) . unwrap_or_else ( |e| {
285283 error_exit ( & format ! ( "Failed to resolve gap: {e}" ) ) ;
286284 } ) ;
287285
@@ -301,8 +299,8 @@ fn cmd_gap_resolve(
301299
302300fn cmd_gap_check ( json_mode : bool , epic_id : & str ) {
303301 validate_epic ( json_mode, epic_id) ;
304- let store = gap_store ( ) ;
305- let all_gaps = store . gaps ( ) . read ( epic_id) . unwrap_or_default ( ) ;
302+ let flow_dir = gap_flow_dir ( ) ;
303+ let all_gaps = json_store :: gaps_read ( & flow_dir , epic_id) . unwrap_or_default ( ) ;
306304
307305 let open_blocking: Vec < & GapEntry > = all_gaps
308306 . iter ( )
0 commit comments