specweave 1.0.18 → 1.0.20
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/CLAUDE.md +48 -0
- package/dist/src/core/config/types.d.ts +15 -0
- package/dist/src/core/config/types.d.ts.map +1 -1
- package/dist/src/core/config/types.js.map +1 -1
- package/dist/src/core/increment/increment-utils.d.ts +40 -0
- package/dist/src/core/increment/increment-utils.d.ts.map +1 -1
- package/dist/src/core/increment/increment-utils.js +56 -2
- package/dist/src/core/increment/increment-utils.js.map +1 -1
- package/dist/src/core/increment/status-change-sync-trigger.d.ts +26 -2
- package/dist/src/core/increment/status-change-sync-trigger.d.ts.map +1 -1
- package/dist/src/core/increment/status-change-sync-trigger.js +70 -6
- package/dist/src/core/increment/status-change-sync-trigger.js.map +1 -1
- package/dist/src/hooks/auto-create-external-issue.d.ts +19 -0
- package/dist/src/hooks/auto-create-external-issue.d.ts.map +1 -0
- package/dist/src/hooks/auto-create-external-issue.js +54 -0
- package/dist/src/hooks/auto-create-external-issue.js.map +1 -0
- package/dist/src/integrations/jira/jira-incremental-mapper.d.ts +3 -1
- package/dist/src/integrations/jira/jira-incremental-mapper.d.ts.map +1 -1
- package/dist/src/integrations/jira/jira-incremental-mapper.js +7 -1
- package/dist/src/integrations/jira/jira-incremental-mapper.js.map +1 -1
- package/dist/src/integrations/jira/jira-mapper.d.ts +3 -1
- package/dist/src/integrations/jira/jira-mapper.d.ts.map +1 -1
- package/dist/src/integrations/jira/jira-mapper.js +7 -1
- package/dist/src/integrations/jira/jira-mapper.js.map +1 -1
- package/dist/src/sync/external-issue-auto-creator.d.ts +156 -0
- package/dist/src/sync/external-issue-auto-creator.d.ts.map +1 -0
- package/dist/src/sync/external-issue-auto-creator.js +694 -0
- package/dist/src/sync/external-issue-auto-creator.js.map +1 -0
- package/dist/src/sync/format-preservation-sync.d.ts +18 -0
- package/dist/src/sync/format-preservation-sync.d.ts.map +1 -1
- package/dist/src/sync/format-preservation-sync.js +126 -24
- package/dist/src/sync/format-preservation-sync.js.map +1 -1
- package/dist/src/sync/frontmatter-updater.d.ts +3 -0
- package/dist/src/sync/frontmatter-updater.d.ts.map +1 -1
- package/dist/src/sync/frontmatter-updater.js +28 -4
- package/dist/src/sync/frontmatter-updater.js.map +1 -1
- package/dist/src/sync/sync-coordinator.d.ts.map +1 -1
- package/dist/src/sync/sync-coordinator.js +23 -1
- package/dist/src/sync/sync-coordinator.js.map +1 -1
- package/dist/src/utils/feature-id-collision.d.ts +51 -0
- package/dist/src/utils/feature-id-collision.d.ts.map +1 -1
- package/dist/src/utils/feature-id-collision.js +149 -0
- package/dist/src/utils/feature-id-collision.js.map +1 -1
- package/package.json +1 -1
- package/plugins/specweave/commands/sync-progress.md +92 -0
- package/plugins/specweave/scripts/cleanup-state.sh +26 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-issue-auto-creator.js","sourceRoot":"","sources":["../../../src/sync/external-issue-auto-creator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAU,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AA8BjE;;;;;;;;GAQG;AACH,MAAM,OAAO,wBAAwB;IAKnC,YAAY,OAAwC;QAClD,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC;QAC9C,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC3D,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,kBAAkB,CAAC,WAAmB;QAC1C,IAAI,CAAC;YACH,cAAc;YACd,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;YAE/C,kCAAkC;YAClC,MAAM,iBAAiB,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;YAC3D,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,IAAI;oBACb,UAAU,EAAE,qEAAqE;iBAClF,CAAC;YACJ,CAAC;YAED,kBAAkB;YAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAC7C,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,IAAI;oBACb,UAAU,EAAE,mDAAmD;iBAChE,CAAC;YACJ,CAAC;YAED,sBAAsB;YACtB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;YAChE,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,QAAQ;oBACR,KAAK,EAAE,aAAa,WAAW,+BAA+B;iBAC/D,CAAC;YACJ,CAAC;YAED,oDAAoD;YACpD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YAC3E,IAAI,aAAa,EAAE,CAAC;gBAClB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,WAAW,gBAAgB,QAAQ,WAAW,aAAa,EAAE,CAAC,CAAC;gBACpF,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,QAAQ;oBACR,OAAO,EAAE,IAAI;oBACb,UAAU,EAAE,yBAAyB,aAAa,EAAE;iBACrD,CAAC;YACJ,CAAC;YAED,kCAAkC;YAClC,QAAQ,QAAQ,EAAE,CAAC;gBACjB,KAAK,QAAQ;oBACX,OAAO,MAAM,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;gBAC3E,KAAK,MAAM;oBACT,OAAO,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;gBACzE,KAAK,KAAK;oBACR,OAAO,MAAM,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;gBACxE;oBACE,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,QAAQ,EAAE,MAAM;wBAChB,KAAK,EAAE,qBAAqB,QAAQ,EAAE;qBACvC,CAAC;YACN,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,WAAW,KAAK,YAAY,EAAE,CAAC,CAAC;YAC9E,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,MAAM;gBAChB,KAAK,EAAE,YAAY;aACpB,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACK,mBAAmB,CAAC,MAAW;QACrC,oCAAoC;QACpC,IAAI,MAAM,CAAC,IAAI,EAAE,qBAAqB,KAAK,SAAS,EAAE,CAAC;YACrD,OAAO,MAAM,CAAC,IAAI,CAAC,qBAAqB,KAAK,IAAI,CAAC;QACpD,CAAC;QAED,mBAAmB;QACnB,IAAI,MAAM,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,iCAAiC;QACjC,IAAI,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,sBAAsB,KAAK,IAAI,EAAE,CAAC;YAC3D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,0BAA0B;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;;;;;;OAUG;IACK,cAAc,CAAC,MAAW;QAChC,oDAAoD;QACpD,IAAI,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;YAC1C,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;YACxC,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;YACvC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,8BAA8B;QAC9B,MAAM,eAAe,GAAG,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC;QACtD,IAAI,eAAe,KAAK,QAAQ,EAAE,CAAC;YACjC,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,IAAI,eAAe,KAAK,MAAM,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IAAI,eAAe,KAAK,KAAK,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,yCAAyC;QACzC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,IAAI,EAAE,CAAC;QAC7C,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAU,EAAE,CAAC;YACvD,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAClC,OAAO,QAAQ,CAAC;YAClB,CAAC;YACD,IAAI,OAAO,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;gBAChC,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,IAAI,OAAO,CAAC,QAAQ,KAAK,KAAK,IAAI,OAAO,CAAC,QAAQ,KAAK,cAAc,EAAE,CAAC;gBACtE,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,iBAAiB,CAAC,WAAmB;QACjD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAC7B,IAAI,CAAC,WAAW,EAChB,uBAAuB,EACvB,WAAW,CACZ,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;QACrD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;QAE/D,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAEzD,oBAAoB;YACpB,MAAM,gBAAgB,GAAG,WAAW,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACpE,IAAI,WAAW,GAAQ,EAAE,CAAC;YAC1B,IAAI,gBAAgB,EAAE,CAAC;gBACrB,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACtD,CAAC;YAED,oBAAoB;YACpB,IAAI,SAAS,GAAG,WAAW,CAAC,UAAU,IAAI,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,OAAO,IAAI,EAAE,CAAC;YACxF,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,IAAI,CAAC;oBACH,SAAS,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;gBAC3C,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS,GAAG,MAAM,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBAClD,CAAC;YACH,CAAC;YAED,uCAAuC;YACvC,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;YAEvD,4BAA4B;YAC5B,IAAI,MAAM,GAAG,QAAQ,CAAC;YACtB,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;gBACtE,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC;YACvC,CAAC;YAED,OAAO;gBACL,EAAE,EAAE,WAAW;gBACf,SAAS;gBACT,KAAK,EAAE,WAAW,CAAC,KAAK,IAAI,WAAW;gBACvC,MAAM;gBACN,WAAW;aACZ,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,KAAK,EAAE,CAAC,CAAC;YAC7D,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,WAAmB;QAC1C,MAAM,WAAW,GAA2D,EAAE,CAAC;QAE/E,mCAAmC;QACnC,MAAM,OAAO,GAAG,2BAA2B,CAAC;QAC5C,IAAI,KAAK,CAAC;QAEV,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACpD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAE9B,qDAAqD;YACrD,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC;YACjC,MAAM,WAAW,GAAG,WAAW,CAAC,SAAS,CAAC,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAChG,MAAM,UAAU,GAAG,WAAW;gBAC5B,CAAC,CAAC,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,CAAC;gBAC3D,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC;YAEvB,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;YAClE,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACjE,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAE3D,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,kBAAkB,CAC9B,WAAmB,EACnB,QAAmC;QAEnC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAC5B,IAAI,CAAC,WAAW,EAChB,uBAAuB,EACvB,WAAW,EACX,eAAe,CAChB,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;YAEtE,QAAQ,QAAQ,EAAE,CAAC;gBACjB,KAAK,QAAQ;oBACX,IAAI,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;wBAC3B,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBACrC,CAAC;oBACD,IAAI,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;wBACxC,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;oBAChD,CAAC;oBACD,MAAM;gBACR,KAAK,MAAM;oBACT,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;wBACzB,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;oBAC7B,CAAC;oBACD,IAAI,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;wBACtC,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;oBACrC,CAAC;oBACD,MAAM;gBACR,KAAK,KAAK;oBACR,IAAI,QAAQ,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;wBAC3B,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;oBACrC,CAAC;oBACD,IAAI,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;wBACxC,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;oBAC5C,CAAC;oBACD,MAAM;YACV,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,kBAAkB,CAC9B,WAAmB,EACnB,aAA4B,EAC5B,MAAW;QAEX,IAAI,CAAC;YACH,0DAA0D;YAC1D,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CACrC,wDAAwD,CACzD,CAAC;YAEF,0BAA0B;YAC1B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACrD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,QAAQ;oBAClB,KAAK,EAAE,6FAA6F;iBACrG,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YAEtE,yDAAyD;YACzD,MAAM,WAAW,GAAG,IAAI,aAAa,CAAC,SAAS,GAAG,CAAC;YACnD,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;YAEnE,IAAI,aAAa,EAAE,CAAC;gBAClB,oDAAoD;gBACpD,MAAM,IAAI,CAAC,6BAA6B,CAAC,WAAW,EAAE,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;gBAEpG,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,QAAQ;oBAClB,WAAW,EAAE,aAAa,CAAC,MAAM;oBACjC,QAAQ,EAAE,aAAa,CAAC,QAAQ;oBAChC,OAAO,EAAE,IAAI;oBACb,UAAU,EAAE,oCAAoC,aAAa,CAAC,MAAM,EAAE;iBACvE,CAAC;YACJ,CAAC;YAED,oCAAoC;YACpC,MAAM,aAAa,GAAa,EAAE,CAAC;YAEnC,KAAK,MAAM,EAAE,IAAI,aAAa,CAAC,WAAW,EAAE,CAAC;gBAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,WAAW,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC;gBAEvE,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC;wBAC9C,SAAS,EAAE,aAAa,CAAC,SAAS;wBAClC,WAAW,EAAE,EAAE,CAAC,EAAE;wBAClB,KAAK,EAAE,EAAE,CAAC,KAAK;wBACf,IAAI;wBACJ,MAAM,EAAE,CAAC,WAAW,EAAE,cAAc,CAAC;qBACtC,CAAC,CAAC;oBACH,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACjC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,6BAA6B,KAAK,CAAC,MAAM,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC5E,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC,CAAC;gBACzE,CAAC;YACH,CAAC;YAED,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/B,sEAAsE;gBACtE,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC,SAAS,KAAK,aAAa,CAAC,KAAK,EAAE,CAAC;gBACpE,MAAM,IAAI,GAAG,IAAI,CAAC,0BAA0B,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;gBAEzE,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC;gBAClG,MAAM,IAAI,CAAC,6BAA6B,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAEpF,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,QAAQ;oBAClB,WAAW,EAAE,KAAK,CAAC,MAAM;oBACzB,QAAQ,EAAE,KAAK,CAAC,QAAQ;iBACzB,CAAC;YACJ,CAAC;YAED,2CAA2C;YAC3C,MAAM,IAAI,CAAC,6BAA6B,CACtC,WAAW,EACX,aAAa,CAAC,CAAC,CAAC,EAChB,sBAAsB,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,WAAW,aAAa,CAAC,CAAC,CAAC,EAAE,CACnF,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,QAAQ;gBAClB,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC;gBAC7B,QAAQ,EAAE,sBAAsB,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,WAAW,aAAa,CAAC,CAAC,CAAC,EAAE;aAC7F,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,QAAQ;gBAClB,KAAK,EAAE,YAAY;aACpB,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAC5B,WAAmB,EACnB,aAA4B,EAC5B,MAAW;QAEX,IAAI,CAAC;YACH,iCAAiC;YACjC,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,qCAAqC,CAAC,CAAC;YAE3E,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;YAClE,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;YACjC,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC;YAE1E,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC3B,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,MAAM;oBAChB,KAAK,EAAE,uFAAuF;iBAC/F,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAEhC,8BAA8B;YAC9B,MAAM,WAAW,GAAG,IAAI,aAAa,CAAC,SAAS,KAAK,aAAa,CAAC,KAAK,EAAE,CAAC;YAC1E,MAAM,eAAe,GAAG,IAAI,CAAC,wBAAwB,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;YAElF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,WAAW,CACnC;gBACE,SAAS,EAAE,MAAM;gBACjB,OAAO,EAAE,WAAW;gBACpB,WAAW,EAAE,eAAe;gBAC5B,MAAM,EAAE,CAAC,WAAW,EAAE,cAAc,CAAC;aACtC,EACD,UAAU,CACX,CAAC;YAEF,kBAAkB;YAClB,MAAM,IAAI,CAAC,2BAA2B,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAEzE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,wBAAwB,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAEpD,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,MAAM;gBAChB,WAAW,EAAE,IAAI,CAAC,GAAG;gBACrB,QAAQ,EAAE,WAAW,MAAM,WAAW,IAAI,CAAC,GAAG,EAAE;aACjD,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,MAAM;gBAChB,KAAK,EAAE,YAAY;aACpB,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe,CAC3B,WAAmB,EACnB,aAA4B,EAC5B,MAAW;QAEX,IAAI,CAAC;YACH,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,mCAAmC,CAAC,CAAC;YACxE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,yCAAyC,CAAC,CAAC;YAE9E,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;YAChE,MAAM,YAAY,GAAG,SAAS,CAAC,gBAAgB,IAAI,SAAS,CAAC,YAAY,CAAC;YAC1E,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;YAElC,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC9B,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,KAAK;oBACf,KAAK,EAAE,wGAAwG;iBAChH,CAAC;YACJ,CAAC;YAED,MAAM,GAAG,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC;YACpC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,KAAK;oBACf,KAAK,EAAE,yCAAyC;iBACjD,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;gBAC3B,GAAG;gBACH,YAAY;gBACZ,OAAO;aACR,CAAC,CAAC;YAEH,2BAA2B;YAC3B,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC,SAAS,KAAK,aAAa,CAAC,KAAK,EAAE,CAAC;YACpE,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;YAEzE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC;gBAC3C,YAAY,EAAE,SAAS;gBACvB,KAAK;gBACL,WAAW;gBACX,IAAI,EAAE,CAAC,WAAW,EAAE,cAAc,CAAC;aACpC,CAAC,CAAC;YAEH,kBAAkB;YAClB,MAAM,IAAI,CAAC,6BAA6B,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;YAEjF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,2BAA2B,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;YAE1D,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,KAAK;gBACf,WAAW,EAAE,QAAQ,CAAC,EAAE;gBACxB,QAAQ,EAAE,QAAQ,CAAC,GAAG;aACvB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,KAAK;gBACf,KAAK,EAAE,YAAY;aACpB,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAC5B,MAAW;QAEX,2BAA2B;QAC3B,IAAI,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YAC5D,OAAO;gBACL,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK;gBAC/B,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI;aAC9B,CAAC;QACJ,CAAC;QAED,iBAAiB;QACjB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,IAAI,EAAE,CAAC;QAC7C,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAU,EAAE,CAAC;YACvD,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;gBACnF,OAAO;oBACL,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK;oBAC3B,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI;iBAC1B,CAAC;YACJ,CAAC;QACH,CAAC;QAED,qBAAqB;QACrB,IAAI,MAAM,CAAC,YAAY,EAAE,KAAK,IAAI,MAAM,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;YAC5D,OAAO;gBACL,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,KAAK;gBAChC,IAAI,EAAE,MAAM,CAAC,YAAY,CAAC,IAAI;aAC/B,CAAC;QACJ,CAAC;QAED,2BAA2B;QAC3B,IAAI,CAAC;YACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;YACnD,MAAM,SAAS,GAAG,QAAQ,CAAC,2BAA2B,EAAE;gBACtD,GAAG,EAAE,IAAI,CAAC,WAAW;gBACrB,QAAQ,EAAE,OAAO;aAClB,CAAC,CAAC,IAAI,EAAE,CAAC;YAEV,mBAAmB;YACnB,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;YAClE,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO;oBACL,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;oBACf,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;iBACf,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,uBAAuB;QACzB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,oBAAoB,CAC1B,WAAmB,EACnB,aAA4B,EAC5B,EAAmD;QAEnD,OAAO,MAAM,EAAE,CAAC,KAAK;;eAEV,aAAa,CAAC,SAAS;iBACrB,WAAW;kBACV,EAAE,CAAC,EAAE;EACrB,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE;;;;gEAIgB,WAAW;;;;;CAK1E,CAAC;IACA,CAAC;IAED;;OAEG;IACK,0BAA0B,CAChC,WAAmB,EACnB,aAA4B;QAE5B,MAAM,eAAe,GAAG,aAAa,CAAC,WAAW;aAC9C,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC;aAC1C,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,OAAO,MAAM,aAAa,CAAC,KAAK;;eAErB,aAAa,CAAC,SAAS;cACxB,aAAa,CAAC,MAAM;;;;EAIhC,eAAe,IAAI,2BAA2B;;;;qEAIqB,WAAW;uEACT,WAAW;;;;;CAKjF,CAAC;IACA,CAAC;IAED;;OAEG;IACK,wBAAwB,CAC9B,WAAmB,EACnB,aAA4B;QAE5B,MAAM,eAAe,GAAG,aAAa,CAAC,WAAW;aAC9C,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC;aACtC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,OAAO,OAAO,aAAa,CAAC,KAAK;;aAExB,aAAa,CAAC,SAAS;eACrB,WAAW;;;;EAIxB,eAAe,IAAI,2BAA2B;;;;;CAK/C,CAAC;IACA,CAAC;IAED;;OAEG;IACK,mBAAmB,CACzB,WAAmB,EACnB,aAA4B;QAE5B,MAAM,eAAe,GAAG,aAAa,CAAC,WAAW;aAC9C,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC;aAC7C,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,OAAO,OAAO,aAAa,CAAC,KAAK;;+BAEN,aAAa,CAAC,SAAS;8BACxB,WAAW;;;;EAIvC,eAAe,IAAI,2CAA2C;;;;;CAK/D,CAAC;IACA,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,6BAA6B,CACzC,WAAmB,EACnB,WAAmB,EACnB,QAAgB;QAEhB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAC5B,IAAI,CAAC,WAAW,EAChB,uBAAuB,EACvB,WAAW,EACX,eAAe,CAChB,CAAC;QAEF,IAAI,QAAQ,GAAQ,EAAE,CAAC;QACvB,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7B,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;QAClE,CAAC;QAED,QAAQ,CAAC,MAAM,GAAG;YAChB,KAAK,EAAE,WAAW;YAClB,GAAG,EAAE,QAAQ;YACb,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACjC,CAAC;QAEF,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC/E,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,2BAA2B,CACvC,WAAmB,EACnB,QAAgB,EAChB,QAAgB;QAEhB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAC5B,IAAI,CAAC,WAAW,EAChB,uBAAuB,EACvB,WAAW,EACX,eAAe,CAChB,CAAC;QAEF,IAAI,QAAQ,GAAQ,EAAE,CAAC;QACvB,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7B,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;QAClE,CAAC;QAED,QAAQ,CAAC,IAAI,GAAG;YACd,KAAK,EAAE,QAAQ;YACf,GAAG,EAAE,QAAQ;YACb,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACjC,CAAC;QAEF,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC/E,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,6BAA6B,CACzC,WAAmB,EACnB,UAAkB,EAClB,WAAmB;QAEnB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAC5B,IAAI,CAAC,WAAW,EAChB,uBAAuB,EACvB,WAAW,EACX,eAAe,CAChB,CAAC;QAEF,IAAI,QAAQ,GAAQ,EAAE,CAAC;QACvB,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7B,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;QAClE,CAAC;QAED,QAAQ,CAAC,GAAG,GAAG;YACb,QAAQ,EAAE,UAAU;YACpB,GAAG,EAAE,WAAW;YAChB,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACjC,CAAC;QAEF,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC/E,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,WAAmB,EACnB,WAAmB,EACnB,MAAe;IAEf,MAAM,OAAO,GAAG,IAAI,wBAAwB,CAAC;QAC3C,WAAW;QACX,MAAM;KACP,CAAC,CAAC;IACH,OAAO,OAAO,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -40,8 +40,10 @@ export interface CompletionCommentData {
|
|
|
40
40
|
export declare class FormatPreservationSyncService {
|
|
41
41
|
private logger;
|
|
42
42
|
private config;
|
|
43
|
+
private projectRoot;
|
|
43
44
|
constructor(config?: SyncConfig, options?: {
|
|
44
45
|
logger?: Logger;
|
|
46
|
+
projectRoot?: string;
|
|
45
47
|
});
|
|
46
48
|
/**
|
|
47
49
|
* Sync User Story to external tool with origin-based routing
|
|
@@ -94,5 +96,21 @@ export declare class FormatPreservationSyncService {
|
|
|
94
96
|
* Examples: "GH-#123" → 123, "#456" → 456
|
|
95
97
|
*/
|
|
96
98
|
private extractIssueNumber;
|
|
99
|
+
/**
|
|
100
|
+
* Post JIRA comment with atomic locking to prevent concurrent duplicates
|
|
101
|
+
* FIX (v1.0.20): Prevent duplicate comments under concurrent load
|
|
102
|
+
*
|
|
103
|
+
* Note: JIRA doesn't have a simple getComments API exposed in our client,
|
|
104
|
+
* so we rely on atomic locking to serialize comment posts per issue.
|
|
105
|
+
*/
|
|
106
|
+
private postJiraCommentWithIdempotency;
|
|
107
|
+
/**
|
|
108
|
+
* Post ADO comment with atomic locking to prevent concurrent duplicates
|
|
109
|
+
* FIX (v1.0.20): Prevent duplicate comments under concurrent load
|
|
110
|
+
*
|
|
111
|
+
* Note: ADO doesn't have a simple getComments API exposed in our client,
|
|
112
|
+
* so we rely on atomic locking to serialize comment posts per work item.
|
|
113
|
+
*/
|
|
114
|
+
private postAdoCommentWithIdempotency;
|
|
97
115
|
}
|
|
98
116
|
//# sourceMappingURL=format-preservation-sync.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format-preservation-sync.d.ts","sourceRoot":"","sources":["../../../src/sync/format-preservation-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"format-preservation-sync.d.ts","sourceRoot":"","sources":["../../../src/sync/format-preservation-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,gBAAgB,EAAa,MAAM,iCAAiC,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,wDAAwD,CAAC;AACxF,OAAO,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAiB,MAAM,oBAAoB,CAAC;AAG3D,MAAM,WAAW,UAAU;IACzB,yEAAyE;IACzE,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAEjC,+EAA+E;IAC/E,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAEjC,6CAA6C;IAC7C,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,kBAAkB,EAAE,gBAAgB,EAAE,CAAC;IACvC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,6BAA6B;IACxC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,WAAW,CAAS;gBAG1B,MAAM,GAAE,UAAe,EACvB,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO;IAWzD;;;;;OAKG;IACG,aAAa,CACjB,MAAM,EAAE,gBAAgB,EACxB,cAAc,EAAE,qBAAqB,EACrC,cAAc,EAAE,cAAc,GAAG,UAAU,GAAG,SAAS,GACtD,OAAO,CAAC,IAAI,CAAC;IAchB;;;;OAIG;YACW,cAAc;IAoE5B;;;;;;OAMG;YACW,oBAAoB;IAqClC;;;;OAIG;YACW,cAAc;IAyE5B;;;;;;;;;;;;;;;;;OAiBG;IACH,sBAAsB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM;IA0C3D;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAK1B;;;;;;OAMG;YACW,8BAA8B;IAmC5C;;;;;;OAMG;YACW,6BAA6B;CAkC5C"}
|
|
@@ -8,11 +8,13 @@
|
|
|
8
8
|
* - External US (origin=external): Comment-only sync (no title/description changes)
|
|
9
9
|
* - Internal US (origin=internal): Full sync (title, description, status, comments)
|
|
10
10
|
*/
|
|
11
|
+
import path from 'path';
|
|
11
12
|
import { getOrigin } from '../types/living-docs-us-file.js';
|
|
12
13
|
import { GitHubClientV2 } from '../../plugins/specweave-github/lib/github-client-v2.js';
|
|
13
14
|
import { JiraClient } from '../integrations/jira/jira-client.js';
|
|
14
15
|
import { AdoClient } from '../integrations/ado/ado-client.js';
|
|
15
16
|
import { consoleLogger } from '../utils/logger.js';
|
|
17
|
+
import { LockManager } from '../utils/lock-manager.js';
|
|
16
18
|
export class FormatPreservationSyncService {
|
|
17
19
|
constructor(config = {}, options = {}) {
|
|
18
20
|
this.config = {
|
|
@@ -21,6 +23,7 @@ export class FormatPreservationSyncService {
|
|
|
21
23
|
canUpdateStatus: config.canUpdateStatus ?? false
|
|
22
24
|
};
|
|
23
25
|
this.logger = options.logger ?? consoleLogger;
|
|
26
|
+
this.projectRoot = options.projectRoot ?? process.cwd();
|
|
24
27
|
}
|
|
25
28
|
/**
|
|
26
29
|
* Sync User Story to external tool with origin-based routing
|
|
@@ -49,27 +52,45 @@ export class FormatPreservationSyncService {
|
|
|
49
52
|
this.logger.log(` 💬 External US: Comment-only sync (format preserved)`);
|
|
50
53
|
// Build completion comment
|
|
51
54
|
const comment = this.buildCompletionComment(completionData);
|
|
52
|
-
// Post comment to external tool with idempotency check
|
|
55
|
+
// Post comment to external tool with idempotency check + atomic locking
|
|
53
56
|
if (externalClient instanceof GitHubClientV2) {
|
|
54
57
|
// FIX (v0.26.0): Idempotency check to prevent duplicate comments
|
|
58
|
+
// FIX (v1.0.20): Atomic locking to prevent TOCTOU race condition
|
|
55
59
|
// See: .specweave/increments/0051-*/reports/GITHUB-COMMENT-RECURSION-ROOT-CAUSE-2025-11-24.md
|
|
56
60
|
const issueNumber = usFile.external_tools?.github?.number || 0;
|
|
57
|
-
//
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
61
|
+
// ATOMIC LOCK: Prevent race condition between check and post
|
|
62
|
+
const lockDir = path.join(this.projectRoot, '.specweave/state/.locks', `github-comment-${issueNumber}`);
|
|
63
|
+
const lockManager = new LockManager(lockDir, 30, { logger: this.logger }); // 30s stale threshold
|
|
64
|
+
let lockAcquired = false;
|
|
65
|
+
try {
|
|
66
|
+
lockAcquired = await lockManager.acquire();
|
|
67
|
+
if (!lockAcquired) {
|
|
68
|
+
this.logger.log(` ⏳ Issue #${issueNumber} - Another comment in progress, skipping`);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
// Check if we already posted this exact comment (within lock)
|
|
72
|
+
const lastComment = await externalClient.getLastComment(issueNumber);
|
|
73
|
+
if (lastComment && lastComment.body === comment) {
|
|
74
|
+
this.logger.log(` ⏭️ Skipping duplicate comment (already posted)`);
|
|
75
|
+
return; // Idempotency: Don't post duplicate!
|
|
76
|
+
}
|
|
77
|
+
await externalClient.addComment(issueNumber, comment);
|
|
78
|
+
this.logger.log(` ✅ Posted progress comment to issue #${issueNumber}`);
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
if (lockAcquired) {
|
|
82
|
+
await lockManager.release();
|
|
83
|
+
}
|
|
62
84
|
}
|
|
63
|
-
await externalClient.addComment(issueNumber, comment);
|
|
64
|
-
this.logger.log(` ✅ Posted progress comment to issue #${issueNumber}`);
|
|
65
85
|
}
|
|
66
86
|
else if (externalClient instanceof JiraClient) {
|
|
67
|
-
const issueKey = usFile.external_id || '';
|
|
68
|
-
await
|
|
87
|
+
const issueKey = usFile.external_id || usFile.external_tools?.jira?.key || '';
|
|
88
|
+
await this.postJiraCommentWithIdempotency(externalClient, String(issueKey), comment);
|
|
69
89
|
}
|
|
70
90
|
else if (externalClient instanceof AdoClient) {
|
|
71
|
-
const
|
|
72
|
-
|
|
91
|
+
const adoId = usFile.external_id || usFile.external_tools?.ado?.id || '0';
|
|
92
|
+
const workItemId = parseInt(String(adoId), 10);
|
|
93
|
+
await this.postAdoCommentWithIdempotency(externalClient, workItemId, comment);
|
|
73
94
|
}
|
|
74
95
|
// Conditional status update (only if config allows AND progress is 100%)
|
|
75
96
|
if (this.config.canUpdateStatus && completionData.progressPercentage === 100) {
|
|
@@ -137,29 +158,48 @@ export class FormatPreservationSyncService {
|
|
|
137
158
|
this.logger.log(` ✅ External updates enabled`);
|
|
138
159
|
// Build completion comment
|
|
139
160
|
const comment = this.buildCompletionComment(completionData);
|
|
140
|
-
// Post comment with idempotency check
|
|
161
|
+
// Post comment with idempotency check + atomic locking
|
|
141
162
|
if (externalClient instanceof GitHubClientV2) {
|
|
142
163
|
// FIX (v0.26.0): Idempotency check to prevent duplicate comments
|
|
164
|
+
// FIX (v1.0.20): Atomic locking to prevent TOCTOU race condition
|
|
143
165
|
const issueNumber = usFile.external_tools?.github?.number || 0;
|
|
144
|
-
//
|
|
145
|
-
const
|
|
146
|
-
|
|
147
|
-
|
|
166
|
+
// ATOMIC LOCK: Prevent race condition between check and post
|
|
167
|
+
const lockDir = path.join(this.projectRoot, '.specweave/state/.locks', `github-comment-${issueNumber}`);
|
|
168
|
+
const lockManager = new LockManager(lockDir, 30, { logger: this.logger });
|
|
169
|
+
let lockAcquired = false;
|
|
170
|
+
try {
|
|
171
|
+
lockAcquired = await lockManager.acquire();
|
|
172
|
+
if (!lockAcquired) {
|
|
173
|
+
this.logger.log(` ⏳ Issue #${issueNumber} - Another comment in progress, skipping`);
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
// Check if we already posted this exact comment (within lock)
|
|
177
|
+
const lastComment = await externalClient.getLastComment(issueNumber);
|
|
178
|
+
if (lastComment && lastComment.body === comment) {
|
|
179
|
+
this.logger.log(` ⏭️ Skipping duplicate comment (already posted)`);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
await externalClient.addComment(issueNumber, comment);
|
|
183
|
+
this.logger.log(` ✅ Posted progress comment to issue #${issueNumber}`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
148
186
|
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
187
|
+
finally {
|
|
188
|
+
if (lockAcquired) {
|
|
189
|
+
await lockManager.release();
|
|
190
|
+
}
|
|
152
191
|
}
|
|
153
192
|
// Update title/description if needed
|
|
154
193
|
// TODO: Implement title/description update logic
|
|
155
194
|
}
|
|
156
195
|
else if (externalClient instanceof JiraClient) {
|
|
157
|
-
const issueKey = usFile.external_id || '';
|
|
158
|
-
await
|
|
196
|
+
const issueKey = usFile.external_id || usFile.external_tools?.jira?.key || '';
|
|
197
|
+
await this.postJiraCommentWithIdempotency(externalClient, String(issueKey), comment);
|
|
159
198
|
}
|
|
160
199
|
else if (externalClient instanceof AdoClient) {
|
|
161
|
-
const
|
|
162
|
-
|
|
200
|
+
const adoId = usFile.external_id || usFile.external_tools?.ado?.id || '0';
|
|
201
|
+
const workItemId = parseInt(String(adoId), 10);
|
|
202
|
+
await this.postAdoCommentWithIdempotency(externalClient, workItemId, comment);
|
|
163
203
|
}
|
|
164
204
|
// Update status if allowed AND progress is 100%
|
|
165
205
|
if (this.config.canUpdateStatus && completionData.progressPercentage === 100) {
|
|
@@ -235,5 +275,67 @@ export class FormatPreservationSyncService {
|
|
|
235
275
|
const match = externalId.match(/#(\d+)/);
|
|
236
276
|
return match ? parseInt(match[1], 10) : 0;
|
|
237
277
|
}
|
|
278
|
+
/**
|
|
279
|
+
* Post JIRA comment with atomic locking to prevent concurrent duplicates
|
|
280
|
+
* FIX (v1.0.20): Prevent duplicate comments under concurrent load
|
|
281
|
+
*
|
|
282
|
+
* Note: JIRA doesn't have a simple getComments API exposed in our client,
|
|
283
|
+
* so we rely on atomic locking to serialize comment posts per issue.
|
|
284
|
+
*/
|
|
285
|
+
async postJiraCommentWithIdempotency(client, issueKey, comment) {
|
|
286
|
+
if (!issueKey) {
|
|
287
|
+
this.logger.log(` ⚠️ No JIRA issue key, skipping comment`);
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
// ATOMIC LOCK: Serialize comment posts per issue to prevent duplicates
|
|
291
|
+
const lockDir = path.join(this.projectRoot, '.specweave/state/.locks', `jira-comment-${issueKey}`.toLowerCase().replace(/[^a-z0-9-]/g, '-'));
|
|
292
|
+
const lockManager = new LockManager(lockDir, 30, { logger: this.logger });
|
|
293
|
+
let lockAcquired = false;
|
|
294
|
+
try {
|
|
295
|
+
lockAcquired = await lockManager.acquire();
|
|
296
|
+
if (!lockAcquired) {
|
|
297
|
+
this.logger.log(` ⏳ JIRA ${issueKey} - Another comment in progress, skipping`);
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
await client.addComment(issueKey, comment);
|
|
301
|
+
this.logger.log(` ✅ Posted progress comment to JIRA ${issueKey}`);
|
|
302
|
+
}
|
|
303
|
+
finally {
|
|
304
|
+
if (lockAcquired) {
|
|
305
|
+
await lockManager.release();
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Post ADO comment with atomic locking to prevent concurrent duplicates
|
|
311
|
+
* FIX (v1.0.20): Prevent duplicate comments under concurrent load
|
|
312
|
+
*
|
|
313
|
+
* Note: ADO doesn't have a simple getComments API exposed in our client,
|
|
314
|
+
* so we rely on atomic locking to serialize comment posts per work item.
|
|
315
|
+
*/
|
|
316
|
+
async postAdoCommentWithIdempotency(client, workItemId, comment) {
|
|
317
|
+
if (!workItemId) {
|
|
318
|
+
this.logger.log(` ⚠️ No ADO work item ID, skipping comment`);
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
// ATOMIC LOCK: Serialize comment posts per work item to prevent duplicates
|
|
322
|
+
const lockDir = path.join(this.projectRoot, '.specweave/state/.locks', `ado-comment-${workItemId}`);
|
|
323
|
+
const lockManager = new LockManager(lockDir, 30, { logger: this.logger });
|
|
324
|
+
let lockAcquired = false;
|
|
325
|
+
try {
|
|
326
|
+
lockAcquired = await lockManager.acquire();
|
|
327
|
+
if (!lockAcquired) {
|
|
328
|
+
this.logger.log(` ⏳ ADO #${workItemId} - Another comment in progress, skipping`);
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
await client.addComment(workItemId, comment);
|
|
332
|
+
this.logger.log(` ✅ Posted progress comment to ADO #${workItemId}`);
|
|
333
|
+
}
|
|
334
|
+
finally {
|
|
335
|
+
if (lockAcquired) {
|
|
336
|
+
await lockManager.release();
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
238
340
|
}
|
|
239
341
|
//# sourceMappingURL=format-preservation-sync.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format-preservation-sync.js","sourceRoot":"","sources":["../../../src/sync/format-preservation-sync.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"format-preservation-sync.js","sourceRoot":"","sources":["../../../src/sync/format-preservation-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAoB,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,wDAAwD,CAAC;AACxF,OAAO,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAC9D,OAAO,EAAU,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAgCvD,MAAM,OAAO,6BAA6B;IAKxC,YACE,SAAqB,EAAE,EACvB,UAAqD,EAAE;QAEvD,IAAI,CAAC,MAAM,GAAG;YACZ,sBAAsB,EAAE,MAAM,CAAC,sBAAsB,IAAI,KAAK;YAC9D,sBAAsB,EAAE,MAAM,CAAC,sBAAsB,IAAI,KAAK;YAC9D,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,KAAK;SACjD,CAAC;QACF,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC;QAC9C,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1D,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,aAAa,CACjB,MAAwB,EACxB,cAAqC,EACrC,cAAuD;QAEvD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QAEjC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,EAAE,aAAa,MAAM,GAAG,CAAC,CAAC;QAE/D,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;YAC1B,oDAAoD;YACpD,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,0CAA0C;YAC1C,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,cAAc,CAC1B,MAAwB,EACxB,cAAqC,EACrC,cAAuD;QAEvD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QAE1E,2BAA2B;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC;QAE5D,wEAAwE;QACxE,IAAI,cAAc,YAAY,cAAc,EAAE,CAAC;YAC7C,iEAAiE;YACjE,iEAAiE;YACjE,8FAA8F;YAC9F,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC;YAE/D,6DAA6D;YAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CACvB,IAAI,CAAC,WAAW,EAChB,yBAAyB,EACzB,kBAAkB,WAAW,EAAE,CAChC,CAAC;YACF,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,sBAAsB;YAEjG,IAAI,YAAY,GAAG,KAAK,CAAC;YACzB,IAAI,CAAC;gBACH,YAAY,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;gBAC3C,IAAI,CAAC,YAAY,EAAE,CAAC;oBAClB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,WAAW,0CAA0C,CAAC,CAAC;oBACrF,OAAO;gBACT,CAAC;gBAED,8DAA8D;gBAC9D,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;gBAErE,IAAI,WAAW,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAChD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;oBACrE,OAAO,CAAE,qCAAqC;gBAChD,CAAC;gBAED,MAAM,cAAc,CAAC,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;gBACtD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,yCAAyC,WAAW,EAAE,CAAC,CAAC;YAC1E,CAAC;oBAAS,CAAC;gBACT,IAAI,YAAY,EAAE,CAAC;oBACjB,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;gBAC9B,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,cAAc,YAAY,UAAU,EAAE,CAAC;YAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,cAAc,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;YAC9E,MAAM,IAAI,CAAC,8BAA8B,CAAC,cAAc,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;QACvF,CAAC;aAAM,IAAI,cAAc,YAAY,SAAS,EAAE,CAAC;YAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,cAAc,EAAE,GAAG,EAAE,EAAE,IAAI,GAAG,CAAC;YAC1E,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/C,MAAM,IAAI,CAAC,6BAA6B,CAAC,cAAc,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QAChF,CAAC;QAED,yEAAyE;QACzE,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,cAAc,CAAC,kBAAkB,KAAK,GAAG,EAAE,CAAC;YAC7E,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;YAC9D,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;QAClE,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0CAA0C,cAAc,CAAC,kBAAkB,WAAW,CAAC,CAAC;QAC1G,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,oBAAoB,CAChC,MAAwB,EACxB,YAAoB,EACpB,cAAuD;QAEvD,IAAI,CAAC;YACH,IAAI,cAAc,YAAY,UAAU,EAAE,CAAC;gBACzC,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,EAAE,IAAI,EAAE,GAAG,IAAI,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC;gBAC9E,IAAI,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvC,MAAM,cAAc,CAAC,WAAW,CAAC;wBAC/B,GAAG,EAAE,QAAQ;wBACb,MAAM,EAAE,YAAY;qBACrB,CAAC,CAAC;oBACH,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,yBAAyB,QAAQ,OAAO,YAAY,EAAE,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC;iBAAM,IAAI,cAAc,YAAY,SAAS,EAAE,CAAC;gBAC/C,MAAM,UAAU,GAAG,MAAM,CAAC,cAAc,EAAE,GAAG,EAAE,EAAE,IAAI,QAAQ,CAAC,MAAM,CAAC,WAAW,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC7F,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;oBACnB,MAAM,cAAc,CAAC,cAAc,CAAC;wBAClC,EAAE,EAAE,UAAU;wBACd,KAAK,EAAE,YAAY,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY;qBACzD,CAAC,CAAC;oBACH,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,8BAA8B,UAAU,OAAO,YAAY,EAAE,CAAC,CAAC;gBACjF,CAAC;YACH,CAAC;iBAAM,IAAI,cAAc,YAAY,cAAc,EAAE,CAAC;gBACpD,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC;gBAC/D,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;oBACpB,MAAM,cAAc,CAAC,UAAU,CAAC,WAAW,EAAE,mDAAmD,CAAC,CAAC;oBAClG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,WAAW,EAAE,CAAC,CAAC;gBAC7D,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,+BAA+B,KAAK,EAAE,CAAC,CAAC;YACxD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,cAAc,CAC1B,MAAwB,EACxB,cAAqC,EACrC,cAAuD;QAEvD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;QAEjE,yDAAyD;QACzD,IAAI,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAEhD,2BAA2B;YAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC;YAE5D,uDAAuD;YACvD,IAAI,cAAc,YAAY,cAAc,EAAE,CAAC;gBAC7C,iEAAiE;gBACjE,iEAAiE;gBACjE,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC;gBAE/D,6DAA6D;gBAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CACvB,IAAI,CAAC,WAAW,EAChB,yBAAyB,EACzB,kBAAkB,WAAW,EAAE,CAChC,CAAC;gBACF,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;gBAE1E,IAAI,YAAY,GAAG,KAAK,CAAC;gBACzB,IAAI,CAAC;oBACH,YAAY,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;oBAC3C,IAAI,CAAC,YAAY,EAAE,CAAC;wBAClB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,WAAW,0CAA0C,CAAC,CAAC;oBACvF,CAAC;yBAAM,CAAC;wBACN,8DAA8D;wBAC9D,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;wBAErE,IAAI,WAAW,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;4BAChD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;wBACvE,CAAC;6BAAM,CAAC;4BACN,MAAM,cAAc,CAAC,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;4BACtD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,yCAAyC,WAAW,EAAE,CAAC,CAAC;wBAC1E,CAAC;oBACH,CAAC;gBACH,CAAC;wBAAS,CAAC;oBACT,IAAI,YAAY,EAAE,CAAC;wBACjB,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;oBAC9B,CAAC;gBACH,CAAC;gBAED,qCAAqC;gBACrC,iDAAiD;YACnD,CAAC;iBAAM,IAAI,cAAc,YAAY,UAAU,EAAE,CAAC;gBAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,cAAc,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;gBAC9E,MAAM,IAAI,CAAC,8BAA8B,CAAC,cAAc,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;YACvF,CAAC;iBAAM,IAAI,cAAc,YAAY,SAAS,EAAE,CAAC;gBAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,cAAc,EAAE,GAAG,EAAE,EAAE,IAAI,GAAG,CAAC;gBAC1E,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC/C,MAAM,IAAI,CAAC,6BAA6B,CAAC,cAAc,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;YAChF,CAAC;YAED,gDAAgD;YAChD,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,cAAc,CAAC,kBAAkB,KAAK,GAAG,EAAE,CAAC;gBAC7E,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;gBAC9D,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;YAClE,CAAC;iBAAM,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;gBACvC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0CAA0C,cAAc,CAAC,kBAAkB,WAAW,CAAC,CAAC;YAC1G,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,sBAAsB,CAAC,IAA2B;QAChD,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,kBAAkB;QAClB,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC3D,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YACnD,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,sBAAsB;QACtB,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;QACxE,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;gBAC9B,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;YACtD,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,mBAAmB;QACnB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QACrC,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,iBAAiB,SAAS,IAAI,UAAU,qBAAqB,IAAI,CAAC,kBAAkB,IAAI,CAAC,CAAC;QACrG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,mBAAmB;QACnB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QAC1D,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACK,kBAAkB,CAAC,UAAkB;QAC3C,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACzC,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,8BAA8B,CAC1C,MAAkB,EAClB,QAAgB,EAChB,OAAe;QAEf,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QAED,uEAAuE;QACvE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CACvB,IAAI,CAAC,WAAW,EAChB,yBAAyB,EACzB,gBAAgB,QAAQ,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CACrE,CAAC;QACF,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAE1E,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC;YACH,YAAY,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;YAC3C,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,QAAQ,0CAA0C,CAAC,CAAC;gBAChF,OAAO;YACT,CAAC;YAED,MAAM,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC3C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,uCAAuC,QAAQ,EAAE,CAAC,CAAC;QACrE,CAAC;gBAAS,CAAC;YACT,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,6BAA6B,CACzC,MAAiB,EACjB,UAAkB,EAClB,OAAe;QAEf,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;YAC9D,OAAO;QACT,CAAC;QAED,2EAA2E;QAC3E,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CACvB,IAAI,CAAC,WAAW,EAChB,yBAAyB,EACzB,eAAe,UAAU,EAAE,CAC5B,CAAC;QACF,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAE1E,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC;YACH,YAAY,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;YAC3C,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,UAAU,0CAA0C,CAAC,CAAC;gBAClF,OAAO;YACT,CAAC;YAED,MAAM,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC7C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,uCAAuC,UAAU,EAAE,CAAC,CAAC;QACvE,CAAC;gBAAS,CAAC;YACT,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -41,6 +41,9 @@ export declare class FrontmatterUpdater {
|
|
|
41
41
|
*
|
|
42
42
|
* CRITICAL: This is Layer 1 backfill for 3-layer idempotency
|
|
43
43
|
* Must be called after GitHub issue creation to cache issue number
|
|
44
|
+
*
|
|
45
|
+
* FIX (v1.0.20): Added atomic locking to prevent race conditions when
|
|
46
|
+
* multiple agents update the same user story frontmatter concurrently.
|
|
44
47
|
*/
|
|
45
48
|
updateUserStoryFrontmatter(options: FrontmatterUpdateOptions): Promise<boolean>;
|
|
46
49
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frontmatter-updater.d.ts","sourceRoot":"","sources":["../../../src/sync/frontmatter-updater.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,EAAE,MAAM,EAAiB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"frontmatter-updater.d.ts","sourceRoot":"","sources":["../../../src/sync/frontmatter-updater.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,EAAE,MAAM,EAAiB,MAAM,oBAAoB,CAAC;AAI3D,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,eAAe,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,eAAe,CAAuB;gBAElC,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO;IASnE;;;OAGG;IACH,OAAO,CAAC,YAAY;IAYpB;;;;;;;;OAQG;IACG,0BAA0B,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC;IA4FrF;;OAEG;IACG,uBAAuB,CAC3B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,eAAe,CAAA;KAAE,CAAC,GACpE,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAsB/C;;OAEG;YACW,gBAAgB;IAsC9B;;OAEG;IACG,6BAA6B,CACjC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;CAmCnC"}
|
|
@@ -10,12 +10,13 @@
|
|
|
10
10
|
* - Layer 2: Increment metadata.json (fast, <5ms)
|
|
11
11
|
* - Layer 3: GitHub API query (slow, 500-2000ms)
|
|
12
12
|
*/
|
|
13
|
-
import { readFile, writeFile, readdir } from 'fs/promises';
|
|
13
|
+
import { readFile, writeFile, readdir, mkdir } from 'fs/promises';
|
|
14
14
|
import { existsSync } from 'fs';
|
|
15
15
|
import path from 'path';
|
|
16
16
|
import yaml from 'yaml';
|
|
17
17
|
import { consoleLogger } from '../utils/logger.js';
|
|
18
18
|
import { autoDetectProjectIdSync } from '../utils/project-detection.js';
|
|
19
|
+
import { LockManager } from '../utils/lock-manager.js';
|
|
19
20
|
export class FrontmatterUpdater {
|
|
20
21
|
constructor(options = {}) {
|
|
21
22
|
this.projectRoot = null;
|
|
@@ -47,17 +48,34 @@ export class FrontmatterUpdater {
|
|
|
47
48
|
*
|
|
48
49
|
* CRITICAL: This is Layer 1 backfill for 3-layer idempotency
|
|
49
50
|
* Must be called after GitHub issue creation to cache issue number
|
|
51
|
+
*
|
|
52
|
+
* FIX (v1.0.20): Added atomic locking to prevent race conditions when
|
|
53
|
+
* multiple agents update the same user story frontmatter concurrently.
|
|
50
54
|
*/
|
|
51
55
|
async updateUserStoryFrontmatter(options) {
|
|
56
|
+
const { projectRoot, featureId, userStoryId, githubIssue } = options;
|
|
57
|
+
// ATOMIC LOCK: Prevent race condition when parallel agents update same file
|
|
58
|
+
// Lock is per-user-story file to allow parallel updates to different files
|
|
59
|
+
const locksDir = path.join(projectRoot, '.specweave/state/.locks');
|
|
60
|
+
if (!existsSync(locksDir)) {
|
|
61
|
+
await mkdir(locksDir, { recursive: true });
|
|
62
|
+
}
|
|
63
|
+
const lockDir = path.join(locksDir, `frontmatter-${featureId}-${userStoryId}`.toLowerCase().replace(/[^a-z0-9-]/g, '-'));
|
|
64
|
+
const lockManager = new LockManager(lockDir, 30, { logger: this.logger }); // 30s stale threshold
|
|
65
|
+
let lockAcquired = false;
|
|
52
66
|
try {
|
|
53
|
-
|
|
67
|
+
lockAcquired = await lockManager.acquire();
|
|
68
|
+
if (!lockAcquired) {
|
|
69
|
+
this.logger.log(` ⏳ ${userStoryId} frontmatter update in progress by another agent, skipping`);
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
54
72
|
// Construct user story file path
|
|
55
73
|
const userStoryPath = await this.getUserStoryPath(projectRoot, featureId, userStoryId);
|
|
56
74
|
if (!existsSync(userStoryPath)) {
|
|
57
75
|
this.logger.log(`⚠️ User story file not found: ${userStoryPath}`);
|
|
58
76
|
return false;
|
|
59
77
|
}
|
|
60
|
-
// Read current content
|
|
78
|
+
// Read current content (within lock)
|
|
61
79
|
const content = await readFile(userStoryPath, 'utf-8');
|
|
62
80
|
// Parse frontmatter
|
|
63
81
|
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
@@ -85,7 +103,7 @@ export class FrontmatterUpdater {
|
|
|
85
103
|
const newFrontmatter = yaml.stringify(frontmatter);
|
|
86
104
|
// Replace frontmatter in content
|
|
87
105
|
const newContent = content.replace(/^---\n[\s\S]*?\n---/, `---\n${newFrontmatter.trim()}\n---`);
|
|
88
|
-
// Write back to file
|
|
106
|
+
// Write back to file (within lock)
|
|
89
107
|
await writeFile(userStoryPath, newContent, 'utf-8');
|
|
90
108
|
this.logger.log(` ✅ Updated ${userStoryId} frontmatter with issue #${githubIssue.number}`);
|
|
91
109
|
return true;
|
|
@@ -94,6 +112,12 @@ export class FrontmatterUpdater {
|
|
|
94
112
|
this.logger.error(`❌ Failed to update frontmatter for ${options.userStoryId}:`, error);
|
|
95
113
|
return false;
|
|
96
114
|
}
|
|
115
|
+
finally {
|
|
116
|
+
// ALWAYS release lock
|
|
117
|
+
if (lockAcquired) {
|
|
118
|
+
await lockManager.release();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
97
121
|
}
|
|
98
122
|
/**
|
|
99
123
|
* Batch update multiple user story frontmatters
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frontmatter-updater.js","sourceRoot":"","sources":["../../../src/sync/frontmatter-updater.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"frontmatter-updater.js","sourceRoot":"","sources":["../../../src/sync/frontmatter-updater.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-coordinator.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-coordinator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,EAAE,WAAW,EAAE,MAAM,6CAA6C,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAiB,MAAM,oBAAoB,CAAC;AAK3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAG/E,OAAO,EAAE,cAAc,EAAwB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"sync-coordinator.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-coordinator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,EAAE,WAAW,EAAE,MAAM,6CAA6C,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAiB,MAAM,oBAAoB,CAAC;AAK3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAG/E,OAAO,EAAE,cAAc,EAAwB,MAAM,sBAAsB,CAAC;AAG5E,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,cAAc,GAAG,WAAW,GAAG,WAAW,GAAG,aAAa,GAAG,kBAAkB,GAAG,mBAAmB,CAAC;IAChH,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAC,CAAqB;IACxC,OAAO,CAAC,OAAO,CAAiB;gBAEpB,OAAO,EAAE,sBAAsB;IAa3C;;;;;OAKG;IACH,iBAAiB,IAAI,UAAU,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IAI7D;;OAEG;IACH,0BAA0B,IAAI,MAAM;IAIpC;;;;;;;;;;;;;OAaG;IACG,gCAAgC,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA+V3E;;;;;;;;;;;;;;;OAeG;IACG,+BAA+B,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA0HrE;;;;;;;;OAQG;IACG,6BAA6B,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IA8EjE;;;;;;;;OAQG;IACG,+BAA+B,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IAyGnE;;;;;;;;;;;;OAYG;IACG,oBAAoB,IAAI,OAAO,CAAC,UAAU,GAAG;QAAE,YAAY,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAqI9E;;;;;;;;;;;;;;OAcG;YACW,oBAAoB;IAsDlC;;;OAGG;YACW,wBAAwB;IA2DtC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAuB3B;;OAEG;IACG,uBAAuB,IAAI,OAAO,CAAC,UAAU,CAAC;IA6HpD;;OAEG;YACW,aAAa;IAiL3B;;OAEG;YACW,kBAAkB;IAmEhC;;OAEG;YACW,2BAA2B;IA6FzC;;OAEG;YACW,UAAU;IAWxB;;OAEG;YACW,gBAAgB;IA0B9B;;OAEG;IACH,OAAO,CAAC,0BAA0B;IA0ClC;;;;;;OAMG;IACH,OAAO,CAAC,2BAA2B;CAyCpC"}
|
|
@@ -18,6 +18,7 @@ import { AdoClient } from '../integrations/ado/ado-client.js';
|
|
|
18
18
|
import { getAdoPat } from '../integrations/ado/ado-pat-provider.js';
|
|
19
19
|
import { deriveFeatureId } from '../utils/feature-id-derivation.js';
|
|
20
20
|
import { createClosureMetrics } from './closure-metrics.js';
|
|
21
|
+
import { LockManager } from '../utils/lock-manager.js';
|
|
21
22
|
export class SyncCoordinator {
|
|
22
23
|
constructor(options) {
|
|
23
24
|
this.projectRoot = options.projectRoot;
|
|
@@ -113,9 +114,24 @@ export class SyncCoordinator {
|
|
|
113
114
|
catch (error) {
|
|
114
115
|
this.logger.log('⚠️ Could not create/get milestone, continuing without it');
|
|
115
116
|
}
|
|
116
|
-
// Create issue for each user story (with idempotency)
|
|
117
|
+
// Create issue for each user story (with idempotency + atomic locking)
|
|
118
|
+
// Ensure locks directory exists (once per batch, not per user story)
|
|
119
|
+
const locksDir = path.join(this.projectRoot, '.specweave/state/.locks');
|
|
120
|
+
if (!existsSync(locksDir)) {
|
|
121
|
+
await fs.mkdir(locksDir, { recursive: true });
|
|
122
|
+
}
|
|
117
123
|
for (const usFile of userStories) {
|
|
124
|
+
// ATOMIC LOCK: Prevent race conditions when multiple syncs run concurrently
|
|
125
|
+
// Lock is per-user-story to allow parallel processing of different stories
|
|
126
|
+
const lockDir = path.join(locksDir, `github-issue-${featureId}-${usFile.id}`.toLowerCase().replace(/[^a-z0-9-]/g, '-'));
|
|
127
|
+
const lockManager = new LockManager(lockDir, 60, { logger: this.logger }); // 60s stale threshold
|
|
128
|
+
let lockAcquired = false;
|
|
118
129
|
try {
|
|
130
|
+
lockAcquired = await lockManager.acquire();
|
|
131
|
+
if (!lockAcquired) {
|
|
132
|
+
this.logger.log(` ⏳ ${usFile.id} - Another sync in progress, skipping (lock not acquired)`);
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
119
135
|
// LAYER 1: Check user story frontmatter for existing GitHub issue
|
|
120
136
|
const cachedIssue = await this.frontmatterUpdater.getGitHubIssueFromFrontmatter(this.projectRoot, featureId, usFile.id);
|
|
121
137
|
if (cachedIssue) {
|
|
@@ -306,6 +322,12 @@ export class SyncCoordinator {
|
|
|
306
322
|
catch (error) {
|
|
307
323
|
this.logger.error(` ❌ Failed to create issue for ${usFile.id}:`, error);
|
|
308
324
|
}
|
|
325
|
+
finally {
|
|
326
|
+
// ALWAYS release lock, even on error or early continue
|
|
327
|
+
if (lockAcquired) {
|
|
328
|
+
await lockManager.release();
|
|
329
|
+
}
|
|
330
|
+
}
|
|
309
331
|
}
|
|
310
332
|
if (createdIssues.length > 0) {
|
|
311
333
|
this.logger.log(`\n✅ Created ${createdIssues.length} GitHub issue(s) for ${featureId}`);
|