gitifact 0.5.1 → 0.6.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.
Files changed (182) hide show
  1. package/dist/THIRD_PARTY_NOTICES.txt +3495 -191
  2. package/dist/browser/assets/BottomSheet-BFoM6syr.js +1 -0
  3. package/dist/browser/assets/Grid-C9rNT-fL.js +1 -0
  4. package/dist/browser/assets/Icon-DPaLmsmh.js +4 -0
  5. package/dist/browser/assets/IconButton-Br-4XhQr.js +1 -0
  6. package/dist/browser/assets/Markdown-Bc6pMi97.js +68 -0
  7. package/dist/browser/assets/{MenuBottomSheet-CQA7HL9k.js → MenuBottomSheet-Dgz4h1S7.js} +1 -1
  8. package/dist/browser/assets/MetadataListItem-BjA4nmg3.js +1 -0
  9. package/dist/browser/assets/ProgressBarMarkTooltip-BxGSd9KS.js +1 -0
  10. package/dist/browser/assets/Section-Z2PuhE6c.js +1 -0
  11. package/dist/browser/assets/Table-DodMTw3P.js +3 -0
  12. package/dist/browser/assets/TimestampHoverCard-BJShn6bb.js +1 -0
  13. package/dist/browser/assets/Tooltip-MoU3alsv.js +1 -0
  14. package/dist/browser/assets/abnfDiagram-VCTEODGH-DmAlk-TR.js +1 -0
  15. package/dist/browser/assets/{about-Chl-XBQg.js → about-CmwTK0Rl.js} +1 -1
  16. package/dist/browser/assets/activity-BF4_xkCU.js +1 -0
  17. package/dist/browser/assets/appearance-pAOSjMU4.js +1 -0
  18. package/dist/browser/assets/arc-Pry-7G1_.js +1 -0
  19. package/dist/browser/assets/architecture-7GRP2DOG-BuddTnfb.js +1 -0
  20. package/dist/browser/assets/architectureDiagram-5GKGNRK7-VwuVv8aO.js +36 -0
  21. package/dist/browser/assets/array-BifhSqXX.js +1 -0
  22. package/dist/browser/assets/blockDiagram-I7D4REHJ-BY92gQgN.js +129 -0
  23. package/dist/browser/assets/c4Diagram-7LVT6UL2-D5TNBYXh.js +38 -0
  24. package/dist/browser/assets/changelog-Dm-wCZt4.js +2 -0
  25. package/dist/browser/assets/channel-NEbtzeVB.js +1 -0
  26. package/dist/browser/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  27. package/dist/browser/assets/chunk-4HAMMTFA-DBbX-wzu.js +62 -0
  28. package/dist/browser/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
  29. package/dist/browser/assets/chunk-75Z2AOVW-962-yyBD.js +2 -0
  30. package/dist/browser/assets/chunk-DU6HZSFF-CHHMX1CR.js +127 -0
  31. package/dist/browser/assets/chunk-F27PBJKO-BOnYAGjZ.js +1 -0
  32. package/dist/browser/assets/chunk-FOHPRMQF-DzxwRta7.js +161 -0
  33. package/dist/browser/assets/chunk-GMAD6QVW-DQF31PdR.js +72 -0
  34. package/dist/browser/assets/chunk-GVQU2GXP-rruJzn36.js +1 -0
  35. package/dist/browser/assets/chunk-IMKFNOWR-CZ8ptS4j.js +231 -0
  36. package/dist/browser/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  37. package/dist/browser/assets/chunk-L3NEJ4N5-USlKRxmU.js +1 -0
  38. package/dist/browser/assets/chunk-OSK3NFVY-DYQeYWNP.js +10 -0
  39. package/dist/browser/assets/chunk-P2QGCYS3-SDkZ9hQX.js +1 -0
  40. package/dist/browser/assets/chunk-POPQ4Y6H-bdnFdIMc.js +1 -0
  41. package/dist/browser/assets/chunk-PWAF6VOD-DuKrEmQw.js +1 -0
  42. package/dist/browser/assets/chunk-SHT3W25Y-IggbHeog.js +168 -0
  43. package/dist/browser/assets/chunk-SVP7TREG-BxYPjkqU.js +88 -0
  44. package/dist/browser/assets/chunk-TICWLB2K-DMrY9ez0.js +206 -0
  45. package/dist/browser/assets/chunk-XXDRQBXY-DqAYeljN.js +1 -0
  46. package/dist/browser/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  47. package/dist/browser/assets/classDiagram-ZZMXUADV-BwE_Hs5R.js +1 -0
  48. package/dist/browser/assets/classDiagram-v2-VYDZK3BY-BwE_Hs5R.js +1 -0
  49. package/dist/browser/assets/{container.stylex-oPimSCGl.js → container.stylex-rwI38dw9.js} +1 -1
  50. package/dist/browser/assets/{contributors._email-CINLTSX2.js → contributors._email-C99eiup4.js} +1 -1
  51. package/dist/browser/assets/contributors.index-BzPuT_XG.js +1 -0
  52. package/dist/browser/assets/cose-bilkent-JH36ORCC-BEpcWcmK.js +1 -0
  53. package/dist/browser/assets/cynefin-OW5HDTMX-C4N2LLi1.js +1 -0
  54. package/dist/browser/assets/cynefinDiagram-5FMLGOSQ-C3KE8asf.js +62 -0
  55. package/dist/browser/assets/cytoscape.esm-Yq6u8L66.js +321 -0
  56. package/dist/browser/assets/dagre-C-rnJpZF.js +1 -0
  57. package/dist/browser/assets/dagre-GXQ25YYZ-C20xAaTE.js +4 -0
  58. package/dist/browser/assets/defaultLocale-BFoDCU3G.js +1 -0
  59. package/dist/browser/assets/diagram-S7CK7UJ4-6wtbgLIX.js +30 -0
  60. package/dist/browser/assets/diagram-UQ7AKVKN-BA02zKbd.js +41 -0
  61. package/dist/browser/assets/diagram-VSXAHHWV-Bl0Bun2O.js +3 -0
  62. package/dist/browser/assets/diagram-VX7I27RA-ChsRTsfS.js +24 -0
  63. package/dist/browser/assets/diagram-Z3DM3KII-B3Mxficd.js +24 -0
  64. package/dist/browser/assets/dist-v5Q1xZ2K.js +1 -0
  65. package/dist/browser/assets/document-CaUvlKcm.css +1 -0
  66. package/dist/browser/assets/document-DcPjYojg.js +11 -0
  67. package/dist/browser/assets/ebnfDiagram-PWID7BFC-Cs_89QgY.js +1 -0
  68. package/dist/browser/assets/erDiagram-RLTQ6QDP-BefkilYT.js +99 -0
  69. package/dist/browser/assets/eventmodeling-NTZA5JFV-OyiymXqZ.js +1 -0
  70. package/dist/browser/assets/{features._featureId-FySsJ2tl.js → features._featureId-BVMBUbIc.js} +1 -1
  71. package/dist/browser/assets/features.index-DAF_MoVe.js +1 -0
  72. package/dist/browser/assets/flowDiagram-HODETNUW-BGkl5kD6.js +1 -0
  73. package/dist/browser/assets/ganttDiagram-EL5Y4UJY-B_Y3HJTL.js +292 -0
  74. package/dist/browser/assets/git-CuBxy8Rl.js +1 -0
  75. package/dist/browser/assets/gitGraph-4MIJSDKK-CPDeR11I.js +1 -0
  76. package/dist/browser/assets/gitGraphDiagram-WWUBYQGX-B89zUhQY.js +106 -0
  77. package/dist/browser/assets/graphlib-DS17s2tU.js +1 -0
  78. package/dist/browser/assets/index-w5oyNndb.js +48 -0
  79. package/dist/browser/assets/info-A6RAGUB7-DlEdyaYJ.js +1 -0
  80. package/dist/browser/assets/infoDiagram-27XIBGKW-T8vu4pEW.js +2 -0
  81. package/dist/browser/assets/init-C-OQMol4.js +1 -0
  82. package/dist/browser/assets/ishikawaDiagram-5VMMS53U-B4C53CII.js +70 -0
  83. package/dist/browser/assets/journeyDiagram-3NMN7TZE-DemWKqD6.js +139 -0
  84. package/dist/browser/assets/kanban-definition-UXKFOSKX-xMvrIZPT.js +89 -0
  85. package/dist/browser/assets/katex-ZlcWpGUi.js +257 -0
  86. package/dist/browser/assets/line-CfCBYCoS.js +1 -0
  87. package/dist/browser/assets/linear-SzVmGSw4.js +1 -0
  88. package/dist/browser/assets/mermaid-parser.core-DCp4gVZn.js +7 -0
  89. package/dist/browser/assets/mermaid.core-ny8BaDSG.js +44 -0
  90. package/dist/browser/assets/mindmap-definition-YA3MSWOX-CNWF3H17.js +96 -0
  91. package/dist/browser/assets/ordinal-BDEzSJ7C.js +1 -0
  92. package/dist/browser/assets/packet-AYTQ26CC-DgNRIjqj.js +1 -0
  93. package/dist/browser/assets/page-header-DPWfThZo.js +124 -0
  94. package/dist/browser/assets/page-header-DZvVAckA.css +1 -0
  95. package/dist/browser/assets/path-fybaL0A-.js +1 -0
  96. package/dist/browser/assets/pegDiagram-XKGWAZYB-BPEzoUlc.js +1 -0
  97. package/dist/browser/assets/pie-WAS4IAKB-D85SGg9H.js +1 -0
  98. package/dist/browser/assets/pieDiagram-E7YTZNPT-L5HtHPrJ.js +39 -0
  99. package/dist/browser/assets/preload-helper-BZ1Pz5am.js +1 -0
  100. package/dist/browser/assets/product-BR5KVGuJ.css +1 -0
  101. package/dist/browser/assets/product-BmoIKtGm.js +8 -0
  102. package/dist/browser/assets/product.index-Fb5sQw1w.js +1 -0
  103. package/dist/browser/assets/quadrantDiagram-AXDQQJYC-BFek-axl.js +7 -0
  104. package/dist/browser/assets/radar-RG4KPBEZ-BwPngHhh.js +1 -0
  105. package/dist/browser/assets/railroad-74A4TZTK-Bf5cESw-.js +1 -0
  106. package/dist/browser/assets/railroad-abnf-HS5TGJTU-QtVzwDRk.js +1 -0
  107. package/dist/browser/assets/railroad-ebnf-LZEXJU2U-CCcgn2jt.js +1 -0
  108. package/dist/browser/assets/railroad-peg-WCYAUIDC-DWRNBkSL.js +1 -0
  109. package/dist/browser/assets/railroadDiagram-O6MQD6OU-0D-Z1mj1.js +1 -0
  110. package/dist/browser/assets/request-state-B7pKmdbJ.js +1 -0
  111. package/dist/browser/assets/requirementDiagram-BXWQKSXE-8pNButqN.js +84 -0
  112. package/dist/browser/assets/requirements-DGx4_rNJ.js +1 -0
  113. package/dist/browser/assets/rolldown-runtime-hePW80VL.js +1 -0
  114. package/dist/browser/assets/rough.esm-Dy-Kn_BL.js +1 -0
  115. package/dist/browser/assets/sankeyDiagram-P5KCCOFB-BOWaOPXp.js +40 -0
  116. package/dist/browser/assets/sequenceDiagram-WJ2MYXX4-BA3_JPLh.js +162 -0
  117. package/dist/browser/assets/settings-5JQQOYMj.js +1 -0
  118. package/dist/browser/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
  119. package/dist/browser/assets/src-B6xuSHsQ.js +1 -0
  120. package/dist/browser/assets/stateDiagram-D77RDMKH-YYcbi5Z-.js +1 -0
  121. package/dist/browser/assets/stateDiagram-v2-MP3YSRHH-BEg6dLDA.js +1 -0
  122. package/dist/browser/assets/swimlanes-42K2YHIH-B_Eh1oqP.js +1 -0
  123. package/dist/browser/assets/swimlanesDiagram-VR7AAH4N-Bckt0ZyW.js +8 -0
  124. package/dist/browser/assets/themeProps-CkLe5zXY.js +1 -0
  125. package/dist/browser/assets/timeline-definition-24CTP7MA-DfFHHbdC.js +120 -0
  126. package/dist/browser/assets/treeView-Q6P3EWNA-CaZRyAuW.js +1 -0
  127. package/dist/browser/assets/treemap-WGGIJYW6-DI2-Ryxd.js +1 -0
  128. package/dist/browser/assets/useClipboard-Cqx6Upy7.js +1 -0
  129. package/dist/browser/assets/useDevWarning-Dudfg3qF.js +1 -0
  130. package/dist/browser/assets/useIsomorphicLayoutEffect-BiEJxDg_.js +1 -0
  131. package/dist/browser/assets/useMediaQuery-twbHF0pO.js +1 -0
  132. package/dist/browser/assets/useScrollLock-D-Y-zHSV.js +1 -0
  133. package/dist/browser/assets/vennDiagram-4TSXK5OY-QXok2k3u.js +34 -0
  134. package/dist/browser/assets/wardley-WFR3VGLG-BiXQYqiJ.js +1 -0
  135. package/dist/browser/assets/wardleyDiagram-VM6X3IG4-BZBhm2Zm.js +78 -0
  136. package/dist/browser/assets/{wiki-DYxjYiPl.js → wiki-k4dXogJF.js} +1 -1
  137. package/dist/browser/assets/xychartDiagram-S5SC5T6Z-qrzzwM55.js +7 -0
  138. package/dist/browser/index.html +26 -25
  139. package/dist/i18n/ko/block.md +1 -0
  140. package/dist/i18n/ko/changelog.md +15 -0
  141. package/dist/i18n/ko/docs/commit.md +0 -1
  142. package/dist/i18n/ko/docs/design.md +2 -0
  143. package/dist/i18n/ko/docs/spec.md +2 -0
  144. package/dist/i18n/ko/docs/wiki.md +2 -0
  145. package/dist/i18n/ko/docs/writing.md +54 -0
  146. package/dist/main.js +119 -336
  147. package/package.json +3 -3
  148. package/dist/browser/assets/BottomSheet-F2BUQwSi.js +0 -1
  149. package/dist/browser/assets/Grid-kXvDaAvk.js +0 -1
  150. package/dist/browser/assets/IconButton-CkA9oftf.js +0 -1
  151. package/dist/browser/assets/Markdown-CqZ4w2H_.js +0 -68
  152. package/dist/browser/assets/MetadataListItem-B6xUZEC3.js +0 -1
  153. package/dist/browser/assets/ProgressBarMarkTooltip-BVcVKVq9.js +0 -1
  154. package/dist/browser/assets/Section-zmL2D3WL.js +0 -1
  155. package/dist/browser/assets/Table-DDKWqCdD.js +0 -3
  156. package/dist/browser/assets/TimestampHoverCard-DOWpOAzA.js +0 -1
  157. package/dist/browser/assets/Tooltip-a2AGdnkC.js +0 -1
  158. package/dist/browser/assets/activity-F2_AhgBS.js +0 -1
  159. package/dist/browser/assets/changelog-DrJfyXDZ.js +0 -2
  160. package/dist/browser/assets/composeEventHandlers-CHIontwB.js +0 -1
  161. package/dist/browser/assets/contributors.index-ChB89wcL.js +0 -1
  162. package/dist/browser/assets/devWarning-BZMSgwyk.js +0 -1
  163. package/dist/browser/assets/document-Jy6Buepz.js +0 -9
  164. package/dist/browser/assets/document-QMuypGH5.css +0 -1
  165. package/dist/browser/assets/features.index-DWfPG8WV.js +0 -1
  166. package/dist/browser/assets/git-AnH-8SBT.js +0 -1
  167. package/dist/browser/assets/index-DXK4gUTr.js +0 -48
  168. package/dist/browser/assets/page-header-9-i3H9WR.css +0 -1
  169. package/dist/browser/assets/page-header-N7A_M6-B.js +0 -124
  170. package/dist/browser/assets/product-BKOKDrzZ.js +0 -8
  171. package/dist/browser/assets/product-DNlxFjU7.css +0 -1
  172. package/dist/browser/assets/product.index-BohDJK9z.js +0 -1
  173. package/dist/browser/assets/request-state-CO3OLoay.js +0 -1
  174. package/dist/browser/assets/requirements-Dh2NEqNw.js +0 -1
  175. package/dist/browser/assets/settings-DylPhHVJ.js +0 -1
  176. package/dist/browser/assets/themeProps-MQSlTycI.js +0 -1
  177. package/dist/browser/assets/useClipboard-B8Or2k0a.js +0 -1
  178. package/dist/browser/assets/useDevWarning-Xg7kPMHJ.js +0 -1
  179. package/dist/browser/assets/useIsomorphicLayoutEffect-f8dYmyS2.js +0 -1
  180. package/dist/browser/assets/useMediaQuery-DFlnKIlp.js +0 -1
  181. package/dist/browser/assets/useScrollLock-CrQ0xkil.js +0 -1
  182. package/dist/browser/assets/useTranslator-DY2HN18N.js +0 -4
package/dist/main.js CHANGED
@@ -1537,16 +1537,16 @@ var Command = class _Command extends EventEmitter {
1537
1537
  * @param {Function} listener
1538
1538
  * @return {Command} `this` command for chaining
1539
1539
  */
1540
- hook(event, listener) {
1540
+ hook(event2, listener) {
1541
1541
  const allowedValues = ["preSubcommand", "preAction", "postAction"];
1542
- if (!allowedValues.includes(event)) {
1543
- throw new Error(`Unexpected value for event passed to hook : '${event}'.
1542
+ if (!allowedValues.includes(event2)) {
1543
+ throw new Error(`Unexpected value for event passed to hook : '${event2}'.
1544
1544
  Expecting one of '${allowedValues.join("', '")}'`);
1545
1545
  }
1546
- if (this._lifeCycleHooks[event]) {
1547
- this._lifeCycleHooks[event].push(listener);
1546
+ if (this._lifeCycleHooks[event2]) {
1547
+ this._lifeCycleHooks[event2].push(listener);
1548
1548
  } else {
1549
- this._lifeCycleHooks[event] = [listener];
1549
+ this._lifeCycleHooks[event2] = [listener];
1550
1550
  }
1551
1551
  return this;
1552
1552
  }
@@ -2383,15 +2383,15 @@ Expecting one of '${allowedValues.join("', '")}'`);
2383
2383
  * @return {(Promise|undefined)}
2384
2384
  * @private
2385
2385
  */
2386
- _chainOrCallHooks(promise2, event) {
2386
+ _chainOrCallHooks(promise2, event2) {
2387
2387
  let result = promise2;
2388
2388
  const hooks = [];
2389
- this._getCommandAndAncestors().reverse().filter((cmd) => cmd._lifeCycleHooks[event] !== void 0).forEach((hookedCommand) => {
2390
- hookedCommand._lifeCycleHooks[event].forEach((callback) => {
2389
+ this._getCommandAndAncestors().reverse().filter((cmd) => cmd._lifeCycleHooks[event2] !== void 0).forEach((hookedCommand) => {
2390
+ hookedCommand._lifeCycleHooks[event2].forEach((callback) => {
2391
2391
  hooks.push({ hookedCommand, callback });
2392
2392
  });
2393
2393
  });
2394
- if (event === "postAction") {
2394
+ if (event2 === "postAction") {
2395
2395
  hooks.reverse();
2396
2396
  }
2397
2397
  hooks.forEach((hookDetail) => {
@@ -2409,10 +2409,10 @@ Expecting one of '${allowedValues.join("', '")}'`);
2409
2409
  * @return {(Promise|undefined)}
2410
2410
  * @private
2411
2411
  */
2412
- _chainOrCallSubCommandHook(promise2, subCommand, event) {
2412
+ _chainOrCallSubCommandHook(promise2, subCommand, event2) {
2413
2413
  let result = promise2;
2414
- if (this._lifeCycleHooks[event] !== void 0) {
2415
- this._lifeCycleHooks[event].forEach((hook) => {
2414
+ if (this._lifeCycleHooks[event2] !== void 0) {
2415
+ this._lifeCycleHooks[event2].forEach((hook) => {
2416
2416
  result = this._chainOrCall(result, () => {
2417
2417
  return hook(this, subCommand);
2418
2418
  });
@@ -3779,9 +3779,9 @@ function parseDesignPreview(source2, specId) {
3779
3779
  fence = void 0;
3780
3780
  return line;
3781
3781
  }
3782
- const open6 = /^ {0,3}(`{3,}|~{3,})(.*)$/.exec(line);
3783
- if (open6) {
3784
- fence = { char: open6[1][0], size: open6[1].length };
3782
+ const open5 = /^ {0,3}(`{3,}|~{3,})(.*)$/.exec(line);
3783
+ if (open5) {
3784
+ fence = { char: open5[1][0], size: open5[1].length };
3785
3785
  return line;
3786
3786
  }
3787
3787
  if (/^#\s/.test(line))
@@ -3832,9 +3832,9 @@ function parseDocument(path3, source2) {
3832
3832
  fence = void 0;
3833
3833
  continue;
3834
3834
  }
3835
- const open6 = /^ {0,3}(`{3,}|~{3,})(.*)$/.exec(line);
3836
- if (open6) {
3837
- fence = { char: open6[1][0], size: open6[1].length };
3835
+ const open5 = /^ {0,3}(`{3,}|~{3,})(.*)$/.exec(line);
3836
+ if (open5) {
3837
+ fence = { char: open5[1][0], size: open5[1].length };
3838
3838
  continue;
3839
3839
  }
3840
3840
  if (/^#\s/.test(line))
@@ -3932,9 +3932,9 @@ function extractLinks(body) {
3932
3932
  fence = void 0;
3933
3933
  continue;
3934
3934
  }
3935
- const open6 = /^ {0,3}(`{3,}|~{3,})/.exec(line);
3936
- if (open6) {
3937
- fence = { char: open6[1][0], size: open6[1].length };
3935
+ const open5 = /^ {0,3}(`{3,}|~{3,})/.exec(line);
3936
+ if (open5) {
3937
+ fence = { char: open5[1][0], size: open5[1].length };
3938
3938
  continue;
3939
3939
  }
3940
3940
  for (const m of line.replace(/`[^`]*`/g, "").matchAll(/!?\[[^\]]*\]\((?:<([^>]+)>|([^)\s]+))(?:\s+"[^"]*")?\)/g))
@@ -24631,7 +24631,7 @@ var projectInitV5 = external_exports.discriminatedUnion("ok", [
24631
24631
  external_exports.strictObject({ contract: external_exports.literal("project-init"), version: external_exports.literal(5), ok: external_exports.literal(false), error: external_exports.strictObject({ code: external_exports.string(), message: external_exports.string() }) })
24632
24632
  ]);
24633
24633
 
24634
- // ../../packages/contracts/dist/versions/browser-specs-v2.js
24634
+ // ../../packages/contracts/dist/versions/browser-specs-v3.js
24635
24635
  var requirement = external_exports.strictObject({ id: external_exports.string(), title: external_exports.string(), body: external_exports.string() });
24636
24636
  var contributor = external_exports.strictObject({ email: external_exports.string(), name: external_exports.string(), commits: external_exports.number().int().nonnegative(), latest: external_exports.string() });
24637
24637
  var source = external_exports.strictObject({ title: external_exports.string(), path: external_exports.string().optional(), url: external_exports.string().optional(), note: external_exports.string().optional() });
@@ -24648,34 +24648,42 @@ var feature = external_exports.strictObject({
24648
24648
  });
24649
24649
  var snapshot = requirement.extend({ specId: external_exports.string(), path: external_exports.string(), sources: external_exports.array(source).optional() }).nullable();
24650
24650
  var document = external_exports.strictObject({ id: external_exports.string(), path: external_exports.string(), title: external_exports.string(), body: external_exports.string(), updatedAt: external_exports.string().nullable() });
24651
- var browserSpecsV2 = external_exports.strictObject({
24651
+ var event = external_exports.strictObject({
24652
+ key: external_exports.string(),
24653
+ commit: external_exports.string(),
24654
+ date: external_exports.string(),
24655
+ author: external_exports.string(),
24656
+ email: external_exports.string(),
24657
+ committer: external_exports.string(),
24658
+ message: external_exports.string(),
24659
+ id: external_exports.string(),
24660
+ kind: external_exports.enum(["requirement", "design", "wiki"]).optional(),
24661
+ types: external_exports.array(external_exports.enum(["created", "modified", "moved", "deleted"])),
24662
+ before: snapshot,
24663
+ after: snapshot,
24664
+ reasons: external_exports.array(external_exports.string())
24665
+ });
24666
+ var browserSpecsV3 = external_exports.strictObject({
24652
24667
  contract: external_exports.literal("browser-specs"),
24653
- version: external_exports.literal(2),
24668
+ version: external_exports.literal(3),
24654
24669
  sessionId: external_exports.string(),
24655
24670
  head: external_exports.string().nullable(),
24656
24671
  observedAt: external_exports.string(),
24657
- working: external_exports.boolean(),
24658
- features: external_exports.array(feature),
24659
- documents: external_exports.array(document).default([]),
24660
- events: external_exports.array(external_exports.strictObject({
24661
- key: external_exports.string(),
24662
- commit: external_exports.string(),
24663
- date: external_exports.string(),
24664
- author: external_exports.string(),
24665
- email: external_exports.string(),
24666
- committer: external_exports.string(),
24667
- message: external_exports.string(),
24668
- id: external_exports.string(),
24669
- kind: external_exports.enum(["requirement", "design", "wiki"]).optional(),
24670
- types: external_exports.array(external_exports.enum(["created", "modified", "moved", "deleted"])),
24671
- before: snapshot,
24672
- after: snapshot,
24673
- reasons: external_exports.array(external_exports.string())
24674
- })),
24675
- contributors: external_exports.array(contributor),
24676
- contributorsLimited: external_exports.boolean(),
24672
+ events: external_exports.array(event),
24677
24673
  nextCursor: external_exports.number().int().nonnegative().nullable(),
24678
- boundary: external_exports.boolean()
24674
+ boundary: external_exports.boolean(),
24675
+ working: external_exports.boolean().optional(),
24676
+ features: external_exports.array(feature).optional(),
24677
+ documents: external_exports.array(document).optional(),
24678
+ contributors: external_exports.array(contributor).optional(),
24679
+ contributorsLimited: external_exports.boolean().optional()
24680
+ });
24681
+ var browserSpecsFirstV3 = browserSpecsV3.required({
24682
+ working: true,
24683
+ features: true,
24684
+ documents: true,
24685
+ contributors: true,
24686
+ contributorsLimited: true
24679
24687
  });
24680
24688
 
24681
24689
  // ../../packages/contracts/dist/versions/changelog-v1.js
@@ -24750,14 +24758,9 @@ var messages_default2 = {
24750
24758
  "help.migrate": ".tryce \uC800\uC7A5\uC18C\uB97C .gitifact\uB85C \uC804\uD658 (\uACBD\uB85C\uC640 \uB9C8\uCEE4\uB9CC \uBC14\uAFB8\uACE0 ID\xB7\uC774\uC720\xB7\uC774\uB825\uC740 \uBCF4\uC874)",
24751
24759
  "help.migrateDryRun": "\uD30C\uC77C\uC744 \uBC14\uAFB8\uC9C0 \uC54A\uACE0 \uC804\uD658 \uACC4\uD68D \uD655\uC778",
24752
24760
  "help.spec": "Markdown \uBA85\uC138 \uC791\uC131\xB7\uC870\uD68C\xB7Git \uAE30\uB85D",
24753
- "help.deprecated": "Deprecated: 0.6.0\uC5D0\uC11C \uC81C\uAC70 \uC608\uC815. spec commit\uC744 \uC0AC\uC6A9\uD558\uC138\uC694.",
24754
24761
  "help.specCommit": "\uBCC0\uACBD \uC774\uC720 \uAE30\uB85D\uACFC \uAD00\uB828 \uD30C\uC77C \uCEE4\uBC0B\uC744 \uD55C \uBC88\uC5D0 \uC2E4\uD589",
24755
24762
  "help.specCommitFile": "reasons\xB7paths\xB7message\xB7authorization\uC744 \uB2F4\uC740 JSON \uD30C\uC77C (-\uB294 \uD45C\uC900 \uC785\uB825)",
24756
24763
  "help.specCommitDryRun": "\uD30C\uC77C\uC744 \uC4F0\uAC70\uB098 \uCEE4\uBC0B\uD558\uC9C0 \uC54A\uACE0 \uACB0\uACFC\uB9CC \uD655\uC778",
24757
- "help.specCommitPlanFile": "\uCEE4\uBC0B \uC785\uB825 \uB610\uB294 \uACC4\uD68D JSON \uD30C\uC77C",
24758
- "help.specPrepareFile": "expected\uC640 \uCD5C\uC885 reasons\uB97C \uB2F4\uC740 JSON \uD30C\uC77C",
24759
- "help.specVerifyFile": "prepare\uC758 verification \uAC1D\uCCB4\uB97C \uB2F4\uC740 JSON \uD30C\uC77C",
24760
- "help.specVerifyStaged": "index \uC6D0\uBB38\uB3C4 \uBE44\uAD50",
24761
24764
  "help.specSaveFile": "expected\uC640 operations\uB97C \uB2F4\uC740 UTF-8 JSON \uD30C\uC77C (-\uB294 \uD45C\uC900 \uC785\uB825)",
24762
24765
  "help.specReadRef": "\uC77D\uC744 \uCEE4\uBC0B",
24763
24766
  "help.specDiffFrom": "\uC774\uC804 \uCEE4\uBC0B",
@@ -24823,13 +24826,6 @@ var messages_default2 = {
24823
24826
  "commit.fileChangedPreparing": "\uCEE4\uBC0B \uC900\uBE44 \uC911 \uD30C\uC77C\xB7\uC815\uCC45\uC774 \uBCC0\uACBD\uB410\uC2B5\uB2C8\uB2E4: {path}",
24824
24827
  "commit.resultUnknown": "\uCEE4\uBC0B \uACB0\uACFC\uB97C \uD655\uC778\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.",
24825
24828
  "commit.uncertain": "Git \uC2E4\uD589 \uACB0\uACFC\uB97C \uD655\uC778\uD574\uC57C \uD569\uB2C8\uB2E4. \uC7AC\uC2DC\uB3C4\uD558\uC9C0 \uB9D0\uACE0 HEAD\uC640 \uBCF5\uAD6C \uC790\uB8CC\uB97C \uD655\uC778\uD558\uC138\uC694: {path}",
24826
- "commit.existingStagingPlan": "\uAE30\uC874 staging\uC744 \uBCF4\uC874\uD569\uB2C8\uB2E4. \uC120\uD0DD \uBC94\uC704\uB97C \uC815\uB9AC\uD55C \uD6C4 \uB2E4\uC2DC \uACC4\uD68D\uD558\uC138\uC694.",
24827
- "commit.designUseSpecCommit": "\uC124\uACC4 \uBCC0\uACBD\uC740 spec commit\uC744 \uC0AC\uC6A9\uD558\uC138\uC694.",
24828
- "commit.indexChangedPlanning": "\uACC4\uD68D \uC911 index\uAC00 \uBCC0\uACBD\uB410\uC2B5\uB2C8\uB2E4.",
24829
- "commit.planCorrupted": "\uCEE4\uBC0B \uACC4\uD68D\uC774 \uC190\uC0C1\uB410\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uACC4\uD68D\uD558\uC138\uC694.",
24830
- "commit.planScope": "\uACC4\uD68D\uC758 \uC800\uC7A5\uC18C \uB610\uB294 \uD30C\uC77C \uBC94\uC704\uAC00 \uB2E4\uB985\uB2C8\uB2E4.",
24831
- "commit.planStale": "\uACC4\uD68D \uC774\uD6C4 \uD30C\uC77C\xB7\uC815\uCC45\xB7index\uAC00 \uBCC0\uACBD\uB410\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uACC4\uD68D\uD558\uC138\uC694.",
24832
- "commit.indexChangedLocked": "\uC7A0\uAE08 \uC911 index\uAC00 \uBCC0\uACBD\uB410\uC2B5\uB2C8\uB2E4.",
24833
24829
  "store.legacyLock": "\uC774\uC804 Tryce \uC2E4\uD589\uC758 \uC7A0\uAE08 \uB610\uB294 \uBCF5\uAD6C \uC790\uB8CC\uAC00 \uC788\uC2B5\uB2C8\uB2E4: {path}",
24834
24830
  "store.storeNotDirectory": ".gitifact\uB294 \uC77C\uBC18 \uB514\uB809\uD130\uB9AC\uC5EC\uC57C \uD569\uB2C8\uB2E4.",
24835
24831
  "store.migrateFirst": ".tryce \uC800\uC7A5\uC18C\uC785\uB2C8\uB2E4. gitifact migrate\uB85C .gitifact\uC5D0 \uC804\uD658\uD55C \uB4A4 \uC0AC\uC6A9\uD558\uC138\uC694.",
@@ -24891,18 +24887,8 @@ var messages_default2 = {
24891
24887
  "reader.blobShape": "\uAC80\uD1A0 \uC870\uD68C blob \uD615\uC2DD \uB610\uB294 1 MiB \uD55C\uB3C4\uB97C \uD655\uC778\uD558\uC138\uC694.",
24892
24888
  "reader.totalLimit": "\uBA85\uC138 \uC804\uCCB4 \uC870\uD68C 16 MiB \uD55C\uB3C4\uB97C \uCD08\uACFC\uD588\uC2B5\uB2C8\uB2E4.",
24893
24889
  "reader.blobBoundary": "Git blob \uC751\uB2F5 \uACBD\uACC4\uAC00 \uB2E4\uB985\uB2C8\uB2E4.",
24894
- "prepare.integrationInProgress": "Git \uD1B5\uD569 \uC791\uC5C5 \uC911\uC5D0\uB294 \uC2E4\uD5D8\uC6A9 \uCEE4\uBC0B \uC900\uBE44\uB97C \uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.",
24890
+ "prepare.integrationInProgress": "Git \uD1B5\uD569 \uC791\uC5C5 \uC911\uC5D0\uB294 \uBA85\uC138\uB97C \uC77D\uC5B4 \uCEE4\uBC0B\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.",
24895
24891
  "prepare.headChanged": "HEAD \uB610\uB294 \uBE0C\uB79C\uCE58\uAC00 \uBCC0\uACBD\uB410\uC2B5\uB2C8\uB2E4. changes\uBD80\uD130 \uB2E4\uC2DC \uD655\uC778\uD558\uC138\uC694.",
24896
- "prepare.invalidInput": "\uC798\uBABB\uB41C \uC900\uBE44 \uC785\uB825\uC785\uB2C8\uB2E4.",
24897
- "prepare.expectedReasons": "expected\uC640 reasons\uAC00 \uD544\uC694\uD569\uB2C8\uB2E4.",
24898
- "prepare.staleInput": "\uC900\uBE44 \uC785\uB825\uC774 \uC624\uB798\uB410\uC2B5\uB2C8\uB2E4. changes\uBD80\uD130 \uB2E4\uC2DC \uD655\uC778\uD558\uC138\uC694.",
24899
- "prepare.invalidVerifyInput": "\uC798\uBABB\uB41C \uD655\uC778 \uC785\uB825\uC785\uB2C8\uB2E4.",
24900
- "prepare.verificationRequired": "prepare\uAC00 \uBC18\uD658\uD55C verification \uAC1D\uCCB4\uAC00 \uD544\uC694\uD569\uB2C8\uB2E4.",
24901
- "prepare.changedAfterPrepare": "\uC900\uBE44 \uB4A4 HEAD \uB610\uB294 \uBA85\uC138\uAC00 \uBCC0\uACBD\uB410\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC900\uBE44\uD558\uC138\uC694.",
24902
- "prepare.stagingScope": "staging\uC758 \uBA85\uC138 \uBC94\uC704\uAC00 \uC900\uBE44\uD55C \uC6D0\uBB38\uACFC \uB2E4\uB985\uB2C8\uB2E4.",
24903
- "prepare.stagingContent": "staging \uC6D0\uBB38\uC774 \uC900\uBE44\uD55C \uD30C\uC77C\uACFC \uB2E4\uB985\uB2C8\uB2E4: {path}",
24904
- "prepare.stagingChanged": "\uD655\uC778 \uC911 staging\uC774 \uBCC0\uACBD\uB410\uC2B5\uB2C8\uB2E4.",
24905
- "prepare.specsChanged": "\uD655\uC778 \uC911 \uBA85\uC138\uAC00 \uBCC0\uACBD\uB410\uC2B5\uB2C8\uB2E4.",
24906
24892
  "commitFiles.relativePath": "\uC800\uC7A5\uC18C \uC0C1\uB300 \uACBD\uB85C\uC758 \uBA85\uC138 \uB610\uB294 \uC77C\uBC18 \uD30C\uC77C\uB9CC \uC120\uD0DD\uD558\uC138\uC694.",
24907
24893
  "commitFiles.linkOrDirectory": "\uB9C1\uD06C\xB7\uB514\uB809\uD130\uB9AC\xB7\uD2B9\uC218 \uD30C\uC77C\uC740 \uC120\uD0DD\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.",
24908
24894
  "commitFiles.nestedRepository": "\uC911\uCCA9 \uC800\uC7A5\uC18C\uB294 \uC120\uD0DD\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.",
@@ -24963,6 +24949,7 @@ var messages_default2 = {
24963
24949
  "docs.summary.workflow": "\uC2DC\uC791 \uC2DC \uD655\uC778\uD560 \uAC83, \uC694\uAD6C\uC0AC\uD56D\uC73C\uB85C \uB0A8\uAE38 \uC694\uCCAD\uC758 \uAD6C\uBD84, \uB9C8\uBB34\uB9AC \uBCF4\uACE0",
24964
24950
  "docs.summary.spec": "\uC0AC\uC6A9\uC790 \uC2A4\uD1A0\uB9AC\xB7\uC218\uC6A9 \uC870\uAC74 \uD615\uC2DD, ID \uADDC\uCE59, spec save \uC785\uB825",
24965
24951
  "docs.summary.design": "design.md \uBAA9\uCC28, \uCC38\uC870 \uC8FC\uC11D\uACFC \uCC38\uACE0 \uBB38\uC11C, \uAC1C\uC815 \uBC29\uC2DD",
24952
+ "docs.summary.writing": "\uC704\uD0A4\xB7\uC694\uAD6C\uC0AC\uD56D\xB7\uC124\uACC4\uC5D0 \uACF5\uD1B5\uC73C\uB85C \uC801\uC6A9\uD558\uB294 \uBB38\uCCB4, \uC778\uC6A9\uACFC Alert, AI \uC2AC\uB86D \uC81C\uAC70",
24966
24953
  "docs.summary.commit": "spec commit \uC785\uB825, \uC774\uC720 \uAE30\uB85D, \uC2E4\uD328 \uD6C4 \uBCF5\uAD6C",
24967
24954
  "help.browserNoUpdateCheck": "\uC0C8 \uBC84\uC804 \uD655\uC778\uC744 \uC704\uD55C npm \uB808\uC9C0\uC2A4\uD2B8\uB9AC \uC870\uD68C\uB97C \uB054 (GITIFACT_NO_UPDATE_CHECK\uC640 \uAC19\uC74C)",
24968
24955
  "help.updateCommit": "\uAC31\uC2E0\uD55C GITIFACT \uBE14\uB85D\uC774 HEAD\uC640 \uBE14\uB85D \uC548\uC5D0\uC11C\uB9CC \uB2E4\uB974\uBA74 \uADF8 \uD30C\uC77C\uB9CC \uACE0\uC815 \uBA54\uC2DC\uC9C0\uB85C \uCEE4\uBC0B",
@@ -25698,9 +25685,10 @@ function createSpecBrowserReader(root, sessionId, inherited = process.env) {
25698
25685
  const current = await readWorkingPreviewState(root);
25699
25686
  const bare = current.specs.map(({ history: _history, ...s }) => ({ ...s, contributors: [], updatedAt: null }));
25700
25687
  const bareDocuments = current.wiki.documents.map((d) => ({ ...d, updatedAt: null }));
25701
- if (!base.head) return browserSpecsV2.parse({ contract: "browser-specs", version: 2, sessionId, head: null, observedAt: (/* @__PURE__ */ new Date()).toISOString(), working: bare.length > 0 || bareDocuments.length > 0, features: bare, documents: bareDocuments, events: [], contributors: [], contributorsLimited: false, nextCursor: null, boundary: false });
25688
+ if (!base.head) return browserSpecsV3.parse({ contract: "browser-specs", version: 3, sessionId, head: null, observedAt: (/* @__PURE__ */ new Date()).toISOString(), working: bare.length > 0 || bareDocuments.length > 0, features: bare, documents: bareDocuments, events: [], contributors: [], contributorsLimited: false, nextCursor: null, boundary: false });
25702
25689
  const head = base.head;
25703
- const features = await Promise.all(bare.map(async (feature2) => {
25690
+ const first = cursor === 0;
25691
+ const features = !first ? void 0 : await Promise.all(bare.map(async (feature2) => {
25704
25692
  const folder = feature2.path.replace(/^\.(?:gitifact|tryce)\/(spec\/[^/]+)\/requirements\.md$/, "$1");
25705
25693
  const lines = (await git(["log", "--format=%aN%x00%aE%x00%aI", "--max-count=2000", head, "--", `.gitifact/${folder}`, `.tryce/${folder}`])).trim().split("\n").filter(Boolean);
25706
25694
  const people = /* @__PURE__ */ new Map();
@@ -25713,7 +25701,7 @@ function createSpecBrowserReader(root, sessionId, inherited = process.env) {
25713
25701
  }
25714
25702
  return { ...feature2, contributors: [...people.values()].sort((a, b) => b.commits - a.commits), updatedAt: lines[0]?.split("\0")[2] ?? null };
25715
25703
  }));
25716
- const documents = await Promise.all(bareDocuments.map(async (doc) => ({ ...doc, updatedAt: (await git(["log", "--format=%aI", "--max-count=1", head, "--", doc.path])).trim() || null })));
25704
+ const documents = !first ? void 0 : await Promise.all(bareDocuments.map(async (doc) => ({ ...doc, updatedAt: (await git(["log", "--format=%aI", "--max-count=1", head, "--", doc.path])).trim() || null })));
25717
25705
  const documentDirs = [WIKI_DIR];
25718
25706
  const [rows, dirty] = await Promise.all([
25719
25707
  git([
@@ -25728,9 +25716,9 @@ function createSpecBrowserReader(root, sessionId, inherited = process.env) {
25728
25716
  ...[".gitifact", ".tryce"].flatMap((d) => [`:(glob)${d}/spec/*/requirements.md`, `:(glob)${d}/spec/*/design.md`, `:(glob)${d}/spec/*/history.jsonl`]),
25729
25717
  ...documentDirs.flatMap((d) => [`:(glob)${d}/**/*.md`, `:(glob)${d}/history.jsonl`])
25730
25718
  ]),
25731
- git(["status", "--porcelain=v1", "--", ".gitifact/spec", ...documentDirs])
25719
+ first ? git(["status", "--porcelain=v1", "--", ".gitifact/spec", ...documentDirs]) : Promise.resolve("")
25732
25720
  ]);
25733
- {
25721
+ if (first) {
25734
25722
  const people = /* @__PURE__ */ new Map();
25735
25723
  const lines = (await git(["log", "--format=%aN%x00%aE%x00%aI", "--max-count=10001", head])).trim().split("\n").filter(Boolean);
25736
25724
  for (const line of lines.slice(0, 1e4)) {
@@ -25775,20 +25763,16 @@ function createSpecBrowserReader(root, sessionId, inherited = process.env) {
25775
25763
  }));
25776
25764
  }));
25777
25765
  if (await readHead() !== head || (await readWorkingPreviewState(root)).stamp !== current.stamp) throw new SpecPreviewError(t2("specReader.projectChanged"));
25778
- return browserSpecsV2.parse({
25766
+ return browserSpecsV3.parse({
25779
25767
  contract: "browser-specs",
25780
- version: 2,
25768
+ version: 3,
25781
25769
  sessionId,
25782
25770
  head,
25783
25771
  observedAt: (/* @__PURE__ */ new Date()).toISOString(),
25784
- working: !!dirty.trim(),
25785
- features,
25786
- documents,
25787
25772
  events: groups.flat(),
25788
- contributors: peopleCache.data,
25789
- contributorsLimited: peopleCache.limited,
25790
25773
  nextCursor: commits.length > 10 ? cursor + 10 : null,
25791
- boundary
25774
+ boundary,
25775
+ ...first ? { working: !!dirty.trim(), features, documents, contributors: peopleCache?.data ?? [], contributorsLimited: peopleCache?.limited ?? false } : {}
25792
25776
  });
25793
25777
  }
25794
25778
  return (cursor = 0, head) => {
@@ -26202,7 +26186,7 @@ import { readFile as readFile8 } from "node:fs/promises";
26202
26186
  // src/commands/docs.ts
26203
26187
  import { lstat as lstat5, readFile as readFile7 } from "node:fs/promises";
26204
26188
  import { dirname as dirname3, join as join8 } from "node:path";
26205
- var docTopics = ["workflow", "spec", "design", "wiki", "commit"];
26189
+ var docTopics = ["workflow", "spec", "design", "wiki", "writing", "commit"];
26206
26190
  var isDocTopic = (value) => docTopics.includes(value);
26207
26191
  var readBundledDoc = (name, lang) => readFile7(new URL("./i18n/" + lang + "/docs/" + name + ".md", import.meta.url), "utf8");
26208
26192
  var info3 = (path3) => lstat5(path3).catch((e) => {
@@ -26690,10 +26674,10 @@ async function runUpdate(options, version2) {
26690
26674
  }
26691
26675
 
26692
26676
  // src/commands/spec-preview.ts
26693
- import { join as join15 } from "node:path";
26694
- import { readFile as readFile12, stat as stat2 } from "node:fs/promises";
26677
+ import { join as join14 } from "node:path";
26678
+ import { readFile as readFile11, stat as stat2 } from "node:fs/promises";
26695
26679
 
26696
- // src/adapters/filesystem/spec-preview-prepare.ts
26680
+ // src/adapters/filesystem/spec-preview-context.ts
26697
26681
  import { lstat as lstat6 } from "node:fs/promises";
26698
26682
  import { join as join10 } from "node:path";
26699
26683
  import { createHash as createHash4 } from "node:crypto";
@@ -26736,44 +26720,6 @@ async function readFinalPreviewChanges(cwd) {
26736
26720
  const pendingReasons = pendingPreviewReasons(c.bundle, current.bundle);
26737
26721
  return { base: c.base, expected: expected(c.base, current.stamp), stamp: current.stamp, pendingReasons, ...delta };
26738
26722
  }
26739
- async function prepareWorkingPreview(cwd, input2, publish) {
26740
- if (!input2 || typeof input2 !== "object" || Array.isArray(input2)) fail5(t2("prepare.invalidInput"));
26741
- const request = input2;
26742
- if (Object.keys(request).sort().join(",") !== "expected,reasons" || typeof request.expected !== "string") fail5(t2("prepare.expectedReasons"));
26743
- const c = await context(cwd);
26744
- const current = await readWorkingPreviewState(cwd);
26745
- if (request.expected !== expected(c.base, current.stamp)) fail5(t2("prepare.staleInput"));
26746
- const result = await previewTransaction(cwd, current.stamp, async (before) => {
26747
- await c.recheck();
26748
- const prepared = prepareSpecPreview(c.bundle, before.bundle, c.files, before.files, request.reasons, () => generatePreviewId("H"));
26749
- return { writes: prepared.writes, data: { changes: prepared.changes, specChanges: prepared.specChanges, reasons: prepared.reasons, withoutReason: prepared.withoutReason }, recheck: c.recheck };
26750
- }, publish);
26751
- return { ...result, base: c.base, expected: expected(c.base, result.stamp), verification: { base: c.base, stamp: result.stamp } };
26752
- }
26753
- async function verifyPreparedPreview(cwd, input2, staged) {
26754
- if (!input2 || typeof input2 !== "object" || Array.isArray(input2)) fail5(t2("prepare.invalidVerifyInput"));
26755
- const request = input2;
26756
- if (Object.keys(request).sort().join(",") !== "base,stamp" || typeof request.stamp !== "string") fail5(t2("prepare.verificationRequired"));
26757
- const c = await context(cwd);
26758
- const current = await readWorkingPreviewState(cwd);
26759
- if (!same(request.base, c.base) || request.stamp !== current.stamp) fail5(t2("prepare.changedAfterPrepare"));
26760
- finalSpecPreviewChanges(c.bundle, current.bundle);
26761
- comparePreviewBundles(c.bundle, current.bundle);
26762
- if (staged) {
26763
- const index = await c.reader.index();
26764
- if (index.size !== current.files.size) fail5(t2("prepare.stagingScope"));
26765
- for (const [path3, source2] of current.files) {
26766
- const oid2 = index.get(path3);
26767
- const bytes = Buffer.from(source2);
26768
- const hash3 = createHash4(oid2?.length === 64 ? "sha256" : "sha1").update(`blob ${bytes.length}\0`).update(bytes).digest("hex");
26769
- if (oid2 !== hash3) fail5(t2("prepare.stagingContent", { path: path3 }));
26770
- }
26771
- if (!same([...index], [...await c.reader.index()])) fail5(t2("prepare.stagingChanged"));
26772
- }
26773
- if ((await readWorkingPreviewState(cwd)).stamp !== current.stamp) fail5(t2("prepare.specsChanged"));
26774
- await c.recheck();
26775
- return { verified: true, scope: staged ? "staged" : "working", base: c.base, stamp: current.stamp };
26776
- }
26777
26723
 
26778
26724
  // src/adapters/filesystem/agent-inputs.ts
26779
26725
  import { createHash as createHash5, randomBytes as randomBytes2 } from "node:crypto";
@@ -26840,9 +26786,9 @@ async function discardAgentInput(root, file2, controls = {}) {
26840
26786
  }
26841
26787
  }
26842
26788
 
26843
- // src/commands/spec-preview-commit.ts
26844
- import { randomUUID as randomUUID6 } from "node:crypto";
26845
- import { readFile as readFile10, mkdir as mkdir6, open as open4, rename as rename4, unlink as unlink5, rmdir as rmdir2, writeFile as writeFile4 } from "node:fs/promises";
26789
+ // src/commands/spec-commit.ts
26790
+ import { createHash as createHash7, randomUUID as randomUUID6 } from "node:crypto";
26791
+ import { mkdir as mkdir6, open as open4, readFile as readFile10, rename as rename4, rmdir as rmdir2, unlink as unlink5, writeFile as writeFile4 } from "node:fs/promises";
26846
26792
  import { join as join13 } from "node:path";
26847
26793
 
26848
26794
  // src/commands/spec-commit-files.ts
@@ -26914,166 +26860,7 @@ async function checkLegacySelection(root, selected) {
26914
26860
  }
26915
26861
  }
26916
26862
 
26917
- // src/commands/spec-preview-commit.ts
26918
- var seal = (p) => hash2(JSON.stringify(p));
26919
- async function previewCommit(cwd, action, input2) {
26920
- const reader = specPreviewReader(cwd);
26921
- const { root, gitDir } = await reader.location();
26922
- const runner = createGitRunner();
26923
- const git = (args, index) => runner(["-c", "core.fsmonitor=false", ...args], {
26924
- cwd: root,
26925
- env: {
26926
- ...process.env,
26927
- GIT_LITERAL_PATHSPECS: "1",
26928
- GIT_GLOB_PATHSPECS: "0",
26929
- GIT_NOGLOB_PATHSPECS: "0",
26930
- GIT_ICASE_PATHSPECS: "0",
26931
- GIT_OPTIONAL_LOCKS: "0",
26932
- GIT_NO_LAZY_FETCH: "1",
26933
- GIT_NO_REPLACE_OBJECTS: "1",
26934
- GIT_TERMINAL_PROMPT: "0",
26935
- ...index ? { GIT_INDEX_FILE: index } : {}
26936
- },
26937
- timeoutMs: 12e4,
26938
- maxBytes: 32 * 1024 * 1024
26939
- });
26940
- const indexPath = (await git(["rev-parse", "--path-format=absolute", "--git-path", "index"])).toString("utf8").trim();
26941
- const staged = async (index) => (await git(["diff", "--cached", "--ita-visible-in-index", "--name-only", "--no-renames", "-z"], index)).toString("utf8").split("\0").filter(Boolean).sort();
26942
- const busy = join13(gitDir, "gitifact-spec-commit.lock");
26943
- if (await info5(busy)) fail6(t2("commit.busy", { path: busy }));
26944
- if ((await staged()).length) fail6(t2("commit.existingStagingPlan"));
26945
- const request = object3(input2);
26946
- let plan;
26947
- if (action === "plan") {
26948
- if (Object.keys(request).some((k) => !["verification", "paths", "message", "requirements", "authorization", "policyFiles"].includes(k))) fail6(t2("commit.unknownField"));
26949
- await verifyPreparedPreview(cwd, request.verification, false);
26950
- const selected2 = paths(request.paths);
26951
- const authorization = object3(request.authorization);
26952
- await checkLegacySelection(root, selected2);
26953
- if (Object.keys(authorization).sort().join(",") !== "basis,evidence" || !["user-request", "project-policy"].includes(String(authorization.basis))) fail6(t2("commit.authorizationRequired"));
26954
- const message = text(request.message, 4e3);
26955
- if (/^\s*Gitifact-/im.test(message)) fail6(t2("commit.trailerInMessage"));
26956
- const state = await readWorkingPreviewState(cwd);
26957
- const base = await reader.baseline();
26958
- const previous = base.head ? await reader.files(base.head, state.config !== void 0) : /* @__PURE__ */ new Map();
26959
- const pending = [.../* @__PURE__ */ new Set([...previous.keys(), ...state.files.keys()])].filter((p) => previous.get(p) !== state.files.get(p));
26960
- if (pending.some((p) => !selected2.includes(p))) fail6(t2("commit.selectPending"));
26961
- const delta = await readFinalPreviewChanges(cwd);
26962
- const references = request.requirements ?? [];
26963
- if (!Array.isArray(references) || references.length > 1e3 || references.some((r) => typeof r !== "string")) fail6(t2("commit.invalidReferences"));
26964
- if (delta.changes.some((c) => c.kind === "design")) fail6(t2("commit.designUseSpecCommit"));
26965
- const known = /* @__PURE__ */ new Set([...state.specs.flatMap((s) => s.requirements.map((r) => r.id)), ...delta.changes.map((c) => c.id)]);
26966
- if (references.some((r) => !known.has(r))) fail6(t2("commit.unknownRequirement"));
26967
- const extra = request.policyFiles === void 0 ? [] : paths(request.policyFiles, 1024);
26968
- const contents = async (list) => Promise.all(list.map(async (path3) => ({ path: path3, hash: await fingerprint(root, path3) })));
26969
- const data2 = {
26970
- kind: "spec-preview-commit",
26971
- root,
26972
- verification: request.verification,
26973
- index: hash2(await optional2(indexPath) ?? Buffer.alloc(0)),
26974
- files: await contents(selected2),
26975
- context: await contents([.../* @__PURE__ */ new Set([...policyPaths(selected2), ...extra])].sort()),
26976
- message,
26977
- requirements: [.../* @__PURE__ */ new Set([...references, ...delta.changes.map((c) => c.id)])].sort(),
26978
- authorization: { basis: String(authorization.basis), evidence: text(authorization.evidence, 2e3) }
26979
- };
26980
- await verifyPreparedPreview(cwd, request.verification, false);
26981
- if (data2.index !== hash2(await optional2(indexPath) ?? Buffer.alloc(0)) || (await staged()).length) fail6(t2("commit.indexChangedPlanning"));
26982
- return { outcome: "planned", plan: { ...data2, digest: seal(data2) }, committed: false };
26983
- }
26984
- const { digest: digest2, ...data } = request;
26985
- if (request.kind !== "spec-preview-commit" || typeof digest2 !== "string" || digest2 !== seal(data)) fail6(t2("commit.planCorrupted"));
26986
- plan = request;
26987
- if (plan.root !== root || !Array.isArray(plan.files) || !Array.isArray(plan.context)) fail6(t2("commit.planScope"));
26988
- const selected = paths(plan.files.map((f) => f.path));
26989
- const refreshed = await previewCommit(cwd, "plan", {
26990
- verification: plan.verification,
26991
- paths: selected,
26992
- message: plan.message,
26993
- requirements: plan.requirements,
26994
- authorization: plan.authorization,
26995
- policyFiles: plan.context.map((f) => f.path)
26996
- });
26997
- if (!("plan" in refreshed) || refreshed.plan.digest !== plan.digest) fail6(t2("commit.planStale"));
26998
- const before = await reader.baseline();
26999
- const original = await optional2(indexPath);
27000
- await mkdir6(busy);
27001
- const draftLock = join13(gitDir, "gitifact-spec-preview.lock");
27002
- let draftOwned = false;
27003
- let indexLock;
27004
- let uncertain = false;
27005
- let commitStarted = false;
27006
- const temporary = join13(gitDir, "gitifact-commit-index-" + randomUUID6());
27007
- const checkFiles = async () => {
27008
- for (const f of [...plan.files, ...plan.context]) if (f.hash !== await fingerprint(root, f.path)) fail6(t2("commit.fileChangedPreparing", { path: f.path }));
27009
- if ((await readLockedPreviewState(root)).stamp !== object3(plan.verification).stamp) fail6(t2("commit.specsChangedPreparing"));
27010
- for (const name of ["MERGE_HEAD", "CHERRY_PICK_HEAD", "REVERT_HEAD", "rebase-merge", "rebase-apply"]) if (await info5(join13(gitDir, name))) fail6(t2("commit.integrationStarted"));
27011
- };
27012
- try {
27013
- await verifyPreparedPreview(cwd, plan.verification, false);
27014
- await mkdir6(draftLock);
27015
- draftOwned = true;
27016
- indexLock = await open4(indexPath + ".lock", "wx", 384);
27017
- if (plan.index !== hash2(await optional2(indexPath) ?? Buffer.alloc(0)) || (await staged()).length) fail6(t2("commit.indexChangedLocked"));
27018
- await writeFile4(join13(busy, "recovery.json"), JSON.stringify({ before, originalIndex: original?.toString("base64") ?? null, temporary, plan }));
27019
- if (original) await writeFile4(temporary, original, { flag: "wx" });
27020
- else await git(["read-tree", "--empty"], temporary);
27021
- await git(["add", "--", ...selected], temporary);
27022
- const actual = await staged(temporary);
27023
- if (!actual.length || actual.some((p) => !selected.includes(p))) fail6(t2("commit.unexpectedFiles"));
27024
- for (const file2 of plan.files.filter((f) => record2(f.path) && f.hash !== null)) {
27025
- const stagedBytes = await git(["show", ":" + file2.path], temporary);
27026
- if (!stagedBytes.equals(await readFile10(join13(root, file2.path)))) fail6(t2("commit.filterChanged"));
27027
- }
27028
- await checkFiles();
27029
- if (JSON.stringify(before) !== JSON.stringify(await reader.baseline())) fail6(t2("commit.headChanged"));
27030
- const tree = (await git(["write-tree"], temporary)).toString("utf8").trim();
27031
- const trailers = plan.requirements.map((id) => "Gitifact-Req: " + id);
27032
- commitStarted = true;
27033
- await git(["commit", "-m", plan.message.trim() + (trailers.length ? "\n\n" + trailers.join("\n") : "")], temporary);
27034
- const after = await reader.baseline();
27035
- const actualTree = (await git(["rev-parse", "HEAD^{tree}"])).toString("utf8").trim();
27036
- const parents = (await git(["rev-list", "--parents", "-n", "1", "HEAD"])).toString("utf8").trim().split(" ").slice(1);
27037
- const message = (await git(["log", "-1", "--format=%B"])).toString("utf8");
27038
- if (actualTree !== tree || after.branch !== before.branch || JSON.stringify(parents) !== JSON.stringify(before.head ? [before.head] : []) || trailers.some((t3) => !message.split(/\r?\n/).includes(t3))) fail6(t2("commit.resultAltered"));
27039
- if (hash2(await optional2(indexPath) ?? Buffer.alloc(0)) !== plan.index) fail6(t2("commit.indexChangedAfter"));
27040
- if ((await git(["write-tree"], temporary)).toString("utf8").trim() !== tree) fail6(t2("commit.hookChangedStaging"));
27041
- await indexLock.writeFile(await readFile10(temporary));
27042
- await indexLock.sync();
27043
- await indexLock.close();
27044
- await rename4(indexPath + ".lock", indexPath);
27045
- indexLock = void 0;
27046
- return { outcome: "committed", commit: after.head, paths: actual, requirements: plan.requirements, pushed: false };
27047
- } catch (error62) {
27048
- if (commitStarted) {
27049
- try {
27050
- uncertain = JSON.stringify(before) !== JSON.stringify(await reader.baseline());
27051
- } catch {
27052
- uncertain = true;
27053
- }
27054
- }
27055
- if (uncertain) fail6(t2("commit.uncertain", { path: busy }));
27056
- throw error62;
27057
- } finally {
27058
- await indexLock?.close().catch(() => {
27059
- });
27060
- if (!uncertain) {
27061
- if (indexLock) await unlink5(indexPath + ".lock").catch(() => {
27062
- });
27063
- await unlink5(temporary).catch(() => {
27064
- });
27065
- await unlink5(join13(busy, "recovery.json")).catch(() => {
27066
- });
27067
- await rmdir2(busy);
27068
- if (draftOwned) await rmdir2(draftLock);
27069
- }
27070
- }
27071
- }
27072
-
27073
26863
  // src/commands/spec-commit.ts
27074
- import { createHash as createHash8, randomUUID as randomUUID7 } from "node:crypto";
27075
- import { mkdir as mkdir7, open as open5, readFile as readFile11, rename as rename5, rmdir as rmdir3, unlink as unlink6, writeFile as writeFile5 } from "node:fs/promises";
27076
- import { join as join14 } from "node:path";
27077
26864
  var fields = ["reasons", "paths", "message", "authorization", "requirements", "policyFiles", "expected"];
27078
26865
  var integration = ["MERGE_HEAD", "CHERRY_PICK_HEAD", "REVERT_HEAD", "rebase-merge", "rebase-apply"];
27079
26866
  var same2 = (a, b) => JSON.stringify(a) === JSON.stringify(b);
@@ -27112,7 +26899,7 @@ async function specCommit(cwd, input2, dryRun) {
27112
26899
  ...stdin ? { input: stdin } : {}
27113
26900
  });
27114
26901
  const staged = async (index) => (await git(["diff", "--cached", "--ita-visible-in-index", "--name-only", "--no-renames", "-z"], index)).toString("utf8").split("\0").filter(Boolean).sort();
27115
- const busy = join14(gitDir, "gitifact-spec-commit.lock");
26902
+ const busy = join13(gitDir, "gitifact-spec-commit.lock");
27116
26903
  await failOnLegacyLock(gitDir);
27117
26904
  if (await info5(busy)) fail6(t2("commit.busy", { path: busy }));
27118
26905
  if ((await staged()).length) fail6(t2("commit.existingStaging"));
@@ -27123,7 +26910,7 @@ async function specCommit(cwd, input2, dryRun) {
27123
26910
  const prepared = prepareSpecPreview(c.bundle, current.bundle, c.files, current.files, reasons, () => generatePreviewId("H"));
27124
26911
  const blobId = (text2) => {
27125
26912
  const bytes = Buffer.from(text2);
27126
- return createHash8(objectFormat).update(`blob ${bytes.length}\0`).update(bytes).digest("hex");
26913
+ return createHash7(objectFormat).update(`blob ${bytes.length}\0`).update(bytes).digest("hex");
27127
26914
  };
27128
26915
  const present = [...current.files.keys()];
27129
26916
  if (present.some((p) => p.includes("\n"))) fail6(t2("commit.newlinePath"));
@@ -27166,29 +26953,29 @@ async function specCommit(cwd, input2, dryRun) {
27166
26953
  ...prepared.changes.filter((c2) => c2.kind === "design").map((c2) => "Gitifact-Design: " + c2.id),
27167
26954
  ...prepared.changes.filter((c2) => c2.kind === "wiki").map((c2) => "Gitifact-Doc: " + c2.id)
27168
26955
  ];
27169
- const temporary = join14(gitDir, "gitifact-commit-index-" + randomUUID7());
26956
+ const temporary = join13(gitDir, "gitifact-commit-index-" + randomUUID6());
27170
26957
  let owned = false;
27171
26958
  let uncertain = false;
27172
26959
  let indexLock;
27173
26960
  let committed;
27174
26961
  try {
27175
26962
  try {
27176
- await mkdir7(busy);
26963
+ await mkdir6(busy);
27177
26964
  owned = true;
27178
26965
  } catch (e) {
27179
26966
  if (e.code === "EEXIST") fail6(t2("commit.busy", { path: busy }));
27180
26967
  throw e;
27181
26968
  }
27182
- await previewTransaction(cwd, current.stamp, async () => ({ writes, data: {}, recheck: c.recheck }), rename5, async (published) => {
26969
+ await previewTransaction(cwd, current.stamp, async () => ({ writes, data: {}, recheck: c.recheck }), rename4, async (published) => {
27183
26970
  let commitStarted = false;
27184
26971
  try {
27185
- const lock = indexLock = await open5(indexPath + ".lock", "wx", 384);
26972
+ const lock = indexLock = await open4(indexPath + ".lock", "wx", 384);
27186
26973
  const original = await optional2(indexPath);
27187
26974
  if (hash2(original ?? Buffer.alloc(0)) !== indexHash || (await staged()).length) fail6(t2("commit.indexChanged"));
27188
26975
  const locked = await hashes([.../* @__PURE__ */ new Set([...selected, ...contextPaths])]);
27189
26976
  for (const [path3, value] of started) if (locked.get(path3) !== value) fail6(t2("commit.fileChangedRunning", { path: path3 }));
27190
- await writeFile5(join14(busy, "recovery.json"), JSON.stringify({ before: c.base, originalIndex: original?.toString("base64") ?? null, temporary, paths: selected, message, requirements }));
27191
- if (original) await writeFile5(temporary, original, { flag: "wx" });
26977
+ await writeFile4(join13(busy, "recovery.json"), JSON.stringify({ before: c.base, originalIndex: original?.toString("base64") ?? null, temporary, paths: selected, message, requirements }));
26978
+ if (original) await writeFile4(temporary, original, { flag: "wx" });
27192
26979
  else await git(["read-tree", "--empty"], temporary);
27193
26980
  await git(["add", "--", ...stageable], temporary);
27194
26981
  const actual = await staged(temporary);
@@ -27203,7 +26990,7 @@ async function specCommit(cwd, input2, dryRun) {
27203
26990
  const size = Number(header[2]);
27204
26991
  if (end < 0 || header[1] !== "blob" || !Number.isSafeInteger(size) || output2[end + 1 + size] !== 10) fail6(t2("commit.stagedUnreadable", { path: path3 }));
27205
26992
  const staged2 = output2.subarray(end + 1, end + 1 + size);
27206
- const file2 = await readFile11(join14(root, path3));
26993
+ const file2 = await readFile10(join13(root, path3));
27207
26994
  if (!staged2.equals(file2) && !staged2.equals(Buffer.from(file2.toString("latin1").replace(/\r\n/g, "\n"), "latin1"))) fail6(t2("commit.filterChanged"));
27208
26995
  offset = end + size + 2;
27209
26996
  }
@@ -27211,7 +26998,7 @@ async function specCommit(cwd, input2, dryRun) {
27211
26998
  const again = await hashes([...locked.keys()]);
27212
26999
  for (const [path3, value] of locked) if (again.get(path3) !== value) fail6(t2("commit.fileChangedPreparing", { path: path3 }));
27213
27000
  if ((await readLockedPreviewState(root)).stamp !== published.stamp) fail6(t2("commit.specsChangedPreparing"));
27214
- for (const name of integration) if (await info5(join14(gitDir, name))) fail6(t2("commit.integrationStarted"));
27001
+ for (const name of integration) if (await info5(join13(gitDir, name))) fail6(t2("commit.integrationStarted"));
27215
27002
  if (!same2(c.base, await c.reader.baseline())) fail6(t2("commit.headChanged"));
27216
27003
  const tree = (await git(["write-tree"], temporary)).toString("utf8").trim();
27217
27004
  commitStarted = true;
@@ -27226,10 +27013,10 @@ async function specCommit(cwd, input2, dryRun) {
27226
27013
  if (headers[0] !== "tree " + tree || after.branch !== c.base.branch || !same2(parents, c.base.head ? [c.base.head] : []) || trailers.some((t3) => !body.split(/\r?\n/).includes(t3))) fail6(t2("commit.resultAltered"));
27227
27014
  if (hash2(await optional2(indexPath) ?? Buffer.alloc(0)) !== indexHash) fail6(t2("commit.indexChangedAfter"));
27228
27015
  if ((await git(["write-tree"], temporary)).toString("utf8").trim() !== tree) fail6(t2("commit.hookChangedStaging"));
27229
- await lock.writeFile(await readFile11(temporary));
27016
+ await lock.writeFile(await readFile10(temporary));
27230
27017
  await lock.sync();
27231
27018
  await lock.close();
27232
- await rename5(indexPath + ".lock", indexPath);
27019
+ await rename4(indexPath + ".lock", indexPath);
27233
27020
  indexLock = void 0;
27234
27021
  committed = { commit: after.head, paths: actual };
27235
27022
  } catch (error62) {
@@ -27248,14 +27035,14 @@ async function specCommit(cwd, input2, dryRun) {
27248
27035
  await indexLock?.close().catch(() => {
27249
27036
  });
27250
27037
  if (!uncertain) {
27251
- if (indexLock) await unlink6(indexPath + ".lock").catch(() => {
27038
+ if (indexLock) await unlink5(indexPath + ".lock").catch(() => {
27252
27039
  });
27253
- await unlink6(temporary).catch(() => {
27040
+ await unlink5(temporary).catch(() => {
27254
27041
  });
27255
27042
  if (owned) {
27256
- await unlink6(join14(busy, "recovery.json")).catch(() => {
27043
+ await unlink5(join13(busy, "recovery.json")).catch(() => {
27257
27044
  });
27258
- await rmdir3(busy);
27045
+ await rmdir2(busy);
27259
27046
  }
27260
27047
  }
27261
27048
  }
@@ -27270,14 +27057,14 @@ async function execute(action, options, controls) {
27270
27057
  try {
27271
27058
  const guard = specPreviewReader(process.cwd());
27272
27059
  const { root, gitDir, objectFormat } = await guard.location();
27273
- for (const marker2 of operations) if (await fileInfo(join15(gitDir, marker2))) throw new InitError("GIT_OPERATION_IN_PROGRESS", t2("git.operationInProgress", { marker: marker2 }));
27060
+ for (const marker2 of operations) if (await fileInfo(join14(gitDir, marker2))) throw new InitError("GIT_OPERATION_IN_PROGRESS", t2("git.operationInProgress", { marker: marker2 }));
27274
27061
  if (await guard.hasUnmerged()) throw new InitError("GIT_OPERATION_IN_PROGRESS", t2("git.resolveConflicts"));
27275
27062
  const raw = await readConfigFile(root);
27276
27063
  if (raw === void 0) throw new SpecPreviewError(t2("preview.notInitialized"));
27277
27064
  const config2 = parseManagedConfig(raw);
27278
27065
  if (!("schemaVersion" in config2)) throw new SpecPreviewError(t2("preview.legacyProject"));
27279
27066
  await initRepository(root).validateBaseline(config2, root, "HEAD", objectFormat);
27280
- if (["working", "save", "changes", "prepare", "verify", "commit-plan", "commit-apply", "commit"].includes(action)) {
27067
+ if (["working", "save", "changes", "commit"].includes(action)) {
27281
27068
  let result;
27282
27069
  const inputs = () => prepareAgentInputs(root, controls).catch(() => void 0);
27283
27070
  if (action === "working") result = narrowWorking(await readWorkingPreview(process.cwd()), options, await inputs());
@@ -27291,7 +27078,7 @@ async function execute(action, options, controls) {
27291
27078
  } catch {
27292
27079
  throw new SpecPreviewError(t2("preview.inputJson"));
27293
27080
  }
27294
- result = action === "commit" ? await specCommit(process.cwd(), input2, !!options.dryRun) : action === "commit-plan" || action === "commit-apply" ? await previewCommit(process.cwd(), action === "commit-plan" ? "plan" : "apply", input2) : action === "prepare" ? await prepareWorkingPreview(process.cwd(), input2) : action === "verify" ? await verifyPreparedPreview(process.cwd(), input2, !!options.staged) : await saveWorkingPreview(process.cwd(), input2);
27081
+ result = action === "commit" ? await specCommit(process.cwd(), input2, !!options.dryRun) : await saveWorkingPreview(process.cwd(), input2);
27295
27082
  const consumed = action === "save" || action === "commit" && result.outcome === "committed";
27296
27083
  if (consumed && options.file !== "-") result = { ...result, inputRemoved: await discardAgentInput(root, options.file, controls) };
27297
27084
  }
@@ -27317,7 +27104,7 @@ async function execute(action, options, controls) {
27317
27104
  async function readInputFile(path3) {
27318
27105
  const source2 = await stat2(path3);
27319
27106
  if (!source2.isFile() || source2.size > 1024 * 1024) throw new SpecPreviewError(t2("preview.inputFile"));
27320
- return readFile12(path3);
27107
+ return readFile11(path3);
27321
27108
  }
27322
27109
  async function readStdin(stream) {
27323
27110
  const chunks = [];
@@ -27349,11 +27136,11 @@ function narrowWorking(working, options, inputs) {
27349
27136
  }
27350
27137
 
27351
27138
  // src/commands/migrate.ts
27352
- import { lstat as lstat10, readdir as readdir6, readFile as readFile13, rename as rename6, writeFile as writeFile6, unlink as unlink7 } from "node:fs/promises";
27353
- import { join as join16 } from "node:path";
27139
+ import { lstat as lstat9, readdir as readdir6, readFile as readFile12, rename as rename5, writeFile as writeFile5, unlink as unlink6 } from "node:fs/promises";
27140
+ import { join as join15 } from "node:path";
27354
27141
  import { randomBytes as randomBytes3 } from "node:crypto";
27355
27142
  var operations2 = ["MERGE_HEAD", "CHERRY_PICK_HEAD", "REVERT_HEAD", "rebase-merge", "rebase-apply", "sequencer", "BISECT_START", "index.lock"];
27356
- var info6 = (path3) => lstat10(path3).catch((e) => {
27143
+ var info6 = (path3) => lstat9(path3).catch((e) => {
27357
27144
  if (e.code === "ENOENT") return void 0;
27358
27145
  throw e;
27359
27146
  });
@@ -27364,18 +27151,18 @@ var fail7 = (code, message) => {
27364
27151
  async function migrateStore(cwd, dryRun = false) {
27365
27152
  const reader = specPreviewReader(cwd);
27366
27153
  const { root, gitDir } = await reader.location();
27367
- for (const marker3 of operations2) if (await info6(join16(gitDir, marker3))) fail7("GIT_OPERATION_IN_PROGRESS", t2("git.operationInProgress", { marker: marker3 }));
27154
+ for (const marker3 of operations2) if (await info6(join15(gitDir, marker3))) fail7("GIT_OPERATION_IN_PROGRESS", t2("git.operationInProgress", { marker: marker3 }));
27368
27155
  if (await reader.hasUnmerged()) fail7("GIT_OPERATION_IN_PROGRESS", t2("git.resolveConflicts"));
27369
- for (const name of [...LEGACY_LOCKS, "gitifact-spec-preview.lock", "gitifact-spec-commit.lock"]) if (await info6(join16(gitDir, name))) fail7("LOCKED", t2("migrate.locked", { path: join16(gitDir, name) }));
27370
- const from = join16(root, ".tryce");
27371
- const to = join16(root, ".gitifact");
27156
+ for (const name of [...LEGACY_LOCKS, "gitifact-spec-preview.lock", "gitifact-spec-commit.lock"]) if (await info6(join15(gitDir, name))) fail7("LOCKED", t2("migrate.locked", { path: join15(gitDir, name) }));
27157
+ const from = join15(root, ".tryce");
27158
+ const to = join15(root, ".gitifact");
27372
27159
  const fromInfo = await info6(from);
27373
27160
  if (await info6(to)) fail7("ALREADY_MIGRATED", t2("migrate.alreadyMigrated"));
27374
27161
  if (!fromInfo) return fail7("NOTHING_TO_MIGRATE", t2("migrate.nothingToMigrate"));
27375
27162
  if (!fromInfo.isDirectory() || fromInfo.isSymbolicLink()) fail7("PATH_CONFLICT", t2("migrate.notDirectory"));
27376
- const configInfo = await info6(join16(from, "config.json"));
27163
+ const configInfo = await info6(join15(from, "config.json"));
27377
27164
  if (!configInfo?.isFile() || configInfo.isSymbolicLink()) fail7("NOT_INITIALIZED", t2("migrate.noConfig"));
27378
- const config2 = parseManagedConfig(decode4(await readFile13(join16(from, "config.json"))));
27165
+ const config2 = parseManagedConfig(decode4(await readFile12(join15(from, "config.json"))));
27379
27166
  if (!("schemaVersion" in config2)) fail7("UNSUPPORTED_FORMAT", t2("migrate.legacyJson"));
27380
27167
  const top = (await readdir6(from)).sort();
27381
27168
  if (top.some((name) => name !== "config.json" && name !== "spec")) fail7("UNSUPPORTED_FORMAT", t2("migrate.extraEntries"));
@@ -27384,20 +27171,20 @@ async function migrateStore(cwd, dryRun = false) {
27384
27171
  const legacyRecords = [];
27385
27172
  const marker2 = /^<!-- tryce-(spec|req|design|ref): /;
27386
27173
  if (top.includes("spec")) {
27387
- for (const feature2 of (await readdir6(join16(from, "spec"))).sort()) {
27388
- const dir = join16(from, "spec", feature2);
27174
+ for (const feature2 of (await readdir6(join15(from, "spec"))).sort()) {
27175
+ const dir = join15(from, "spec", feature2);
27389
27176
  const stat3 = await info6(dir);
27390
27177
  if (!stat3?.isDirectory() || stat3.isSymbolicLink()) fail7("UNSUPPORTED_FORMAT", t2("migrate.notSpecFolder", { feature: feature2 }));
27391
27178
  for (const name of (await readdir6(dir)).sort()) {
27392
27179
  if (!["requirements.md", "design.md", "history.jsonl", "tryce.json"].includes(name)) fail7("UNSUPPORTED_FORMAT", t2("migrate.unsupportedFile", { feature: feature2, name }));
27393
- const fileStat = await info6(join16(dir, name));
27180
+ const fileStat = await info6(join15(dir, name));
27394
27181
  if (!fileStat?.isFile() || fileStat.isSymbolicLink() || fileStat.nlink !== 1 || fileStat.size > 1024 * 1024) fail7("UNSUPPORTED_FORMAT", t2("migrate.fileTooLarge", { name }));
27395
27182
  const newPath = `.gitifact/spec/${feature2}/${name}`;
27396
27183
  if (name === "tryce.json") {
27397
27184
  legacyRecords.push(newPath);
27398
27185
  continue;
27399
27186
  }
27400
- const text2 = decode4(await readFile13(join16(dir, name)));
27187
+ const text2 = decode4(await readFile12(join15(dir, name)));
27401
27188
  if (name === "history.jsonl") {
27402
27189
  files.set(newPath, text2);
27403
27190
  continue;
@@ -27408,9 +27195,9 @@ async function migrateStore(cwd, dryRun = false) {
27408
27195
  if (new RegExp(`^ {0,3}${fence.char}{${fence.size},}\\s*$`).test(line)) fence = void 0;
27409
27196
  return line;
27410
27197
  }
27411
- const open6 = /^ {0,3}(`{3,}|~{3,})/.exec(line);
27412
- if (open6) {
27413
- fence = { char: open6[1][0], size: open6[1].length };
27198
+ const open5 = /^ {0,3}(`{3,}|~{3,})/.exec(line);
27199
+ if (open5) {
27200
+ fence = { char: open5[1][0], size: open5[1].length };
27414
27201
  return line;
27415
27202
  }
27416
27203
  return marker2.test(line) ? line.replace(/^<!-- tryce-/, "<!-- gitifact-") : line;
@@ -27440,15 +27227,15 @@ async function migrateStore(cwd, dryRun = false) {
27440
27227
  ]
27441
27228
  });
27442
27229
  if (dryRun) return result("planned");
27443
- await rename6(from, to);
27230
+ await rename5(from, to);
27444
27231
  for (const r of rewrites) {
27445
- const full = join16(root, r.path);
27446
- const temp = join16(root, ".gitifact", "spec", ".gitifact-migrate-" + randomBytes3(8).toString("hex"));
27447
- await writeFile6(temp, r.content, { flag: "wx" });
27232
+ const full = join15(root, r.path);
27233
+ const temp = join15(root, ".gitifact", "spec", ".gitifact-migrate-" + randomBytes3(8).toString("hex"));
27234
+ await writeFile5(temp, r.content, { flag: "wx" });
27448
27235
  try {
27449
- await rename6(temp, full);
27236
+ await rename5(temp, full);
27450
27237
  } finally {
27451
- await unlink7(temp).catch(() => {
27238
+ await unlink6(temp).catch(() => {
27452
27239
  });
27453
27240
  }
27454
27241
  }
@@ -27466,24 +27253,20 @@ async function runMigrate(options) {
27466
27253
  }
27467
27254
 
27468
27255
  // src/main.ts
27469
- var program2 = new Command().name("gitifact").description(t2("help.program")).version("0.5.1").allowExcessArguments(false).addHelpText("after", "\n" + t2("help.notYet")).action(() => program2.outputHelp());
27256
+ var program2 = new Command().name("gitifact").description(t2("help.program")).version("0.6.0").allowExcessArguments(false).addHelpText("after", "\n" + t2("help.notYet")).action(() => program2.outputHelp());
27470
27257
  program2.command("status").description(t2("help.status")).allowExcessArguments(false).addOption(new Option("--format <format>", t2("help.format")).choices(["json", "text"]).default("json")).action(async (options) => {
27471
27258
  await runStatus(options.format);
27472
27259
  });
27473
- program2.command("browser").description(t2("help.browser")).allowExcessArguments(false).option("--port <port>", t2("help.browserPort"), parsePort, 0).option("--dev", t2("help.browserDev")).option("--no-update-check", t2("help.browserNoUpdateCheck")).action((options) => runBrowser(options, "0.5.1"));
27474
- program2.command("init").description(t2("help.init")).allowExcessArguments(false).option("--dry-run", t2("help.initDryRun")).addOption(new Option("--agent <agent>", t2("help.initAgent")).choices([...agentPresetNames])).addOption(new Option("--remove-agents", t2("help.initRemoveAgents")).conflicts("skipAgents")).option("--skip-agents", t2("help.initSkipAgents")).addOption(new Option("--format <format>", t2("help.format")).choices(["json", "text"]).default("json")).action((options) => runInit(options, "0.5.1"));
27260
+ program2.command("browser").description(t2("help.browser")).allowExcessArguments(false).option("--port <port>", t2("help.browserPort"), parsePort, 0).option("--dev", t2("help.browserDev")).option("--no-update-check", t2("help.browserNoUpdateCheck")).action((options) => runBrowser(options, "0.6.0"));
27261
+ program2.command("init").description(t2("help.init")).allowExcessArguments(false).option("--dry-run", t2("help.initDryRun")).addOption(new Option("--agent <agent>", t2("help.initAgent")).choices([...agentPresetNames])).addOption(new Option("--remove-agents", t2("help.initRemoveAgents")).conflicts("skipAgents")).option("--skip-agents", t2("help.initSkipAgents")).addOption(new Option("--format <format>", t2("help.format")).choices(["json", "text"]).default("json")).action((options) => runInit(options, "0.6.0"));
27475
27262
  program2.command("docs").description(t2("help.docs")).argument("[topic]", t2("help.docsTopic")).allowExcessArguments(false).action(async (topic) => {
27476
27263
  await runDocs(topic);
27477
27264
  });
27478
- program2.command("update").description(t2("help.update")).allowExcessArguments(false).addOption(new Option("--format <format>", t2("help.format")).choices(["json", "text"]).default("json")).option("--commit", t2("help.updateCommit")).action((options) => runUpdate(options, "0.5.1"));
27265
+ program2.command("update").description(t2("help.update")).allowExcessArguments(false).addOption(new Option("--format <format>", t2("help.format")).choices(["json", "text"]).default("json")).option("--commit", t2("help.updateCommit")).action((options) => runUpdate(options, "0.6.0"));
27479
27266
  program2.command("migrate").description(t2("help.migrate")).allowExcessArguments(false).option("--dry-run", t2("help.migrateDryRun")).action(runMigrate);
27480
27267
  var spec = program2.command("spec").description(t2("help.spec"));
27481
- var replaced = t2("help.deprecated");
27482
27268
  spec.command("commit").description(t2("help.specCommit")).allowExcessArguments(false).requiredOption("--file <path>", t2("help.specCommitFile")).option("--dry-run", t2("help.specCommitDryRun")).action((o) => runSpecPreview("commit", o));
27483
- for (const action of ["commit-plan", "commit-apply"]) spec.command(action).description(replaced).allowExcessArguments(false).requiredOption("--file <path>", t2("help.specCommitPlanFile")).action((o) => runSpecPreview(action, o));
27484
27269
  spec.command("changes").description(t2("help.specChanges")).allowExcessArguments(false).action((o) => runSpecPreview("changes", o));
27485
- spec.command("prepare").description(replaced).allowExcessArguments(false).requiredOption("--file <path>", t2("help.specPrepareFile")).action((o) => runSpecPreview("prepare", o));
27486
- spec.command("verify").description(replaced).allowExcessArguments(false).requiredOption("--file <path>", t2("help.specVerifyFile")).option("--staged", t2("help.specVerifyStaged")).action((o) => runSpecPreview("verify", o));
27487
27270
  spec.command("working").description(t2("help.specWorking")).allowExcessArguments(false).addOption(new Option("--stamp", t2("help.specWorkingStamp")).conflicts(["feature", "ids"])).option("--feature <name>", t2("help.specWorkingFeature")).option("--ids", t2("help.specWorkingIds")).action((o) => runSpecPreview("working", o));
27488
27271
  spec.command("save").description(t2("help.specSave")).allowExcessArguments(false).requiredOption("--file <path>", t2("help.specSaveFile")).action((o) => runSpecPreview("save", o));
27489
27272
  spec.command("read").description(t2("help.specRead")).allowExcessArguments(false).option("--ref <commit>", t2("help.specReadRef"), "HEAD").action((o) => runSpecPreview("read", o));