@speclife/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/claude-cli-adapter.d.ts +57 -0
- package/dist/adapters/claude-cli-adapter.d.ts.map +1 -0
- package/dist/adapters/claude-cli-adapter.js +161 -0
- package/dist/adapters/claude-cli-adapter.js.map +1 -0
- package/dist/adapters/claude-sdk-adapter.d.ts +49 -0
- package/dist/adapters/claude-sdk-adapter.d.ts.map +1 -0
- package/dist/adapters/claude-sdk-adapter.js +278 -0
- package/dist/adapters/claude-sdk-adapter.js.map +1 -0
- package/dist/adapters/cursor-adapter.d.ts +26 -0
- package/dist/adapters/cursor-adapter.d.ts.map +1 -0
- package/dist/adapters/cursor-adapter.js +54 -0
- package/dist/adapters/cursor-adapter.js.map +1 -0
- package/dist/adapters/environment-adapter.d.ts +153 -0
- package/dist/adapters/environment-adapter.d.ts.map +1 -0
- package/dist/adapters/environment-adapter.js +690 -0
- package/dist/adapters/environment-adapter.js.map +1 -0
- package/dist/adapters/git-adapter.d.ts +41 -0
- package/dist/adapters/git-adapter.d.ts.map +1 -0
- package/dist/adapters/git-adapter.js +95 -0
- package/dist/adapters/git-adapter.js.map +1 -0
- package/dist/adapters/github-adapter.d.ts +39 -0
- package/dist/adapters/github-adapter.d.ts.map +1 -0
- package/dist/adapters/github-adapter.js +129 -0
- package/dist/adapters/github-adapter.js.map +1 -0
- package/dist/adapters/index.d.ts +11 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +13 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/openspec-adapter.d.ts +36 -0
- package/dist/adapters/openspec-adapter.d.ts.map +1 -0
- package/dist/adapters/openspec-adapter.js +182 -0
- package/dist/adapters/openspec-adapter.js.map +1 -0
- package/dist/config.d.ts +60 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +112 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +105 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +28 -0
- package/dist/types.js.map +1 -0
- package/dist/workflows/implement.d.ts +28 -0
- package/dist/workflows/implement.d.ts.map +1 -0
- package/dist/workflows/implement.js +277 -0
- package/dist/workflows/implement.js.map +1 -0
- package/dist/workflows/index.d.ts +9 -0
- package/dist/workflows/index.d.ts.map +1 -0
- package/dist/workflows/index.js +9 -0
- package/dist/workflows/index.js.map +1 -0
- package/dist/workflows/init.d.ts +55 -0
- package/dist/workflows/init.d.ts.map +1 -0
- package/dist/workflows/init.js +195 -0
- package/dist/workflows/init.js.map +1 -0
- package/dist/workflows/merge.d.ts +40 -0
- package/dist/workflows/merge.d.ts.map +1 -0
- package/dist/workflows/merge.js +90 -0
- package/dist/workflows/merge.js.map +1 -0
- package/dist/workflows/status.d.ts +34 -0
- package/dist/workflows/status.d.ts.map +1 -0
- package/dist/workflows/status.js +53 -0
- package/dist/workflows/status.js.map +1 -0
- package/dist/workflows/submit.d.ts +44 -0
- package/dist/workflows/submit.d.ts.map +1 -0
- package/dist/workflows/submit.js +143 -0
- package/dist/workflows/submit.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"implement.js","sourceRoot":"","sources":["../../src/workflows/implement.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EACL,sBAAsB,EACtB,4BAA4B,EAE7B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,sBAAsB,EACtB,2BAA2B,EAE5B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAsB,MAAM,+BAA+B,CAAC;AAExF,OAAO,EACL,aAAa,EACb,UAAU,GAKX,MAAM,aAAa,CAAC;AAWrB;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAyB,EACzB,IAA2B,EAC3B,UAA6B;IAE7B,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IACrD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;IAEvD,uBAAuB;IACvB,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,aAAa,CACrB,UAAU,CAAC,gBAAgB,EAC3B,WAAW,QAAQ,aAAa,EAChC,EAAE,QAAQ,EAAE,CACb,CAAC;IACJ,CAAC;IAED,UAAU,EAAE,CAAC;QACX,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,sCAAsC,IAAI,EAAE;QACrD,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KACzB,CAAC,CAAC;IAEH,sBAAsB;IACtB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,eAAe,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;IAC5E,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IACtE,MAAM,aAAa,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAE/F,mCAAmC;IACnC,IAAI,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC9D,IAAI,MAAM,EAAE,CAAC;QACX,gBAAgB,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;QACjE,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,aAAa,CACrB,UAAU,CAAC,gBAAgB,EAC3B,SAAS,MAAM,kCAAkC,EACjD,EAAE,QAAQ,EAAE,MAAM,EAAE,CACrB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,UAAU,EAAE,CAAC;QACX,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,SAAS,gBAAgB,CAAC,MAAM,uBAAuB;QAChE,IAAI,EAAE,EAAE,SAAS,EAAE,gBAAgB,CAAC,MAAM,EAAE;KAC7C,CAAC,CAAC;IAEH,kCAAkC;IAClC,MAAM,YAAY,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAE7F,yBAAyB;IACzB,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,YAAY;YACf,OAAO,sBAAsB,CAC3B,EAAE,QAAQ,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,EAAE,EAClG,IAAI,EACJ,UAAU,CACX,CAAC;QAEJ,KAAK,YAAY;YACf,OAAO,sBAAsB,CAC3B,EAAE,QAAQ,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,EAAE,EAClG,IAAI,EACJ,UAAU,CACX,CAAC;QAEJ,KAAK,QAAQ;YACX,OAAO,mBAAmB,CACxB,EAAE,QAAQ,EAAE,MAAM,EAAE,EACpB,IAAI,EACJ,UAAU,CACX,CAAC;QAEJ;YACE,MAAM,IAAI,aAAa,CACrB,UAAU,CAAC,cAAc,EACzB,gCAAgC,IAAI,EAAE,EACtC,EAAE,IAAI,EAAE,CACT,CAAC;IACN,CAAC;AACH,CAAC;AAaD;;GAEG;AACH,KAAK,UAAU,sBAAsB,CACnC,OAAyB,EACzB,IAA2B,EAC3B,UAA6B;IAE7B,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,IAAI,sBAAsB,EAAE,CAAC;IAEvD,4BAA4B;IAC5B,IAAI,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;QAC7B,MAAM,IAAI,aAAa,CACrB,UAAU,CAAC,aAAa,EACxB,kGAAkG,EAClG,EAAE,IAAI,EAAE,YAAY,EAAE,CACvB,CAAC;IACJ,CAAC;IAED,qCAAqC;IACrC,MAAM,MAAM,GAAG,4BAA4B,CAAC;QAC1C,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,QAAQ,EAAE,OAAO,CAAC,eAAe;QACjC,KAAK,EAAE,OAAO,CAAC,YAAY;QAC3B,MAAM,EAAE,OAAO,CAAC,aAAa;QAC7B,YAAY,EAAE,OAAO,CAAC,YAAY;KACnC,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO;YACL,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,2BAA2B;YACnC,cAAc,EAAE,EAAE;YAClB,IAAI,EAAE,MAAM;SACb,CAAC;IACJ,CAAC;IAED,UAAU,EAAE,CAAC;QACX,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,wBAAwB;KAClC,CAAC,CAAC;IAEH,gCAAgC;IAChC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,YAAY,CACnC,MAAM,EACN,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAClD,CAAC,KAAK,EAAE,EAAE;QACR,UAAU,EAAE,CAAC;YACX,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;SAC1B,CAAC,CAAC;IACL,CAAC,CACF,CAAC;IAEF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO;YACL,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,6BAA6B;YACtD,cAAc,EAAE,EAAE;YAClB,WAAW,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC9C,MAAM,EAAE,CAAC,CAAC,EAAE;gBACZ,MAAM,EAAE,sBAAsB;aAC/B,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAED,yCAAyC;IACzC,sFAAsF;IACtF,MAAM,cAAc,GAAG,oBAAoB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAErF,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,MAAM,EAAE,cAAc,CAAC,MAAM,KAAK,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QACzF,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,cAAc,EAAE,cAAc;KAC/B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,sBAAsB,CACnC,OAAyB,EACzB,IAA2B,EAC3B,UAA6B;IAE7B,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,IAAI,sBAAsB,EAAE,CAAC;IAEvD,iCAAiC;IACjC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC;QACxB,MAAM,IAAI,aAAa,CACrB,UAAU,CAAC,aAAa,EACxB,qEAAqE,EACrE,EAAE,IAAI,EAAE,YAAY,EAAE,CACvB,CAAC;IACJ,CAAC;IAED,mBAAmB;IACnB,MAAM,YAAY,GAAG,2BAA2B,EAAE,CAAC;IACnD,MAAM,UAAU,GAAG,4BAA4B,CAAC;QAC9C,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,QAAQ,EAAE,OAAO,CAAC,eAAe;QACjC,KAAK,EAAE,OAAO,CAAC,YAAY;QAC3B,MAAM,EAAE,OAAO,CAAC,aAAa;QAC7B,YAAY,EAAE,OAAO,CAAC,YAAY;KACnC,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO;YACL,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,2BAA2B;YACnC,cAAc,EAAE,EAAE;YAClB,IAAI,EAAE,mBAAmB,YAAY,qBAAqB,UAAU,EAAE;SACvE,CAAC;IACJ,CAAC;IAED,UAAU,EAAE,CAAC;QACX,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,yCAAyC;KACnD,CAAC,CAAC;IAEH,uBAAuB;IACvB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,cAAc,CACrC,YAAY,EACZ,UAAU,EACV;QACE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;QAC1B,aAAa,EAAE,EAAE;QACjB,UAAU;KACX,CACF,CAAC;IAEF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO;YACL,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;YAChC,cAAc,EAAE,EAAE;YAClB,WAAW,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC9C,MAAM,EAAE,CAAC,CAAC,EAAE;gBACZ,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,eAAe;aAC5C,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAED,iDAAiD;IACjD,MAAM,cAAc,GAAG,oBAAoB,CAAC,MAAM,CAAC,aAAa,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAE5F,UAAU,EAAE,CAAC;QACX,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,4BAA4B,MAAM,CAAC,UAAU,gBAAgB,MAAM,CAAC,aAAa,CAAC,MAAM,iBAAiB;QAClH,IAAI,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE;KAC7E,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,MAAM,EAAE,cAAc,CAAC,MAAM,KAAK,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QACzF,MAAM,EAAE,MAAM,CAAC,aAAa;QAC5B,cAAc,EAAE,cAAc;KAC/B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,mBAAmB,CAChC,OAA8C,EAC9C,IAA2B,EAC3B,UAA6B;IAE7B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,mBAAmB,EAAE,CAAC;IAEpD,+BAA+B;IAC/B,IAAI,CAAC,MAAM,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;QAChC,MAAM,IAAI,aAAa,CACrB,UAAU,CAAC,aAAa,EACxB,+EAA+E,EAC/E,EAAE,IAAI,EAAE,QAAQ,EAAE,CACnB,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAEnC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,2BAA2B;YACnC,cAAc,EAAE,EAAE;YAClB,IAAI,EAAE,yBAAyB,YAAY,EAAE;SAC9C,CAAC;IACJ,CAAC;IAED,UAAU,EAAE,CAAC;QACX,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,uBAAuB;KACjC,CAAC,CAAC;IAEH,cAAc;IACd,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAE/C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,MAAM,CAAC,OAAO;YACtB,cAAc,EAAE,EAAE;SACnB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,qBAAqB,YAAY,mGAAmG;QAC5I,cAAc,EAAE,EAAE;KACnB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,cAAc,CAC3B,QAAgB,EAChB,QAAgB,EAChB,IAA2B;IAE3B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC3F,OAAO,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAC/B,KAAe,EACf,WAAmB;IAEnB,MAAM,KAAK,GAA6C,EAAE,CAAC;IAE3D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YACzC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAClD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,+CAA+C;QACjD,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,SAAS,oBAAoB,CAC3B,MAAc,EACd,KAAmB;IAEnB,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,8EAA8E;IAC9E,MAAM,kBAAkB,GAAG;QACzB,uCAAuC;QACvC,iBAAiB;QACjB,uDAAuD;QACvD,sBAAsB;KACvB,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM,OAAO,IAAI,kBAAkB,EAAE,CAAC;YACzC,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,oBAAoB;YAC3C,IAAI,KAAK,CAAC;YACV,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC/C,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;oBACzB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACxB,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,oBAAoB;AACtD,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflows for spec-driven development
|
|
3
|
+
*/
|
|
4
|
+
export { initWorkflow, type InitOptions, type InitResult } from './init.js';
|
|
5
|
+
export { statusWorkflow, type StatusOptions, type StatusResult } from './status.js';
|
|
6
|
+
export { submitWorkflow, type SubmitOptions, type SubmitResult } from './submit.js';
|
|
7
|
+
export { mergeWorkflow, type MergeOptions, type MergeResult } from './merge.js';
|
|
8
|
+
export { implementWorkflow, type ImplementDependencies } from './implement.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workflows/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,EAAE,cAAc,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,KAAK,qBAAqB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflows for spec-driven development
|
|
3
|
+
*/
|
|
4
|
+
export { initWorkflow } from './init.js';
|
|
5
|
+
export { statusWorkflow } from './status.js';
|
|
6
|
+
export { submitWorkflow } from './submit.js';
|
|
7
|
+
export { mergeWorkflow } from './merge.js';
|
|
8
|
+
export { implementWorkflow } from './implement.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workflows/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAqC,MAAM,WAAW,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAyC,MAAM,aAAa,CAAC;AACpF,OAAO,EAAE,cAAc,EAAyC,MAAM,aAAa,CAAC;AACpF,OAAO,EAAE,aAAa,EAAuC,MAAM,YAAY,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAA8B,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Init workflow - create branch and scaffold change proposal
|
|
3
|
+
*/
|
|
4
|
+
import { type GitAdapter } from '../adapters/git-adapter.js';
|
|
5
|
+
import { type GitHubAdapter } from '../adapters/github-adapter.js';
|
|
6
|
+
import { type OpenSpecAdapter } from '../adapters/openspec-adapter.js';
|
|
7
|
+
import { type EnvironmentRegistry, type BootstrapResult } from '../adapters/environment-adapter.js';
|
|
8
|
+
import { type SpecLifeConfig } from '../config.js';
|
|
9
|
+
import { type PullRequest, type ProgressCallback } from '../types.js';
|
|
10
|
+
export interface InitOptions {
|
|
11
|
+
/** Change identifier (kebab-case) */
|
|
12
|
+
changeId: string;
|
|
13
|
+
/** Brief description for the proposal */
|
|
14
|
+
description?: string;
|
|
15
|
+
/** Disable worktree creation (create branch in current worktree instead) */
|
|
16
|
+
noWorktree?: boolean;
|
|
17
|
+
/** Skip environment bootstrap (dependencies won't be set up) */
|
|
18
|
+
skipBootstrap?: boolean;
|
|
19
|
+
/** Preview changes without applying */
|
|
20
|
+
dryRun?: boolean;
|
|
21
|
+
/** Skip draft PR creation (overrides config.createDraftPR) */
|
|
22
|
+
skipDraftPR?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface InitResult {
|
|
25
|
+
/** Created branch name */
|
|
26
|
+
branch: string;
|
|
27
|
+
/** Worktree path (if worktree created) */
|
|
28
|
+
worktreePath?: string;
|
|
29
|
+
/** Path to proposal.md */
|
|
30
|
+
proposalPath: string;
|
|
31
|
+
/** Path to tasks.md */
|
|
32
|
+
tasksPath: string;
|
|
33
|
+
/** Environment bootstrap results (if bootstrap ran) */
|
|
34
|
+
bootstrapResults?: BootstrapResult[];
|
|
35
|
+
/** Draft PR created (if createDraftPR is enabled) */
|
|
36
|
+
pullRequest?: PullRequest;
|
|
37
|
+
}
|
|
38
|
+
interface InitDependencies {
|
|
39
|
+
git: GitAdapter;
|
|
40
|
+
openspec: OpenSpecAdapter;
|
|
41
|
+
config: SpecLifeConfig;
|
|
42
|
+
/** Environment registry (uses default if not provided) */
|
|
43
|
+
environmentRegistry?: EnvironmentRegistry;
|
|
44
|
+
/** GitHub adapter (required if createDraftPR is enabled) */
|
|
45
|
+
github?: GitHubAdapter;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Initialize a new change
|
|
49
|
+
*
|
|
50
|
+
* By default, creates a worktree for isolated development.
|
|
51
|
+
* Use noWorktree to create a branch in the current worktree instead.
|
|
52
|
+
*/
|
|
53
|
+
export declare function initWorkflow(options: InitOptions, deps: InitDependencies, onProgress?: ProgressCallback): Promise<InitResult>;
|
|
54
|
+
export {};
|
|
55
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/workflows/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,KAAK,eAAe,EAAyB,MAAM,iCAAiC,CAAC;AAC9F,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,eAAe,EAErB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAA6B,KAAK,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEjG,MAAM,WAAW,WAAW;IAC1B,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gEAAgE;IAChE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,uCAAuC;IACvC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,8DAA8D;IAC9D,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0BAA0B;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IACrC,qDAAqD;IACrD,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,UAAU,gBAAgB;IACxB,GAAG,EAAE,UAAU,CAAC;IAChB,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,cAAc,CAAC;IACvB,0DAA0D;IAC1D,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,4DAA4D;IAC5D,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,gBAAgB,EACtB,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,UAAU,CAAC,CAsKrB"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Init workflow - create branch and scaffold change proposal
|
|
3
|
+
*/
|
|
4
|
+
import { createOpenSpecAdapter } from '../adapters/openspec-adapter.js';
|
|
5
|
+
import { createDefaultEnvironmentRegistry, } from '../adapters/environment-adapter.js';
|
|
6
|
+
import { SpecLifeError, ErrorCodes } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Initialize a new change
|
|
9
|
+
*
|
|
10
|
+
* By default, creates a worktree for isolated development.
|
|
11
|
+
* Use noWorktree to create a branch in the current worktree instead.
|
|
12
|
+
*/
|
|
13
|
+
export async function initWorkflow(options, deps, onProgress) {
|
|
14
|
+
const { changeId, description, noWorktree = false, skipBootstrap = false, dryRun = false, skipDraftPR = false } = options;
|
|
15
|
+
const { git, openspec, config, environmentRegistry, github } = deps;
|
|
16
|
+
// Determine if we should create a draft PR
|
|
17
|
+
const shouldCreateDraftPR = config.createDraftPR && !skipDraftPR && !dryRun;
|
|
18
|
+
// Validate that github adapter is provided if draft PR is needed
|
|
19
|
+
if (shouldCreateDraftPR && !github) {
|
|
20
|
+
throw new SpecLifeError(ErrorCodes.CONFIG_INVALID, 'GitHub adapter is required when createDraftPR is enabled', { createDraftPR: config.createDraftPR, skipDraftPR });
|
|
21
|
+
}
|
|
22
|
+
// Validate changeId format (kebab-case)
|
|
23
|
+
if (!/^[a-z][a-z0-9]*(-[a-z0-9]+)*$/.test(changeId)) {
|
|
24
|
+
throw new SpecLifeError(ErrorCodes.CONFIG_INVALID, `Invalid changeId format: "${changeId}". Must be kebab-case (e.g., "add-user-auth")`, { changeId });
|
|
25
|
+
}
|
|
26
|
+
const branch = `spec/${changeId}`;
|
|
27
|
+
const worktreePath = `worktrees/${changeId}`;
|
|
28
|
+
// Check if branch already exists
|
|
29
|
+
if (await git.branchExists(branch)) {
|
|
30
|
+
throw new SpecLifeError(ErrorCodes.BRANCH_EXISTS, `Branch '${branch}' already exists`, { branch });
|
|
31
|
+
}
|
|
32
|
+
// For worktree mode, check if change exists in main repo's openspec
|
|
33
|
+
// For non-worktree mode, check current directory
|
|
34
|
+
// TODO: Improve change existence check for worktree mode
|
|
35
|
+
if (dryRun) {
|
|
36
|
+
const basePath = noWorktree ? '' : `${worktreePath}/`;
|
|
37
|
+
return {
|
|
38
|
+
branch,
|
|
39
|
+
worktreePath: noWorktree ? undefined : worktreePath,
|
|
40
|
+
proposalPath: `${basePath}openspec/changes/${changeId}/proposal.md`,
|
|
41
|
+
tasksPath: `${basePath}openspec/changes/${changeId}/tasks.md`,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
if (noWorktree) {
|
|
45
|
+
// Legacy mode: create branch in current worktree
|
|
46
|
+
onProgress?.({ type: 'step_completed', message: `Creating branch ${branch}` });
|
|
47
|
+
await git.createBranch(branch, config.github.baseBranch);
|
|
48
|
+
// Scaffold proposal files in current directory
|
|
49
|
+
onProgress?.({ type: 'step_completed', message: 'Scaffolding proposal files' });
|
|
50
|
+
const { proposalPath, tasksPath } = await openspec.scaffoldChange(changeId, { description });
|
|
51
|
+
// Create draft PR if enabled
|
|
52
|
+
let pullRequest;
|
|
53
|
+
if (shouldCreateDraftPR && github) {
|
|
54
|
+
pullRequest = await createInitialDraftPR({
|
|
55
|
+
git,
|
|
56
|
+
github,
|
|
57
|
+
changeId,
|
|
58
|
+
description,
|
|
59
|
+
branch,
|
|
60
|
+
baseBranch: config.github.baseBranch,
|
|
61
|
+
onProgress,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
onProgress?.({ type: 'step_completed', message: 'Initialization complete' });
|
|
65
|
+
return {
|
|
66
|
+
branch,
|
|
67
|
+
proposalPath,
|
|
68
|
+
tasksPath,
|
|
69
|
+
pullRequest,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
// Default: Create worktree for isolated development
|
|
73
|
+
onProgress?.({ type: 'step_completed', message: `Creating worktree at ${worktreePath}` });
|
|
74
|
+
await git.createWorktree(worktreePath, branch);
|
|
75
|
+
// Bootstrap environment (unless skipped)
|
|
76
|
+
let bootstrapResults;
|
|
77
|
+
if (!skipBootstrap) {
|
|
78
|
+
const registry = environmentRegistry ?? createDefaultEnvironmentRegistry();
|
|
79
|
+
const strategy = config.worktree?.bootstrap?.strategy ?? 'symlink';
|
|
80
|
+
onProgress?.({ type: 'step_completed', message: 'Detecting and bootstrapping environments' });
|
|
81
|
+
// Get the source root (current working directory)
|
|
82
|
+
const sourceRoot = process.cwd();
|
|
83
|
+
bootstrapResults = await registry.bootstrapAll(worktreePath, sourceRoot, strategy, onProgress);
|
|
84
|
+
// Report results
|
|
85
|
+
const successful = bootstrapResults.filter(r => r.success);
|
|
86
|
+
const failed = bootstrapResults.filter(r => !r.success);
|
|
87
|
+
if (successful.length > 0) {
|
|
88
|
+
onProgress?.({
|
|
89
|
+
type: 'step_completed',
|
|
90
|
+
message: `Bootstrapped ${successful.length} environment(s): ${successful.map(r => r.environment).join(', ')}`,
|
|
91
|
+
data: { results: successful },
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
if (failed.length > 0) {
|
|
95
|
+
onProgress?.({
|
|
96
|
+
type: 'step_completed',
|
|
97
|
+
message: `Warning: ${failed.length} environment(s) failed to bootstrap: ${failed.map(r => r.message).join('; ')}`,
|
|
98
|
+
data: { results: failed },
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Create OpenSpec adapter for the worktree
|
|
103
|
+
const worktreeOpenspec = createOpenSpecAdapter({
|
|
104
|
+
projectRoot: worktreePath,
|
|
105
|
+
specDir: config.specDir,
|
|
106
|
+
});
|
|
107
|
+
// Scaffold proposal files in worktree
|
|
108
|
+
onProgress?.({ type: 'step_completed', message: 'Scaffolding proposal files in worktree' });
|
|
109
|
+
const { proposalPath, tasksPath } = await worktreeOpenspec.scaffoldChange(changeId, { description });
|
|
110
|
+
// Create draft PR if enabled
|
|
111
|
+
// For worktree mode, we need a git adapter for the worktree
|
|
112
|
+
let pullRequest;
|
|
113
|
+
if (shouldCreateDraftPR && github) {
|
|
114
|
+
// Create a git adapter for the worktree to commit and push from there
|
|
115
|
+
const { createGitAdapter } = await import('../adapters/git-adapter.js');
|
|
116
|
+
const worktreeGit = createGitAdapter(worktreePath);
|
|
117
|
+
pullRequest = await createInitialDraftPR({
|
|
118
|
+
git: worktreeGit,
|
|
119
|
+
github,
|
|
120
|
+
changeId,
|
|
121
|
+
description,
|
|
122
|
+
branch,
|
|
123
|
+
baseBranch: config.github.baseBranch,
|
|
124
|
+
onProgress,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
onProgress?.({ type: 'step_completed', message: 'Initialization complete' });
|
|
128
|
+
return {
|
|
129
|
+
branch,
|
|
130
|
+
worktreePath,
|
|
131
|
+
proposalPath,
|
|
132
|
+
tasksPath,
|
|
133
|
+
bootstrapResults,
|
|
134
|
+
pullRequest,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Helper to create initial commit, push, and draft PR
|
|
139
|
+
*/
|
|
140
|
+
async function createInitialDraftPR(params) {
|
|
141
|
+
const { git, github, changeId, description, branch, baseBranch, onProgress } = params;
|
|
142
|
+
// Stage and commit the scaffolded files
|
|
143
|
+
onProgress?.({ type: 'step_completed', message: 'Committing proposal files' });
|
|
144
|
+
await git.add(['.']);
|
|
145
|
+
await git.commit(`spec: add ${changeId} proposal`);
|
|
146
|
+
// Push to origin
|
|
147
|
+
onProgress?.({ type: 'step_completed', message: `Pushing to origin/${branch}` });
|
|
148
|
+
await git.push('origin', branch);
|
|
149
|
+
// Create draft PR
|
|
150
|
+
onProgress?.({ type: 'step_completed', message: 'Creating draft pull request' });
|
|
151
|
+
const prTitle = generatePRTitle(changeId, description);
|
|
152
|
+
const prBody = generateInitialPRBody(changeId, description);
|
|
153
|
+
const pullRequest = await github.createPullRequest({
|
|
154
|
+
title: prTitle,
|
|
155
|
+
body: prBody,
|
|
156
|
+
head: branch,
|
|
157
|
+
base: baseBranch,
|
|
158
|
+
draft: true,
|
|
159
|
+
});
|
|
160
|
+
onProgress?.({ type: 'step_completed', message: `Created draft PR #${pullRequest.number}` });
|
|
161
|
+
return pullRequest;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Generate PR title from changeId and description
|
|
165
|
+
*/
|
|
166
|
+
function generatePRTitle(changeId, description) {
|
|
167
|
+
if (description) {
|
|
168
|
+
const firstLine = description.split('\n')[0].trim();
|
|
169
|
+
if (firstLine.length > 72) {
|
|
170
|
+
return firstLine.slice(0, 69) + '...';
|
|
171
|
+
}
|
|
172
|
+
return firstLine;
|
|
173
|
+
}
|
|
174
|
+
// Convert kebab-case to title case
|
|
175
|
+
return changeId.replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase());
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Generate initial PR body for draft PR
|
|
179
|
+
*/
|
|
180
|
+
function generateInitialPRBody(_changeId, description) {
|
|
181
|
+
const lines = [
|
|
182
|
+
'## Proposal',
|
|
183
|
+
'',
|
|
184
|
+
description || '_Proposal pending - see proposal.md for details_',
|
|
185
|
+
'',
|
|
186
|
+
'---',
|
|
187
|
+
'',
|
|
188
|
+
'> 📝 **Draft PR** - This PR was created during `speclife_init` to track the change from the start.',
|
|
189
|
+
'> Update the proposal and tasks as you implement the change.',
|
|
190
|
+
'',
|
|
191
|
+
'*Created with [SpecLife](https://github.com/malarbase/speclife)*',
|
|
192
|
+
];
|
|
193
|
+
return lines.join('\n');
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/workflows/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge workflow - merge PR, sync main, cleanup worktree
|
|
3
|
+
*/
|
|
4
|
+
import { type GitAdapter } from '../adapters/git-adapter.js';
|
|
5
|
+
import { type GitHubAdapter } from '../adapters/github-adapter.js';
|
|
6
|
+
import { type SpecLifeConfig } from '../config.js';
|
|
7
|
+
import { type PullRequest, type ProgressCallback } from '../types.js';
|
|
8
|
+
export interface MergeOptions {
|
|
9
|
+
/** Change ID to merge */
|
|
10
|
+
changeId: string;
|
|
11
|
+
/** Merge method: squash (default), merge, or rebase */
|
|
12
|
+
method?: 'squash' | 'merge' | 'rebase';
|
|
13
|
+
/** Delete local branch after merge */
|
|
14
|
+
deleteBranch?: boolean;
|
|
15
|
+
/** Remove worktree after merge (if in worktree) */
|
|
16
|
+
removeWorktree?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface MergeResult {
|
|
19
|
+
/** PR that was merged */
|
|
20
|
+
pullRequest: PullRequest;
|
|
21
|
+
/** Whether main was synced */
|
|
22
|
+
mainSynced: boolean;
|
|
23
|
+
/** Whether local branch was deleted */
|
|
24
|
+
branchDeleted: boolean;
|
|
25
|
+
/** Whether worktree was removed */
|
|
26
|
+
worktreeRemoved: boolean;
|
|
27
|
+
/** Path to worktree that was removed (if any) */
|
|
28
|
+
worktreePath?: string;
|
|
29
|
+
}
|
|
30
|
+
interface MergeDependencies {
|
|
31
|
+
git: GitAdapter;
|
|
32
|
+
github: GitHubAdapter;
|
|
33
|
+
config: SpecLifeConfig;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Merge a submitted change: merge PR, sync main, cleanup
|
|
37
|
+
*/
|
|
38
|
+
export declare function mergeWorkflow(options: MergeOptions, deps: MergeDependencies, onProgress?: ProgressCallback): Promise<MergeResult>;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/workflows/merge.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAA6B,KAAK,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEjG,MAAM,WAAW,YAAY;IAC3B,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,MAAM,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;IACvC,sCAAsC;IACtC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,mDAAmD;IACnD,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,yBAAyB;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,8BAA8B;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,uCAAuC;IACvC,aAAa,EAAE,OAAO,CAAC;IACvB,mCAAmC;IACnC,eAAe,EAAE,OAAO,CAAC;IACzB,iDAAiD;IACjD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,iBAAiB;IACzB,GAAG,EAAE,UAAU,CAAC;IAChB,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,cAAc,CAAC;CACxB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,YAAY,EACrB,IAAI,EAAE,iBAAiB,EACvB,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,WAAW,CAAC,CA2GtB"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge workflow - merge PR, sync main, cleanup worktree
|
|
3
|
+
*/
|
|
4
|
+
import { SpecLifeError, ErrorCodes } from '../types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Merge a submitted change: merge PR, sync main, cleanup
|
|
7
|
+
*/
|
|
8
|
+
export async function mergeWorkflow(options, deps, onProgress) {
|
|
9
|
+
const { changeId, method = 'squash', deleteBranch = true, removeWorktree = true } = options;
|
|
10
|
+
const { git, github, config } = deps;
|
|
11
|
+
const branch = `spec/${changeId}`;
|
|
12
|
+
const baseBranch = config.github.baseBranch;
|
|
13
|
+
// Find PR for this branch
|
|
14
|
+
onProgress?.({ type: 'step_completed', message: `Looking for PR for branch ${branch}` });
|
|
15
|
+
const pr = await github.getPullRequestByBranch(branch);
|
|
16
|
+
if (!pr) {
|
|
17
|
+
throw new SpecLifeError(ErrorCodes.CHANGE_NOT_FOUND, `No open PR found for branch '${branch}'. Submit the change first with speclife_submit.`, { changeId, branch });
|
|
18
|
+
}
|
|
19
|
+
// Get full PR details including mergeable status
|
|
20
|
+
const fullPr = await github.getPullRequest(pr.number);
|
|
21
|
+
// Check if already merged
|
|
22
|
+
if (fullPr.state === 'merged') {
|
|
23
|
+
throw new SpecLifeError(ErrorCodes.CONFIG_INVALID, `PR #${pr.number} is already merged`, { prNumber: pr.number });
|
|
24
|
+
}
|
|
25
|
+
// Check if PR is mergeable
|
|
26
|
+
const mergeableCheck = await github.isPullRequestMergeable(pr.number);
|
|
27
|
+
if (!mergeableCheck.mergeable) {
|
|
28
|
+
throw new SpecLifeError(ErrorCodes.CONFIG_INVALID, `PR #${pr.number} is not mergeable: ${mergeableCheck.reason ?? 'unknown reason'}`, { prNumber: pr.number, reason: mergeableCheck.reason });
|
|
29
|
+
}
|
|
30
|
+
// Find worktree for this branch (if any)
|
|
31
|
+
let worktreePath;
|
|
32
|
+
const worktrees = await git.listWorktrees();
|
|
33
|
+
for (const wt of worktrees) {
|
|
34
|
+
if (wt.branch === branch) {
|
|
35
|
+
worktreePath = wt.path;
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Merge the PR
|
|
40
|
+
onProgress?.({ type: 'step_completed', message: `Merging PR #${pr.number} (${method})` });
|
|
41
|
+
await github.mergePullRequest(pr.number, method);
|
|
42
|
+
// Get updated PR state
|
|
43
|
+
const mergedPr = await github.getPullRequest(pr.number);
|
|
44
|
+
// Checkout main branch
|
|
45
|
+
onProgress?.({ type: 'step_completed', message: `Checking out ${baseBranch}` });
|
|
46
|
+
await git.checkout(baseBranch);
|
|
47
|
+
// Pull latest changes
|
|
48
|
+
onProgress?.({ type: 'step_completed', message: `Pulling latest ${baseBranch}` });
|
|
49
|
+
let mainSynced = false;
|
|
50
|
+
try {
|
|
51
|
+
await git.pull('origin', baseBranch);
|
|
52
|
+
mainSynced = true;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// Pull might fail in worktree scenarios; continue with cleanup
|
|
56
|
+
}
|
|
57
|
+
// Delete local branch
|
|
58
|
+
let branchDeleted = false;
|
|
59
|
+
if (deleteBranch) {
|
|
60
|
+
onProgress?.({ type: 'step_completed', message: `Deleting local branch ${branch}` });
|
|
61
|
+
try {
|
|
62
|
+
await git.deleteBranch(branch, true); // Force delete since it's merged
|
|
63
|
+
branchDeleted = true;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Branch might not exist locally; that's okay
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Remove worktree if applicable
|
|
70
|
+
let worktreeRemoved = false;
|
|
71
|
+
if (removeWorktree && worktreePath) {
|
|
72
|
+
onProgress?.({ type: 'step_completed', message: `Removing worktree at ${worktreePath}` });
|
|
73
|
+
try {
|
|
74
|
+
await git.removeWorktree(worktreePath);
|
|
75
|
+
worktreeRemoved = true;
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Worktree removal might fail; report but don't throw
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
onProgress?.({ type: 'step_completed', message: 'Merge complete' });
|
|
82
|
+
return {
|
|
83
|
+
pullRequest: mergedPr,
|
|
84
|
+
mainSynced,
|
|
85
|
+
branchDeleted,
|
|
86
|
+
worktreeRemoved,
|
|
87
|
+
worktreePath: worktreeRemoved ? worktreePath : undefined,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/workflows/merge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Status workflow - get current change state
|
|
3
|
+
*/
|
|
4
|
+
import { type GitAdapter } from '../adapters/git-adapter.js';
|
|
5
|
+
import { type OpenSpecAdapter } from '../adapters/openspec-adapter.js';
|
|
6
|
+
import { type Change } from '../types.js';
|
|
7
|
+
export interface StatusOptions {
|
|
8
|
+
/** Change ID to get status for (optional, uses current branch if not provided) */
|
|
9
|
+
changeId?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface StatusResult {
|
|
12
|
+
/** Change context */
|
|
13
|
+
change: Change;
|
|
14
|
+
/** Current git branch */
|
|
15
|
+
currentBranch: string;
|
|
16
|
+
/** Whether on the change's branch */
|
|
17
|
+
onBranch: boolean;
|
|
18
|
+
/** Task completion summary */
|
|
19
|
+
taskSummary: {
|
|
20
|
+
total: number;
|
|
21
|
+
completed: number;
|
|
22
|
+
percentage: number;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
interface StatusDependencies {
|
|
26
|
+
git: GitAdapter;
|
|
27
|
+
openspec: OpenSpecAdapter;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get status of a change
|
|
31
|
+
*/
|
|
32
|
+
export declare function statusWorkflow(options: StatusOptions, deps: StatusDependencies): Promise<StatusResult | null>;
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/workflows/status.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,KAAK,MAAM,EAAoB,MAAM,aAAa,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,kFAAkF;IAClF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,qCAAqC;IACrC,QAAQ,EAAE,OAAO,CAAC;IAClB,8BAA8B;IAC9B,WAAW,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED,UAAU,kBAAkB;IAC1B,GAAG,EAAE,UAAU,CAAC;IAChB,QAAQ,EAAE,eAAe,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAsC9B"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Status workflow - get current change state
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Get status of a change
|
|
6
|
+
*/
|
|
7
|
+
export async function statusWorkflow(options, deps) {
|
|
8
|
+
const { git, openspec } = deps;
|
|
9
|
+
let changeId = options.changeId;
|
|
10
|
+
const currentBranch = await git.getCurrentBranch();
|
|
11
|
+
// If no changeId provided, try to get from current branch
|
|
12
|
+
if (!changeId) {
|
|
13
|
+
const match = currentBranch.match(/^spec\/(.+)$/);
|
|
14
|
+
if (!match) {
|
|
15
|
+
return null; // Not on a spec branch
|
|
16
|
+
}
|
|
17
|
+
changeId = match[1];
|
|
18
|
+
}
|
|
19
|
+
// Check if change exists
|
|
20
|
+
if (!await openspec.changeExists(changeId)) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
// Read change
|
|
24
|
+
const change = await openspec.readChange(changeId);
|
|
25
|
+
// Calculate task summary
|
|
26
|
+
const total = change.tasks.length;
|
|
27
|
+
const completed = change.tasks.filter(t => t.completed).length;
|
|
28
|
+
const percentage = total > 0 ? Math.round((completed / total) * 100) : 0;
|
|
29
|
+
// Determine state based on tasks
|
|
30
|
+
const state = determineState(change, completed, total);
|
|
31
|
+
change.state = state;
|
|
32
|
+
return {
|
|
33
|
+
change,
|
|
34
|
+
currentBranch,
|
|
35
|
+
onBranch: currentBranch === `spec/${changeId}`,
|
|
36
|
+
taskSummary: { total, completed, percentage },
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Determine the change state based on progress
|
|
41
|
+
*/
|
|
42
|
+
function determineState(_change, completed, total) {
|
|
43
|
+
// TODO: Check for PR existence to determine 'submitted' state
|
|
44
|
+
// TODO: Check for archived status to determine 'merged' state
|
|
45
|
+
if (completed === 0) {
|
|
46
|
+
return 'created';
|
|
47
|
+
}
|
|
48
|
+
if (completed < total) {
|
|
49
|
+
return 'implementing';
|
|
50
|
+
}
|
|
51
|
+
return 'testing'; // All tasks complete, likely in testing phase
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/workflows/status.ts"],"names":[],"mappings":"AAAA;;GAEG;AA+BH;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAsB,EACtB,IAAwB;IAExB,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAE/B,IAAI,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAChC,MAAM,aAAa,GAAG,MAAM,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAEnD,0DAA0D;IAC1D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,CAAC,uBAAuB;QACtC,CAAC;QACD,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAED,yBAAyB;IACzB,IAAI,CAAC,MAAM,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,cAAc;IACd,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAEnD,yBAAyB;IACzB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;IAClC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;IAC/D,MAAM,UAAU,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzE,iCAAiC;IACjC,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IACvD,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IAErB,OAAO;QACL,MAAM;QACN,aAAa;QACb,QAAQ,EAAE,aAAa,KAAK,QAAQ,QAAQ,EAAE;QAC9C,WAAW,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE;KAC9C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,OAAe,EAAE,SAAiB,EAAE,KAAa;IACvE,8DAA8D;IAC9D,8DAA8D;IAE9D,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,SAAS,GAAG,KAAK,EAAE,CAAC;QACtB,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,OAAO,SAAS,CAAC,CAAC,8CAA8C;AAClE,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Submit workflow - commit, push, create PR, and archive change
|
|
3
|
+
*/
|
|
4
|
+
import { type GitAdapter } from '../adapters/git-adapter.js';
|
|
5
|
+
import { type GitHubAdapter } from '../adapters/github-adapter.js';
|
|
6
|
+
import { type OpenSpecAdapter } from '../adapters/openspec-adapter.js';
|
|
7
|
+
import { type SpecLifeConfig } from '../config.js';
|
|
8
|
+
import { type PullRequest, type ProgressCallback } from '../types.js';
|
|
9
|
+
export interface SubmitOptions {
|
|
10
|
+
/** Change ID to submit */
|
|
11
|
+
changeId: string;
|
|
12
|
+
/** Create PR as draft */
|
|
13
|
+
draft?: boolean;
|
|
14
|
+
/** Custom commit message (defaults to proposal-based message) */
|
|
15
|
+
commitMessage?: string;
|
|
16
|
+
/** Skip archiving the change */
|
|
17
|
+
skipArchive?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface SubmitResult {
|
|
20
|
+
/** Commit SHA */
|
|
21
|
+
commitSha: string;
|
|
22
|
+
/** Branch that was pushed */
|
|
23
|
+
branch: string;
|
|
24
|
+
/** Created or existing PR */
|
|
25
|
+
pullRequest: PullRequest;
|
|
26
|
+
/** Whether PR was newly created or already existed */
|
|
27
|
+
prCreated: boolean;
|
|
28
|
+
/** Whether an existing draft PR was marked ready for review */
|
|
29
|
+
prMarkedReady: boolean;
|
|
30
|
+
/** Whether change was archived */
|
|
31
|
+
archived: boolean;
|
|
32
|
+
}
|
|
33
|
+
interface SubmitDependencies {
|
|
34
|
+
git: GitAdapter;
|
|
35
|
+
github: GitHubAdapter;
|
|
36
|
+
openspec: OpenSpecAdapter;
|
|
37
|
+
config: SpecLifeConfig;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Submit a change: commit, push, create PR, archive
|
|
41
|
+
*/
|
|
42
|
+
export declare function submitWorkflow(options: SubmitOptions, deps: SubmitDependencies, onProgress?: ProgressCallback): Promise<SubmitResult>;
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=submit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"submit.d.ts","sourceRoot":"","sources":["../../src/workflows/submit.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAA6B,KAAK,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEjG,MAAM,WAAW,aAAa;IAC5B,0BAA0B;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,yBAAyB;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,iEAAiE;IACjE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gCAAgC;IAChC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,6BAA6B;IAC7B,WAAW,EAAE,WAAW,CAAC;IACzB,sDAAsD;IACtD,SAAS,EAAE,OAAO,CAAC;IACnB,+DAA+D;IAC/D,aAAa,EAAE,OAAO,CAAC;IACvB,kCAAkC;IAClC,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,kBAAkB;IAC1B,GAAG,EAAE,UAAU,CAAC;IAChB,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,cAAc,CAAC;CACxB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,kBAAkB,EACxB,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,YAAY,CAAC,CA6GvB"}
|