emdash-emit 0.0.0-stage → 0.1.2
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/LICENSE +21 -0
- package/README.md +798 -2
- package/dist/bin/emit.d.ts +5 -0
- package/dist/bin/emit.d.ts.map +1 -0
- package/dist/bin/emit.js +63 -0
- package/dist/bin/emit.js.map +1 -0
- package/dist/cli/commands/new.d.ts +4 -0
- package/dist/cli/commands/new.d.ts.map +1 -0
- package/dist/cli/commands/new.js +49 -0
- package/dist/cli/commands/new.js.map +1 -0
- package/dist/cli/commands/profile.d.ts +3 -0
- package/dist/cli/commands/profile.d.ts.map +1 -0
- package/dist/cli/commands/profile.js +104 -0
- package/dist/cli/commands/profile.js.map +1 -0
- package/dist/cli/commands/pull.d.ts +4 -0
- package/dist/cli/commands/pull.d.ts.map +1 -0
- package/dist/cli/commands/pull.js +157 -0
- package/dist/cli/commands/pull.js.map +1 -0
- package/dist/cli/commands/push.d.ts +4 -0
- package/dist/cli/commands/push.d.ts.map +1 -0
- package/dist/cli/commands/push.js +107 -0
- package/dist/cli/commands/push.js.map +1 -0
- package/dist/cli/commands/status.d.ts +4 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +100 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/context.d.ts +15 -0
- package/dist/cli/context.d.ts.map +1 -0
- package/dist/cli/context.js +75 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/client/api.d.ts +19 -0
- package/dist/client/api.d.ts.map +1 -0
- package/dist/client/api.js +96 -0
- package/dist/client/api.js.map +1 -0
- package/dist/client/auth.d.ts +48 -0
- package/dist/client/auth.d.ts.map +1 -0
- package/dist/client/auth.js +165 -0
- package/dist/client/auth.js.map +1 -0
- package/dist/client/error.d.ts +22 -0
- package/dist/client/error.d.ts.map +1 -0
- package/dist/client/error.js +57 -0
- package/dist/client/error.js.map +1 -0
- package/dist/client/http.d.ts +31 -0
- package/dist/client/http.d.ts.map +1 -0
- package/dist/client/http.js +97 -0
- package/dist/client/http.js.map +1 -0
- package/dist/client/lock.d.ts +40 -0
- package/dist/client/lock.d.ts.map +1 -0
- package/dist/client/lock.js +104 -0
- package/dist/client/lock.js.map +1 -0
- package/dist/client/mapper.d.ts +37 -0
- package/dist/client/mapper.d.ts.map +1 -0
- package/dist/client/mapper.js +142 -0
- package/dist/client/mapper.js.map +1 -0
- package/dist/client/portable-text.d.ts +94 -0
- package/dist/client/portable-text.d.ts.map +1 -0
- package/dist/client/portable-text.js +428 -0
- package/dist/client/portable-text.js.map +1 -0
- package/dist/client/schemas.d.ts +1928 -0
- package/dist/client/schemas.d.ts.map +1 -0
- package/dist/client/schemas.js +123 -0
- package/dist/client/schemas.js.map +1 -0
- package/dist/db/cache.d.ts +60 -0
- package/dist/db/cache.d.ts.map +1 -0
- package/dist/db/cache.js +303 -0
- package/dist/db/cache.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/context.d.ts +14 -0
- package/dist/mcp/context.d.ts.map +1 -0
- package/dist/mcp/context.js +23 -0
- package/dist/mcp/context.js.map +1 -0
- package/dist/mcp/server.d.ts +12 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +106 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/profile.d.ts +6 -0
- package/dist/mcp/tools/profile.d.ts.map +1 -0
- package/dist/mcp/tools/profile.js +81 -0
- package/dist/mcp/tools/profile.js.map +1 -0
- package/dist/mcp/tools/sync-diff.d.ts +4 -0
- package/dist/mcp/tools/sync-diff.d.ts.map +1 -0
- package/dist/mcp/tools/sync-diff.js +115 -0
- package/dist/mcp/tools/sync-diff.js.map +1 -0
- package/dist/mcp/tools/sync-new.d.ts +4 -0
- package/dist/mcp/tools/sync-new.d.ts.map +1 -0
- package/dist/mcp/tools/sync-new.js +54 -0
- package/dist/mcp/tools/sync-new.js.map +1 -0
- package/dist/mcp/tools/sync-pull.d.ts +4 -0
- package/dist/mcp/tools/sync-pull.d.ts.map +1 -0
- package/dist/mcp/tools/sync-pull.js +180 -0
- package/dist/mcp/tools/sync-pull.js.map +1 -0
- package/dist/mcp/tools/sync-push.d.ts +4 -0
- package/dist/mcp/tools/sync-push.d.ts.map +1 -0
- package/dist/mcp/tools/sync-push.js +105 -0
- package/dist/mcp/tools/sync-push.js.map +1 -0
- package/dist/mcp/tools/sync-status.d.ts +4 -0
- package/dist/mcp/tools/sync-status.d.ts.map +1 -0
- package/dist/mcp/tools/sync-status.js +45 -0
- package/dist/mcp/tools/sync-status.js.map +1 -0
- package/dist/sync/bylines.d.ts +23 -0
- package/dist/sync/bylines.d.ts.map +1 -0
- package/dist/sync/bylines.js +112 -0
- package/dist/sync/bylines.js.map +1 -0
- package/dist/sync/diff.d.ts +16 -0
- package/dist/sync/diff.d.ts.map +1 -0
- package/dist/sync/diff.js +68 -0
- package/dist/sync/diff.js.map +1 -0
- package/dist/sync/media.d.ts +37 -0
- package/dist/sync/media.d.ts.map +1 -0
- package/dist/sync/media.js +191 -0
- package/dist/sync/media.js.map +1 -0
- package/dist/sync/merge.d.ts +36 -0
- package/dist/sync/merge.d.ts.map +1 -0
- package/dist/sync/merge.js +112 -0
- package/dist/sync/merge.js.map +1 -0
- package/dist/sync/new.d.ts +24 -0
- package/dist/sync/new.d.ts.map +1 -0
- package/dist/sync/new.js +75 -0
- package/dist/sync/new.js.map +1 -0
- package/dist/sync/orchestrator.d.ts +55 -0
- package/dist/sync/orchestrator.d.ts.map +1 -0
- package/dist/sync/orchestrator.js +222 -0
- package/dist/sync/orchestrator.js.map +1 -0
- package/dist/sync/preflight.d.ts +25 -0
- package/dist/sync/preflight.d.ts.map +1 -0
- package/dist/sync/preflight.js +128 -0
- package/dist/sync/preflight.js.map +1 -0
- package/dist/sync/pull.d.ts +67 -0
- package/dist/sync/pull.d.ts.map +1 -0
- package/dist/sync/pull.js +405 -0
- package/dist/sync/pull.js.map +1 -0
- package/dist/sync/push.d.ts +33 -0
- package/dist/sync/push.d.ts.map +1 -0
- package/dist/sync/push.js +432 -0
- package/dist/sync/push.js.map +1 -0
- package/dist/sync/status.d.ts +24 -0
- package/dist/sync/status.d.ts.map +1 -0
- package/dist/sync/status.js +85 -0
- package/dist/sync/status.js.map +1 -0
- package/dist/sync/taxonomies.d.ts +49 -0
- package/dist/sync/taxonomies.d.ts.map +1 -0
- package/dist/sync/taxonomies.js +220 -0
- package/dist/sync/taxonomies.js.map +1 -0
- package/dist/utils/config.d.ts +18 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +79 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +115 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +147 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/naming.d.ts +28 -0
- package/dist/utils/naming.d.ts.map +1 -0
- package/dist/utils/naming.js +94 -0
- package/dist/utils/naming.js.map +1 -0
- package/dist/utils/profile.d.ts +72 -0
- package/dist/utils/profile.d.ts.map +1 -0
- package/dist/utils/profile.js +180 -0
- package/dist/utils/profile.js.map +1 -0
- package/dist/utils/version.d.ts +5 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +43 -0
- package/dist/utils/version.js.map +1 -0
- package/dist/utils/workspace.d.ts +22 -0
- package/dist/utils/workspace.d.ts.map +1 -0
- package/dist/utils/workspace.js +74 -0
- package/dist/utils/workspace.js.map +1 -0
- package/package.json +68 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/sync/media.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAgBrF,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAqBlD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAyB;IACvD,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC;IACpE,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,KAAK,KAAK,CAAC;IACtD,MAAM,SAAS,GAAG,GAAG,CAAC;IAEtB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAC3D,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5C,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/C,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IAEzC,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,MAAM,GAAuB,SAAS,CAAC;IAE3C,OAAO,cAAc,GAAG,WAAW,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,WAAW,GAAG,cAAc,CAAC;QAC/C,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAEpD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,oBAAoB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1D,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;QACpD,IAAI,MAAM,EAAE,CAAC;YACX,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;YACxC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,OAAO,CAAC,KAAK,EAAE;gBACxC,MAAM,EAAE,kBAAkB;aAC3B;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,QAAQ,CAAC;gBACjB,OAAO,EAAE,yBAAyB,GAAG,CAAC,UAAU,EAAE;gBAClD,IAAI,EAAE,mBAAmB;gBACzB,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE;gBACxB,UAAU,EAAE,kDAAkD;aAC/D,CAAC,CAAC;QACL,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,cAAc,CAA0B,IAAI,CAAC,CAAC;QAC3D,MAAM,QAAQ,GAAG,CACf,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CACpD,CAAC;QAEvB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM;QACR,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxC,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YACzD,MAAM,aAAa,GAAG,wBAAwB,CAAC,cAAc,CAAC,CAAC;YAC/D,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACpD,MAAM,QAAQ,GAAG,GAAG,UAAU,GAAG,IAAI,CAAC,EAAE,IAAI,aAAa,EAAE,CAAC;YAC5D,MAAM,WAAW,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,aAAa,EAAE,CAAC;YAClD,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACnC,oBAAoB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACtC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAE5B,6CAA6C;YAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,WAAW,OAAO,CAAC,CAAC;YAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,QAAQ,OAAO,CAAC,CAAC;YACzD,IAAI,WAAW,KAAK,QAAQ,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC3D,IAAI,CAAC;oBACH,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;gBAC7B,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;YACZ,CAAC;YAED,yBAAyB;YACzB,MAAM,OAAO,GAAG;gBACd,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI;gBACzB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;gBAC3B,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,EAAE;gBACnB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;gBAC3B,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE;gBACjE,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE;aAChC,CAAC;YACF,EAAE,CAAC,aAAa,CACd,QAAQ,EACR,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,EACvE,MAAM,CACP,CAAC;YAEF,wDAAwD;YACxD,IAAI,aAAa,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC9B,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBACzE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,WAAW,GAAG,OAAO,EAAE,CAAC,CAAC;gBACpE,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,QAAQ,GAAG,OAAO,EAAE,CAAC,CAAC;gBAEpE,4DAA4D;gBAC5D,IAAI,WAAW,KAAK,cAAc,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;oBACjE,IAAI,CAAC;wBACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;wBACtC,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;4BAC5B,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;wBAC7C,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC,CAAA,CAAC;gBACZ,CAAC;gBAED,2DAA2D;gBAC3D,IAAI,cAAc,GAAG,IAAI,CAAC;gBAC1B,IAAI,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;oBAClC,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;oBACzC,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;wBAC5B,cAAc,GAAG,KAAK,CAAC;wBACvB,YAAY,EAAE,CAAC;oBACjB,CAAC;gBACH,CAAC;gBAED,IAAI,cAAc,EAAE,CAAC;oBACnB,IAAI,CAAC;wBACH,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;wBACjE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE;4BACzC,OAAO,EAAE;gCACP,aAAa,EAAE,UAAU,OAAO,CAAC,KAAK,EAAE;6BACzC;yBACF,CAAC,CAAC;wBACH,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;4BACf,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;4BACxD,EAAE,CAAC,aAAa,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;4BACzC,eAAe,EAAE,CAAC;wBACpB,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;wBACP,sCAAsC;oBACxC,CAAC;gBACH,CAAC;YACH,CAAC;YAED,cAAc,EAAE,CAAC;YACjB,IAAI,cAAc,IAAI,WAAW,EAAE,CAAC;gBAClC,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC5D,MAAM;QACR,CAAC;QACD,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED,oGAAoG;IACpG,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9D,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,kDAAkD;YAClD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YACnE,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACpB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;oBAC5B,IAAI,CAAC;wBACH,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;wBACzC,YAAY,EAAE,CAAC;oBACjB,CAAC;oBAAC,MAAM,CAAC;wBACP,uBAAuB;oBACzB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,cAAc;QACrB,UAAU,EAAE,eAAe;QAC3B,OAAO,EAAE,YAAY;QACrB,OAAO,EAAE,YAAY;KACtB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { Frontmatter, ParsedMarkdown } from '../utils/frontmatter.js';
|
|
2
|
+
export interface MergeResult {
|
|
3
|
+
hasConflict: boolean;
|
|
4
|
+
frontmatter: Frontmatter;
|
|
5
|
+
body: string;
|
|
6
|
+
warnings: string[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Merges frontmatter fields key by key.
|
|
10
|
+
* Never inserts conflict markers into YAML (always produces valid Frontmatter).
|
|
11
|
+
* On collision (both local and remote modified the same field differently), remote takes precedence
|
|
12
|
+
* and a warning is logged.
|
|
13
|
+
*/
|
|
14
|
+
export declare function mergeFrontmatter(local: Frontmatter, base: Frontmatter | null, remote: Frontmatter): {
|
|
15
|
+
merged: Frontmatter;
|
|
16
|
+
warnings: string[];
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Merges markdown body line by line using diff3.
|
|
20
|
+
* Inserts Git-style conflict markers (<<<<<<< LOCAL ... ======= ... >>>>>>> REMOTE) only if there is a conflict.
|
|
21
|
+
*/
|
|
22
|
+
export declare function mergeBody(localBody: string, baseBody: string, remoteBody: string): {
|
|
23
|
+
mergedBody: string;
|
|
24
|
+
hasConflict: boolean;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Executes a Hybrid 3-Way Merge separating frontmatter structured merge and markdown text merge.
|
|
28
|
+
*/
|
|
29
|
+
export declare function hybrid3WayMerge(local: ParsedMarkdown, base: {
|
|
30
|
+
frontmatter: Frontmatter;
|
|
31
|
+
body: string;
|
|
32
|
+
} | null, remote: {
|
|
33
|
+
frontmatter: Frontmatter;
|
|
34
|
+
body: string;
|
|
35
|
+
}): MergeResult;
|
|
36
|
+
//# sourceMappingURL=merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/sync/merge.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE3E,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,WAAW,GAAG,IAAI,EACxB,MAAM,EAAE,WAAW,GAClB;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAsD7C;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAgB9C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE;IAAE,WAAW,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,EACvD,MAAM,EAAE;IAAE,WAAW,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjD,WAAW,CAgBb"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2026 SPORT-SERVICE RS★R
|
|
3
|
+
*
|
|
4
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
6
|
+
* in the Software without restriction, including without limitation the rights
|
|
7
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
9
|
+
* furnished to do so, subject to the following conditions:
|
|
10
|
+
*
|
|
11
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
12
|
+
* copies or substantial portions of the Software.
|
|
13
|
+
*
|
|
14
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
15
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
17
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
18
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
20
|
+
* SOFTWARE.
|
|
21
|
+
*/
|
|
22
|
+
import { merge as diff3Merge } from 'node-diff3';
|
|
23
|
+
/**
|
|
24
|
+
* Merges frontmatter fields key by key.
|
|
25
|
+
* Never inserts conflict markers into YAML (always produces valid Frontmatter).
|
|
26
|
+
* On collision (both local and remote modified the same field differently), remote takes precedence
|
|
27
|
+
* and a warning is logged.
|
|
28
|
+
*/
|
|
29
|
+
export function mergeFrontmatter(local, base, remote) {
|
|
30
|
+
const warnings = [];
|
|
31
|
+
const merged = { ...remote };
|
|
32
|
+
// Helper to check equality
|
|
33
|
+
const isEqual = (a, b) => JSON.stringify(a) === JSON.stringify(b);
|
|
34
|
+
const keys = [
|
|
35
|
+
'title',
|
|
36
|
+
'slug',
|
|
37
|
+
'status',
|
|
38
|
+
'publishedAt',
|
|
39
|
+
'locale',
|
|
40
|
+
'taxonomies',
|
|
41
|
+
'seo',
|
|
42
|
+
'bylines',
|
|
43
|
+
];
|
|
44
|
+
for (const key of keys) {
|
|
45
|
+
const localVal = local[key];
|
|
46
|
+
const remoteVal = remote[key];
|
|
47
|
+
const baseVal = base ? base[key] : undefined;
|
|
48
|
+
const localChanged = !isEqual(localVal, baseVal);
|
|
49
|
+
const remoteChanged = !isEqual(remoteVal, baseVal);
|
|
50
|
+
if (localChanged && !remoteChanged) {
|
|
51
|
+
// Only local changed; keep local
|
|
52
|
+
merged[key] = localVal;
|
|
53
|
+
}
|
|
54
|
+
else if (!localChanged && remoteChanged) {
|
|
55
|
+
// Only remote changed; keep remote
|
|
56
|
+
merged[key] = remoteVal;
|
|
57
|
+
}
|
|
58
|
+
else if (localChanged && remoteChanged) {
|
|
59
|
+
if (isEqual(localVal, remoteVal)) {
|
|
60
|
+
// Both changed to the same value
|
|
61
|
+
merged[key] = localVal;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
// True conflict on frontmatter field: remote takes precedence
|
|
65
|
+
merged[key] = remoteVal;
|
|
66
|
+
warnings.push(`Conflict on frontmatter field '${key}': remote value was preferred over local changes.`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
// Neither changed
|
|
71
|
+
merged[key] = remoteVal;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Preserve mandatory immutable fields
|
|
75
|
+
merged.id = remote.id || local.id;
|
|
76
|
+
merged.collection = remote.collection || local.collection;
|
|
77
|
+
return { merged, warnings };
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Merges markdown body line by line using diff3.
|
|
81
|
+
* Inserts Git-style conflict markers (<<<<<<< LOCAL ... ======= ... >>>>>>> REMOTE) only if there is a conflict.
|
|
82
|
+
*/
|
|
83
|
+
export function mergeBody(localBody, baseBody, remoteBody) {
|
|
84
|
+
// Normalize line breaks to \n and split into line arrays
|
|
85
|
+
const localLines = localBody.replace(/\r\n/g, '\n').split('\n');
|
|
86
|
+
const baseLines = baseBody.replace(/\r\n/g, '\n').split('\n');
|
|
87
|
+
const remoteLines = remoteBody.replace(/\r\n/g, '\n').split('\n');
|
|
88
|
+
// diff3Merge(a, o, b) where a = local, o = original (base), b = remote
|
|
89
|
+
const res = diff3Merge(localLines, baseLines, remoteLines, {
|
|
90
|
+
label: { a: 'LOCAL', b: 'REMOTE' },
|
|
91
|
+
});
|
|
92
|
+
const mergedBody = res.result.join('\n');
|
|
93
|
+
return {
|
|
94
|
+
mergedBody,
|
|
95
|
+
hasConflict: res.conflict,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Executes a Hybrid 3-Way Merge separating frontmatter structured merge and markdown text merge.
|
|
100
|
+
*/
|
|
101
|
+
export function hybrid3WayMerge(local, base, remote) {
|
|
102
|
+
const { merged: frontmatter, warnings } = mergeFrontmatter(local.frontmatter, base ? base.frontmatter : null, remote.frontmatter);
|
|
103
|
+
const baseBody = base ? base.body : '';
|
|
104
|
+
const { mergedBody: body, hasConflict } = mergeBody(local.body, baseBody, remote.body);
|
|
105
|
+
return {
|
|
106
|
+
hasConflict,
|
|
107
|
+
frontmatter,
|
|
108
|
+
body,
|
|
109
|
+
warnings,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/sync/merge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type TaxonomyCandidates } from '../utils/frontmatter.js';
|
|
2
|
+
import type { CacheDatabase } from '../db/cache.js';
|
|
3
|
+
export interface CreateArticleOptions {
|
|
4
|
+
workspaceRoot: string;
|
|
5
|
+
slug: string;
|
|
6
|
+
title?: string;
|
|
7
|
+
collection?: string;
|
|
8
|
+
locale?: string;
|
|
9
|
+
byline?: string;
|
|
10
|
+
cache?: CacheDatabase;
|
|
11
|
+
candidates?: TaxonomyCandidates;
|
|
12
|
+
}
|
|
13
|
+
export interface CreateArticleResult {
|
|
14
|
+
id: string;
|
|
15
|
+
slug: string;
|
|
16
|
+
filePath: string;
|
|
17
|
+
fullPath: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Creates a brand-new article scaffold in <collection>/draft/<ulid>-<slug>.md.
|
|
21
|
+
* Assigns a client-side ULID immediately to guarantee ID/filename consistency (G2).
|
|
22
|
+
*/
|
|
23
|
+
export declare function createArticleScaffold(options: CreateArticleOptions): CreateArticleResult;
|
|
24
|
+
//# sourceMappingURL=new.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"new.d.ts","sourceRoot":"","sources":["../../src/sync/new.ts"],"names":[],"mappings":"AAyBA,OAAO,EAIL,KAAK,kBAAkB,EACxB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,oBAAoB,GAAG,mBAAmB,CAgDxF"}
|
package/dist/sync/new.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2026 SPORT-SERVICE RS★R
|
|
3
|
+
*
|
|
4
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
6
|
+
* in the Software without restriction, including without limitation the rights
|
|
7
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
9
|
+
* furnished to do so, subject to the following conditions:
|
|
10
|
+
*
|
|
11
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
12
|
+
* copies or substantial portions of the Software.
|
|
13
|
+
*
|
|
14
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
15
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
17
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
18
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
20
|
+
* SOFTWARE.
|
|
21
|
+
*/
|
|
22
|
+
import fs from 'node:fs';
|
|
23
|
+
import path from 'node:path';
|
|
24
|
+
import { ulid } from 'ulidx';
|
|
25
|
+
import { computeArticleRelativePath, serializeMarkdown, } from '../utils/frontmatter.js';
|
|
26
|
+
import { loadLocalTaxonomyCandidates } from './taxonomies.js';
|
|
27
|
+
/**
|
|
28
|
+
* Creates a brand-new article scaffold in <collection>/draft/<ulid>-<slug>.md.
|
|
29
|
+
* Assigns a client-side ULID immediately to guarantee ID/filename consistency (G2).
|
|
30
|
+
*/
|
|
31
|
+
export function createArticleScaffold(options) {
|
|
32
|
+
const id = ulid();
|
|
33
|
+
const collection = options.collection || 'posts';
|
|
34
|
+
const slug = options.slug.trim().toLowerCase();
|
|
35
|
+
const title = options.title || slug;
|
|
36
|
+
const locale = options.locale || 'ja';
|
|
37
|
+
let initialBylines = [];
|
|
38
|
+
if (options.byline) {
|
|
39
|
+
initialBylines = [options.byline];
|
|
40
|
+
}
|
|
41
|
+
else if (options.cache) {
|
|
42
|
+
const cached = options.cache.getBylines().filter((b) => !b.isGuest);
|
|
43
|
+
if (cached.length > 0 && cached[0].slug) {
|
|
44
|
+
initialBylines = [cached[0].slug];
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const frontmatter = {
|
|
48
|
+
id,
|
|
49
|
+
slug,
|
|
50
|
+
title,
|
|
51
|
+
collection,
|
|
52
|
+
status: 'draft',
|
|
53
|
+
publishedAt: null,
|
|
54
|
+
locale,
|
|
55
|
+
taxonomies: {
|
|
56
|
+
categories: [],
|
|
57
|
+
tags: [],
|
|
58
|
+
},
|
|
59
|
+
bylines: initialBylines,
|
|
60
|
+
};
|
|
61
|
+
const initialBody = 'Write article body content here...\n';
|
|
62
|
+
const candidates = options.candidates || loadLocalTaxonomyCandidates(options.workspaceRoot);
|
|
63
|
+
const markdownContent = serializeMarkdown(frontmatter, initialBody, candidates);
|
|
64
|
+
const relPath = computeArticleRelativePath(collection, 'draft', id, title || slug, new Date());
|
|
65
|
+
const fullPath = path.join(options.workspaceRoot, relPath);
|
|
66
|
+
fs.mkdirSync(path.dirname(fullPath), { recursive: true });
|
|
67
|
+
fs.writeFileSync(fullPath, markdownContent, 'utf8');
|
|
68
|
+
return {
|
|
69
|
+
id,
|
|
70
|
+
slug,
|
|
71
|
+
filePath: relPath,
|
|
72
|
+
fullPath,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=new.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"new.js","sourceRoot":"","sources":["../../src/sync/new.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAC7B,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,GAGlB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAqB9D;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAA6B;IACjE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC;IAClB,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC;IACjD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC;IACpC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC;IAEtC,IAAI,cAAc,GAAa,EAAE,CAAC;IAClC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,cAAc,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;SAAM,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACpE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACxC,cAAc,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAgB;QAC/B,EAAE;QACF,IAAI;QACJ,KAAK;QACL,UAAU;QACV,MAAM,EAAE,OAAO;QACf,WAAW,EAAE,IAAI;QACjB,MAAM;QACN,UAAU,EAAE;YACV,UAAU,EAAE,EAAE;YACd,IAAI,EAAE,EAAE;SACT;QACD,OAAO,EAAE,cAAc;KACxB,CAAC;IAEF,MAAM,WAAW,GAAG,sCAAsC,CAAC;IAC3D,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,2BAA2B,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC5F,MAAM,eAAe,GAAG,iBAAiB,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IAEhF,MAAM,OAAO,GAAG,0BAA0B,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;IAC/F,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAE3D,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;IAEpD,OAAO;QACL,EAAE;QACF,IAAI;QACJ,QAAQ,EAAE,OAAO;QACjB,QAAQ;KACT,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { CacheDatabase } from '../db/cache.js';
|
|
2
|
+
import { type PullResult, type ListRemoteArticlesOptions } from './pull.js';
|
|
3
|
+
import { type PushResult, type PushOptions } from './push.js';
|
|
4
|
+
export interface UnpushedConflictItem {
|
|
5
|
+
id: string;
|
|
6
|
+
slug: string;
|
|
7
|
+
filePath: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class SyncPruneConflictError extends Error {
|
|
10
|
+
conflictItems: UnpushedConflictItem[];
|
|
11
|
+
limit?: number;
|
|
12
|
+
constructor(message: string, conflictItems: UnpushedConflictItem[], limit?: number);
|
|
13
|
+
}
|
|
14
|
+
export interface PullBatchOptions extends ListRemoteArticlesOptions {
|
|
15
|
+
workspaceRoot: string;
|
|
16
|
+
cache: CacheDatabase;
|
|
17
|
+
collection: string;
|
|
18
|
+
force?: boolean;
|
|
19
|
+
concurrency?: number;
|
|
20
|
+
prune?: boolean;
|
|
21
|
+
onProgress?: (progress: {
|
|
22
|
+
current: number;
|
|
23
|
+
total: number;
|
|
24
|
+
item: PullResult;
|
|
25
|
+
}) => void;
|
|
26
|
+
}
|
|
27
|
+
export interface PullBatchResult {
|
|
28
|
+
total: number;
|
|
29
|
+
updated: number;
|
|
30
|
+
skipped: number;
|
|
31
|
+
deleted?: number;
|
|
32
|
+
items: PullResult[];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Orchestrates batch pulling of articles for a collection.
|
|
36
|
+
* Reusable across CLI and MCP servers to ensure consistent behavior.
|
|
37
|
+
*/
|
|
38
|
+
export declare function pullBatch(options: PullBatchOptions): Promise<PullBatchResult>;
|
|
39
|
+
export interface PushAllOptions extends Omit<PushOptions, 'rawItem'> {
|
|
40
|
+
workspaceRoot: string;
|
|
41
|
+
cache: CacheDatabase;
|
|
42
|
+
collection?: string;
|
|
43
|
+
}
|
|
44
|
+
export interface PushAllResult {
|
|
45
|
+
total: number;
|
|
46
|
+
pushed: number;
|
|
47
|
+
skipped: number;
|
|
48
|
+
results: PushResult[];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Orchestrates pushing all modified/untracked files in the workspace.
|
|
52
|
+
* Reusable across CLI and MCP servers.
|
|
53
|
+
*/
|
|
54
|
+
export declare function pushAll(options: PushAllOptions): Promise<PushAllResult>;
|
|
55
|
+
//# sourceMappingURL=orchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/sync/orchestrator.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,aAAa,EAAa,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,yBAAyB,EAC/B,MAAM,WAAW,CAAC;AACnB,OAAO,EAAe,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAI3E,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IACxC,aAAa,EAAE,oBAAoB,EAAE,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IAEtB,YAAY,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,oBAAoB,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,EAKjF;CACF;AAED,MAAM,WAAW,gBAAiB,SAAQ,yBAAyB;IACjE,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,aAAa,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE,KAAK,IAAI,CAAC;CACvF;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAuKnF;AAED,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC;IAClE,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,aAAa,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CA2B7E"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2026 SPORT-SERVICE RS★R
|
|
3
|
+
*
|
|
4
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
6
|
+
* in the Software without restriction, including without limitation the rights
|
|
7
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
9
|
+
* furnished to do so, subject to the following conditions:
|
|
10
|
+
*
|
|
11
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
12
|
+
* copies or substantial portions of the Software.
|
|
13
|
+
*
|
|
14
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
15
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
17
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
18
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
20
|
+
* SOFTWARE.
|
|
21
|
+
*/
|
|
22
|
+
import fs from 'node:fs';
|
|
23
|
+
import path from 'node:path';
|
|
24
|
+
import { listRemoteArticles, pullArticle, calculateHash, } from './pull.js';
|
|
25
|
+
import { pushArticle } from './push.js';
|
|
26
|
+
import { getWorkspaceStatus } from './status.js';
|
|
27
|
+
import { syncRemoteBylines } from './bylines.js';
|
|
28
|
+
export class SyncPruneConflictError extends Error {
|
|
29
|
+
conflictItems;
|
|
30
|
+
limit;
|
|
31
|
+
constructor(message, conflictItems, limit) {
|
|
32
|
+
super(message);
|
|
33
|
+
this.name = 'SyncPruneConflictError';
|
|
34
|
+
this.conflictItems = conflictItems;
|
|
35
|
+
this.limit = limit;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Orchestrates batch pulling of articles for a collection.
|
|
40
|
+
* Reusable across CLI and MCP servers to ensure consistent behavior.
|
|
41
|
+
*/
|
|
42
|
+
export async function pullBatch(options) {
|
|
43
|
+
// Synchronize remote bylines into local SQLite cache before pulling articles
|
|
44
|
+
const bylineMaps = await syncRemoteBylines({
|
|
45
|
+
origin: options.origin,
|
|
46
|
+
token: options.token,
|
|
47
|
+
refreshToken: options.refreshToken,
|
|
48
|
+
cache: options.cache,
|
|
49
|
+
fetchFn: options.fetchFn,
|
|
50
|
+
}).catch(() => options.cache.getBylineMaps());
|
|
51
|
+
const remoteList = await listRemoteArticles(options.collection, {
|
|
52
|
+
origin: options.origin,
|
|
53
|
+
token: options.token,
|
|
54
|
+
refreshToken: options.refreshToken,
|
|
55
|
+
limit: options.limit,
|
|
56
|
+
all: options.all,
|
|
57
|
+
status: options.status,
|
|
58
|
+
fetchFn: options.fetchFn,
|
|
59
|
+
});
|
|
60
|
+
const shouldPrune = options.prune !== false;
|
|
61
|
+
const candidatesToPrune = [];
|
|
62
|
+
if (shouldPrune) {
|
|
63
|
+
const remoteIdSet = new Set(remoteList.map((r) => r.id));
|
|
64
|
+
const allLocalSyncs = options.cache.getAllSyncStates();
|
|
65
|
+
const collectionEntries = options.cache.listEntries(options.collection);
|
|
66
|
+
const collectionEntryIds = new Set(collectionEntries.map((e) => e.id));
|
|
67
|
+
const targetStatus = options.status || 'all';
|
|
68
|
+
for (const syncState of allLocalSyncs) {
|
|
69
|
+
const belongsToCollection = collectionEntryIds.has(syncState.id) ||
|
|
70
|
+
syncState.localFilePath.startsWith(options.collection + path.sep) ||
|
|
71
|
+
syncState.localFilePath.startsWith(options.collection + '/');
|
|
72
|
+
if (!belongsToCollection)
|
|
73
|
+
continue;
|
|
74
|
+
if (targetStatus !== 'all' && syncState.status !== targetStatus) {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (!remoteIdSet.has(syncState.id)) {
|
|
78
|
+
candidatesToPrune.push(syncState);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Safety guard: Check if any pushed-out candidate has unpushed local changes
|
|
82
|
+
const unpushedConflicts = [];
|
|
83
|
+
for (const candidate of candidatesToPrune) {
|
|
84
|
+
const fullPath = path.join(options.workspaceRoot, candidate.localFilePath);
|
|
85
|
+
if (fs.existsSync(fullPath)) {
|
|
86
|
+
try {
|
|
87
|
+
const content = fs.readFileSync(fullPath, 'utf8');
|
|
88
|
+
const currentHash = calculateHash(content);
|
|
89
|
+
if (currentHash !== candidate.localHash) {
|
|
90
|
+
unpushedConflicts.push({
|
|
91
|
+
id: candidate.id,
|
|
92
|
+
slug: candidate.slug,
|
|
93
|
+
filePath: candidate.localFilePath,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// If read fails, safely ignore
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (unpushedConflicts.length > 0) {
|
|
103
|
+
const filesList = unpushedConflicts.map((i) => ` - ${i.filePath} (${i.slug})`).join('\n');
|
|
104
|
+
const windowMsg = options.limit ? ` (currently: ${options.limit})` : '';
|
|
105
|
+
const message = `Pull aborted: ${unpushedConflicts.length} article(s) outside the sync window have unpushed local edits!\n\n` +
|
|
106
|
+
`The following article(s) would be pruned from local cache, but contain unpushed changes:\n${filesList}\n\n` +
|
|
107
|
+
`💡 Why did this happen?\n` +
|
|
108
|
+
`The modified article(s) are older than the workspace sync window${windowMsg}.\n\n` +
|
|
109
|
+
`Recommended actions:\n` +
|
|
110
|
+
` 1. Push local changes: emit push <filePath>\n` +
|
|
111
|
+
` 2. Adjust sync window: update "postsSyncLimit" in .emit/config.json if a larger window is needed\n`;
|
|
112
|
+
throw new SyncPruneConflictError(message, unpushedConflicts, options.limit);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const results = [];
|
|
116
|
+
let updated = 0;
|
|
117
|
+
let skipped = 0;
|
|
118
|
+
const concurrency = options.concurrency || 8;
|
|
119
|
+
let index = 0;
|
|
120
|
+
const worker = async () => {
|
|
121
|
+
while (index < remoteList.length) {
|
|
122
|
+
const currentIndex = index++;
|
|
123
|
+
const item = remoteList[currentIndex];
|
|
124
|
+
const res = await pullArticle(options.collection, item.id, {
|
|
125
|
+
workspaceRoot: options.workspaceRoot,
|
|
126
|
+
cache: options.cache,
|
|
127
|
+
origin: options.origin,
|
|
128
|
+
token: options.token,
|
|
129
|
+
refreshToken: options.refreshToken,
|
|
130
|
+
rawItem: item.rawItem,
|
|
131
|
+
force: options.force,
|
|
132
|
+
fetchFn: options.fetchFn,
|
|
133
|
+
bylineIdToSlug: bylineMaps.idToSlug,
|
|
134
|
+
bylineSlugToId: bylineMaps.slugToId,
|
|
135
|
+
});
|
|
136
|
+
results.push(res);
|
|
137
|
+
if (res.skipped)
|
|
138
|
+
skipped++;
|
|
139
|
+
else
|
|
140
|
+
updated++;
|
|
141
|
+
if (options.onProgress) {
|
|
142
|
+
options.onProgress({
|
|
143
|
+
current: results.length,
|
|
144
|
+
total: remoteList.length + candidatesToPrune.length,
|
|
145
|
+
item: res,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
const pool = Array.from({ length: Math.min(concurrency, remoteList.length) }, () => worker());
|
|
151
|
+
await Promise.all(pool);
|
|
152
|
+
// Prune local cached entries that are outside the sync window (or remote-deleted)
|
|
153
|
+
let deleted = 0;
|
|
154
|
+
if (shouldPrune) {
|
|
155
|
+
for (const candidate of candidatesToPrune) {
|
|
156
|
+
const fullPath = path.join(options.workspaceRoot, candidate.localFilePath);
|
|
157
|
+
if (fs.existsSync(fullPath)) {
|
|
158
|
+
try {
|
|
159
|
+
fs.unlinkSync(fullPath);
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
// ignore
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
options.cache.deleteEntry(candidate.id);
|
|
166
|
+
deleted++;
|
|
167
|
+
const deletedResult = {
|
|
168
|
+
id: candidate.id,
|
|
169
|
+
slug: candidate.slug,
|
|
170
|
+
status: candidate.status,
|
|
171
|
+
filePath: candidate.localFilePath,
|
|
172
|
+
updated: false,
|
|
173
|
+
deleted: true,
|
|
174
|
+
};
|
|
175
|
+
results.push(deletedResult);
|
|
176
|
+
if (options.onProgress) {
|
|
177
|
+
options.onProgress({
|
|
178
|
+
current: results.length,
|
|
179
|
+
total: remoteList.length + candidatesToPrune.length,
|
|
180
|
+
item: deletedResult,
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return {
|
|
186
|
+
total: remoteList.length,
|
|
187
|
+
updated,
|
|
188
|
+
skipped,
|
|
189
|
+
deleted,
|
|
190
|
+
items: results,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Orchestrates pushing all modified/untracked files in the workspace.
|
|
195
|
+
* Reusable across CLI and MCP servers.
|
|
196
|
+
*/
|
|
197
|
+
export async function pushAll(options) {
|
|
198
|
+
const status = getWorkspaceStatus(options.workspaceRoot, options.cache, options.collection);
|
|
199
|
+
const toPush = status.items.filter((i) => i.syncStatus !== 'synced');
|
|
200
|
+
const results = [];
|
|
201
|
+
let pushed = 0;
|
|
202
|
+
for (const item of toPush) {
|
|
203
|
+
const res = await pushArticle(item.filePath, {
|
|
204
|
+
workspaceRoot: options.workspaceRoot,
|
|
205
|
+
cache: options.cache,
|
|
206
|
+
origin: options.origin,
|
|
207
|
+
token: options.token,
|
|
208
|
+
refreshToken: options.refreshToken,
|
|
209
|
+
allowPublish: options.allowPublish,
|
|
210
|
+
fetchFn: options.fetchFn,
|
|
211
|
+
});
|
|
212
|
+
results.push(res);
|
|
213
|
+
pushed++;
|
|
214
|
+
}
|
|
215
|
+
return {
|
|
216
|
+
total: toPush.length,
|
|
217
|
+
pushed,
|
|
218
|
+
skipped: status.items.length - toPush.length,
|
|
219
|
+
results,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/sync/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Frontmatter, ParsedMarkdown } from '../utils/frontmatter.js';
|
|
2
|
+
export interface PreflightOptions {
|
|
3
|
+
allowPublish?: boolean;
|
|
4
|
+
knownTaxonomies?: Record<string, string[]>;
|
|
5
|
+
baseMarkdown?: string;
|
|
6
|
+
previousStatus?: 'draft' | 'published';
|
|
7
|
+
}
|
|
8
|
+
export interface PreflightResult {
|
|
9
|
+
valid: boolean;
|
|
10
|
+
cleanedBody: string;
|
|
11
|
+
frontmatter: Frontmatter;
|
|
12
|
+
errors: PreflightError[];
|
|
13
|
+
warnings: string[];
|
|
14
|
+
}
|
|
15
|
+
export interface PreflightError {
|
|
16
|
+
code: string;
|
|
17
|
+
message: string;
|
|
18
|
+
suggestion?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Runs Preflight Guards G2 through G9 against the article to prevent AI misbehavior.
|
|
22
|
+
* (G1 is enforced at the MCP / CLI invocation layer).
|
|
23
|
+
*/
|
|
24
|
+
export declare function runPreflightChecks(filePath: string, parsed: ParsedMarkdown, options?: PreflightOptions): PreflightResult;
|
|
25
|
+
//# sourceMappingURL=preflight.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../src/sync/preflight.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE3E,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;CACxC;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAKD;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,EACtB,OAAO,CAAC,EAAE,gBAAgB,GACzB,eAAe,CAmHjB"}
|