@coopcli/specsketch 0.1.1 → 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.
Files changed (152) hide show
  1. package/README.md +79 -28
  2. package/dist/cli/index.js +48 -18
  3. package/dist/client/assets/{abnfDiagram-VRR7QNED-9LvWalHU.js → abnfDiagram-VRR7QNED-D5qnskik.js} +1 -1
  4. package/dist/client/assets/{ar-SA-G6X2FPQ2-BP4GLzOL.js → ar-SA-G6X2FPQ2-jwBzex-2.js} +1 -1
  5. package/dist/client/assets/architecture-TIHT7OUA-Bj5GS0Ct.js +1 -0
  6. package/dist/client/assets/{architectureDiagram-ZJ3FMSHR-JGT5Y2Xo.js → architectureDiagram-ZJ3FMSHR-DdYSrIl0.js} +1 -1
  7. package/dist/client/assets/{az-AZ-76LH7QW2-BL7aGO97.js → az-AZ-76LH7QW2-Dis0vDnD.js} +1 -1
  8. package/dist/client/assets/{bg-BG-XCXSNQG7-BkccizPQ.js → bg-BG-XCXSNQG7-BCcYYSpX.js} +1 -1
  9. package/dist/client/assets/{blockDiagram-677ZJIJ3-CSMfPW2x.js → blockDiagram-677ZJIJ3-IHRgXLG2.js} +1 -1
  10. package/dist/client/assets/{bn-BD-2XOGV67Q-BvB29MhT.js → bn-BD-2XOGV67Q-Cs38e4dA.js} +1 -1
  11. package/dist/client/assets/{c4Diagram-LMCZKHZV-BdI2t7Fw.js → c4Diagram-LMCZKHZV-DuitrGTA.js} +1 -1
  12. package/dist/client/assets/{ca-ES-6MX7JW3Y-BRz1caOn.js → ca-ES-6MX7JW3Y-J6JluMn1.js} +1 -1
  13. package/dist/client/assets/channel-B0WxnXxi.js +1 -0
  14. package/dist/client/assets/{chunk-32BRIVSS-CfgCuJ2S.js → chunk-32BRIVSS-FVqbFiM9.js} +1 -1
  15. package/dist/client/assets/{chunk-52WLFC77-BADPESoq.js → chunk-52WLFC77-B5fSTF98.js} +1 -1
  16. package/dist/client/assets/{chunk-C7G6YPKG-BKTl4R9W.js → chunk-C7G6YPKG-CUlznrHX.js} +1 -1
  17. package/dist/client/assets/{chunk-EIO257PC-hcR0ULdA.js → chunk-EIO257PC-B_XNiJ0A.js} +1 -1
  18. package/dist/client/assets/{chunk-EX3LRPZG-DSAdQncj.js → chunk-EX3LRPZG-D7H3g3lm.js} +1 -1
  19. package/dist/client/assets/{chunk-FWX5IMBZ-B-bLlCzz.js → chunk-FWX5IMBZ-DlSTzkRW.js} +2 -2
  20. package/dist/client/assets/{chunk-HOUHSVGY-DhoXq6Rd.js → chunk-HOUHSVGY-BB87Tq5U.js} +1 -1
  21. package/dist/client/assets/{chunk-ICXQ74PX-B3ecNouC.js → chunk-ICXQ74PX-DHmdnexU.js} +1 -1
  22. package/dist/client/assets/{chunk-MOJQB5TN-CL2WAZ8d.js → chunk-MOJQB5TN-Cd67Wk3-.js} +1 -1
  23. package/dist/client/assets/{chunk-OGEWGWER-DpHZ95Ou.js → chunk-OGEWGWER-G3kRomY-.js} +1 -1
  24. package/dist/client/assets/{chunk-PUDLZKDR-BslDQWVW.js → chunk-PUDLZKDR-DJw3XJhs.js} +1 -1
  25. package/dist/client/assets/{chunk-Q4XR5HBZ-CJVsuIz0.js → chunk-Q4XR5HBZ-BV5Bw0_D.js} +1 -1
  26. package/dist/client/assets/{chunk-V7JOEXUC-CZGlgk94.js → chunk-V7JOEXUC-C2vxCA10.js} +1 -1
  27. package/dist/client/assets/{chunk-VAUOI2AC-C91DAhQB.js → chunk-VAUOI2AC-B2lAp2X6.js} +1 -1
  28. package/dist/client/assets/{chunk-VR4S4FIN-Bi0kkLZs.js → chunk-VR4S4FIN-Dk58Ba0X.js} +1 -1
  29. package/dist/client/assets/{chunk-WYO6CB5R-WOgWEZB2.js → chunk-WYO6CB5R-rhSewh5r.js} +1 -1
  30. package/dist/client/assets/{chunk-ZGVPDNZ5-CE90Bal7.js → chunk-ZGVPDNZ5-C8pQspwU.js} +1 -1
  31. package/dist/client/assets/classDiagram-OUVF2IWQ-Dnwqjkgm.js +1 -0
  32. package/dist/client/assets/classDiagram-v2-EOCWNBFH-Dnwqjkgm.js +1 -0
  33. package/dist/client/assets/{cs-CZ-2BRQDIVT-DeT5c9oE.js → cs-CZ-2BRQDIVT-CMTTkdlc.js} +1 -1
  34. package/dist/client/assets/{cynefin-VYW2F7L2-C7eYwGQB.js → cynefin-VYW2F7L2-D4wuR1xh.js} +1 -1
  35. package/dist/client/assets/{cynefinDiagram-TSTJHNR4-TjfXKu8O.js → cynefinDiagram-TSTJHNR4-BlF8b9qP.js} +1 -1
  36. package/dist/client/assets/{da-DK-5WZEPLOC-D0piI-Xp.js → da-DK-5WZEPLOC-BMtFOXTa.js} +1 -1
  37. package/dist/client/assets/{dagre-VKFMJZFB-Bb1mcWe2.js → dagre-VKFMJZFB-DytIg2RQ.js} +1 -1
  38. package/dist/client/assets/{de-DE-XR44H4JA-DtKABxSq.js → de-DE-XR44H4JA-C2G_UWRS.js} +1 -1
  39. package/dist/client/assets/{diagram-FQU43EPY-D0ebQzkB.js → diagram-FQU43EPY-BOqWKyO9.js} +1 -1
  40. package/dist/client/assets/{diagram-G47NLZAW-mAy_wu85.js → diagram-G47NLZAW-1dP1jpC7.js} +1 -1
  41. package/dist/client/assets/{diagram-NH7WQ7WH-Bzfr25XU.js → diagram-NH7WQ7WH-VyXFGKGb.js} +1 -1
  42. package/dist/client/assets/{diagram-OA4YK3LP-Df7M05fG.js → diagram-OA4YK3LP-BP7GwNyd.js} +1 -1
  43. package/dist/client/assets/{diagram-WEI45ONY-BjZhI7--.js → diagram-WEI45ONY-DyHZtrRF.js} +1 -1
  44. package/dist/client/assets/{dist-CZroTgLe.js → dist-C_FPOqHa.js} +4 -4
  45. package/dist/client/assets/{ebnfDiagram-CCIWWBDH-DUxSwKKK.js → ebnfDiagram-CCIWWBDH-Bitxc5e_.js} +1 -1
  46. package/dist/client/assets/{el-GR-BZB4AONW-DwxwKkxk.js → el-GR-BZB4AONW-BTK70kle.js} +1 -1
  47. package/dist/client/assets/{en-B4ZKOASM-DbWq1JZq.js → en-B4ZKOASM-DQDUvTjb.js} +1 -1
  48. package/dist/client/assets/{erDiagram-Q63AITRT-BZO1wQdn.js → erDiagram-Q63AITRT-CI8TMXqA.js} +1 -1
  49. package/dist/client/assets/{es-ES-U4NZUMDT-HKSZwq1n.js → es-ES-U4NZUMDT-6TeZK11C.js} +1 -1
  50. package/dist/client/assets/{eu-ES-A7QVB2H4-SBFBqbl6.js → eu-ES-A7QVB2H4-Cb0oNkmv.js} +1 -1
  51. package/dist/client/assets/eventmodeling-45OFAUF4-CTwqsmD_.js +1 -0
  52. package/dist/client/assets/{fa-IR-HGAKTJCU-OephStPw.js → fa-IR-HGAKTJCU-JYkLqShQ.js} +1 -1
  53. package/dist/client/assets/{fi-FI-Z5N7JZ37-MqqXzLYb.js → fi-FI-Z5N7JZ37-u_gehdrx.js} +1 -1
  54. package/dist/client/assets/flowDiagram-23GEKE2U-BZYDBy9C.js +1 -0
  55. package/dist/client/assets/{fr-FR-RHASNOE6-B_U118K8.js → fr-FR-RHASNOE6-CmE3ELbC.js} +1 -1
  56. package/dist/client/assets/{ganttDiagram-NO4QXBWP-DIuhNI4R.js → ganttDiagram-NO4QXBWP-CH13wSU6.js} +1 -1
  57. package/dist/client/assets/{gitGraph-TEB2WS4Q-gtC5ENoq.js → gitGraph-TEB2WS4Q-g2g2G5VS.js} +1 -1
  58. package/dist/client/assets/{gitGraphDiagram-IHSO6WYX-Uu3sgpLC.js → gitGraphDiagram-IHSO6WYX-IpKqkdqX.js} +1 -1
  59. package/dist/client/assets/{gl-ES-HMX3MZ6V-B8uLr62O.js → gl-ES-HMX3MZ6V-Fy4K9BOx.js} +1 -1
  60. package/dist/client/assets/{he-IL-6SHJWFNN-BaXIdIWW.js → he-IL-6SHJWFNN-BtuHPbrL.js} +1 -1
  61. package/dist/client/assets/{hi-IN-IWLTKZ5I-CiZpxQap.js → hi-IN-IWLTKZ5I-TEGNFf4N.js} +1 -1
  62. package/dist/client/assets/{hu-HU-A5ZG7DT2-D1gqx6aL.js → hu-HU-A5ZG7DT2-BAaPCJl5.js} +1 -1
  63. package/dist/client/assets/{id-ID-SAP4L64H-COGgOgFw.js → id-ID-SAP4L64H-DyuFpf3d.js} +1 -1
  64. package/dist/client/assets/image-GAAHSSAO-tSmyz8fT.js +1 -0
  65. package/dist/client/assets/{index-Ws5zYxgd.css → index--u8Mf6T6.css} +1 -1
  66. package/dist/client/assets/{index-DZ_2V0y_.js → index-BkkP6_3-.js} +8 -8
  67. package/dist/client/assets/{info-DKCQHKI2-DukBHksi.js → info-DKCQHKI2-DjHPtgDy.js} +1 -1
  68. package/dist/client/assets/{infoDiagram-FWYZ7A6U-BDxLO6UX.js → infoDiagram-FWYZ7A6U-DbwYrIVA.js} +1 -1
  69. package/dist/client/assets/{ishikawaDiagram-FXEZZL3T-DMNp3gg4.js → ishikawaDiagram-FXEZZL3T-DUKB4IOX.js} +1 -1
  70. package/dist/client/assets/{it-IT-JPQ66NNP-P3-QA8jC.js → it-IT-JPQ66NNP-DI0hWELN.js} +1 -1
  71. package/dist/client/assets/{ja-JP-DBVTYXUO-Dz9pBiAJ.js → ja-JP-DBVTYXUO-BVDm3NlP.js} +1 -1
  72. package/dist/client/assets/{journeyDiagram-5HDEW3XC-DhsvT8b6.js → journeyDiagram-5HDEW3XC-CBla9cDa.js} +1 -1
  73. package/dist/client/assets/{kaa-6HZHGXH3-eoqMg1w6.js → kaa-6HZHGXH3-BPmENbr7.js} +1 -1
  74. package/dist/client/assets/{kab-KAB-ZGHBKWFO-CcvPyNvQ.js → kab-KAB-ZGHBKWFO-SJCSLUAj.js} +1 -1
  75. package/dist/client/assets/{kanban-definition-HUTT4EX6-CjC34u75.js → kanban-definition-HUTT4EX6-DF40bon8.js} +1 -1
  76. package/dist/client/assets/{kk-KZ-P5N5QNE5-f-VK8qcK.js → kk-KZ-P5N5QNE5-iO6ccQA0.js} +1 -1
  77. package/dist/client/assets/{km-KH-HSX4SM5Z-BCBh45oR.js → km-KH-HSX4SM5Z-DaeRmR92.js} +1 -1
  78. package/dist/client/assets/{ko-KR-MTYHY66A-QcfqVpsa.js → ko-KR-MTYHY66A-BbIUlDG8.js} +1 -1
  79. package/dist/client/assets/{ku-TR-6OUDTVRD-BOO5VTf9.js → ku-TR-6OUDTVRD-mV8MrK_d.js} +1 -1
  80. package/dist/client/assets/{line-BKYoxUsy.js → line-Cyy-k4TY.js} +1 -1
  81. package/dist/client/assets/{lt-LT-XHIRWOB4-CNhufcIZ.js → lt-LT-XHIRWOB4-NGxzPcvJ.js} +1 -1
  82. package/dist/client/assets/{lv-LV-5QDEKY6T-DpczMj-_.js → lv-LV-5QDEKY6T-BSIwo-WO.js} +1 -1
  83. package/dist/client/assets/{mermaid-parser.core-BB1spMEk.js → mermaid-parser.core-BC7y6sOJ.js} +3 -3
  84. package/dist/client/assets/{mindmap-definition-LN4V7U3C-B1L2Cgvy.js → mindmap-definition-LN4V7U3C-BcAHqIrw.js} +1 -1
  85. package/dist/client/assets/{mr-IN-CRQNXWMA-C9mAym7z.js → mr-IN-CRQNXWMA-DMqRrESd.js} +1 -1
  86. package/dist/client/assets/{my-MM-5M5IBNSE-BvR9_0Ba.js → my-MM-5M5IBNSE-BU9rr6eQ.js} +1 -1
  87. package/dist/client/assets/{nb-NO-T6EIAALU-D9QTRDiW.js → nb-NO-T6EIAALU-CfCFCnvr.js} +1 -1
  88. package/dist/client/assets/{nl-NL-IS3SIHDZ-CB3MLLtD.js → nl-NL-IS3SIHDZ-BDDDlrXW.js} +1 -1
  89. package/dist/client/assets/{nn-NO-6E72VCQL-4s2iW47n.js → nn-NO-6E72VCQL-DxXyaKak.js} +1 -1
  90. package/dist/client/assets/{oc-FR-POXYY2M6-BDp_Z-MA.js → oc-FR-POXYY2M6-DhEINSYs.js} +1 -1
  91. package/dist/client/assets/{pa-IN-N4M65BXN-BEw5rXwN.js → pa-IN-N4M65BXN-CK7mHZv5.js} +1 -1
  92. package/dist/client/assets/{packet-7NZHBO7P-VpUbhw9f.js → packet-7NZHBO7P-BxQG27fi.js} +1 -1
  93. package/dist/client/assets/{pegDiagram-2B236MQR-Dvr2dVtY.js → pegDiagram-2B236MQR-6m6GI5bN.js} +1 -1
  94. package/dist/client/assets/percentages-BXMCSKIN-BuLIaCEd.js +1 -0
  95. package/dist/client/assets/{pie-RZYD4A2V-CK5JbE5r.js → pie-RZYD4A2V-DrlUa6Jm.js} +1 -1
  96. package/dist/client/assets/{pieDiagram-ENE6RG2P-hrgv0FEH.js → pieDiagram-ENE6RG2P-BLDvuItJ.js} +1 -1
  97. package/dist/client/assets/{pl-PL-T2D74RX3-BnERCd0d.js → pl-PL-T2D74RX3-CqscU5Ri.js} +1 -1
  98. package/dist/client/assets/{pt-BR-5N22H2LF-slYmg2Ze.js → pt-BR-5N22H2LF-DmaMKyvD.js} +1 -1
  99. package/dist/client/assets/{pt-PT-UZXXM6DQ-Cw2RqNmb.js → pt-PT-UZXXM6DQ-DF4Iue14.js} +1 -1
  100. package/dist/client/assets/{quadrantDiagram-ABIIQ3AL-B7qeFyL4.js → quadrantDiagram-ABIIQ3AL-G7yFHj4A.js} +1 -1
  101. package/dist/client/assets/{radar-I7S5WNFK-xmyeC4UJ.js → radar-I7S5WNFK-DB1qIDmZ.js} +1 -1
  102. package/dist/client/assets/{railroad-3IZDKUUU-KepzRlFK.js → railroad-3IZDKUUU-Cyefv0S0.js} +1 -1
  103. package/dist/client/assets/railroad-abnf-AHOZXSZD-BkviW5Tj.js +1 -0
  104. package/dist/client/assets/railroad-ebnf-EBAXGLYW-CXg6HJd6.js +1 -0
  105. package/dist/client/assets/railroad-peg-LSFZ7HO6-BgTAGb1l.js +1 -0
  106. package/dist/client/assets/{railroadDiagram-RFXS5EU6-PrCCHb2J.js → railroadDiagram-RFXS5EU6-BvUGw21O.js} +1 -1
  107. package/dist/client/assets/{requirementDiagram-TGXJPOKE-BZh8ujKD.js → requirementDiagram-TGXJPOKE-C9A-HrEu.js} +1 -1
  108. package/dist/client/assets/{ro-RO-JPDTUUEW-CToftgdK.js → ro-RO-JPDTUUEW-fRWAU3yw.js} +1 -1
  109. package/dist/client/assets/{ru-RU-B4JR7IUQ-CFeODx2o.js → ru-RU-B4JR7IUQ-CKPt5MqY.js} +1 -1
  110. package/dist/client/assets/{sankeyDiagram-HTMAVEWB-CjDpDF-M.js → sankeyDiagram-HTMAVEWB-exIXTcGE.js} +1 -1
  111. package/dist/client/assets/{sequenceDiagram-DBY2YBRQ-16bQSxmd.js → sequenceDiagram-DBY2YBRQ-aDjop-R8.js} +1 -1
  112. package/dist/client/assets/{si-LK-N5RQ5JYF-oZKUMo_P.js → si-LK-N5RQ5JYF-MDsRqHY9.js} +1 -1
  113. package/dist/client/assets/{sk-SK-C5VTKIMK-Dt7AjknE.js → sk-SK-C5VTKIMK-CRZETqXz.js} +1 -1
  114. package/dist/client/assets/{sl-SI-NN7IZMDC-HhXTUu2g.js → sl-SI-NN7IZMDC-CXfLqNoN.js} +1 -1
  115. package/dist/client/assets/{stateDiagram-2N3HPSRC-PDyTeH2U.js → stateDiagram-2N3HPSRC-y0Ml_ZQw.js} +1 -1
  116. package/dist/client/assets/stateDiagram-v2-6OUMAXLB-D8dyI3My.js +1 -0
  117. package/dist/client/assets/subset-shared.chunk-BTjBJrZm.js +1 -0
  118. package/dist/client/assets/{subset-worker.chunk-BH182Pym.js → subset-worker.chunk-DbYO8wJu.js} +1 -1
  119. package/dist/client/assets/{sv-SE-XGPEYMSR-B0ThLx7H.js → sv-SE-XGPEYMSR-BC6B5BtV.js} +1 -1
  120. package/dist/client/assets/{swimlanes-5IMT3BWC-B6lSXfOr.js → swimlanes-5IMT3BWC-CYWdivj3.js} +1 -1
  121. package/dist/client/assets/swimlanesDiagram-G3AALYLV-CdLCcze0.js +8 -0
  122. package/dist/client/assets/{ta-IN-2NMHFXQM-D3Tlt8wo.js → ta-IN-2NMHFXQM-DilUfcfF.js} +1 -1
  123. package/dist/client/assets/{th-TH-HPSO5L25-B-qBZifn.js → th-TH-HPSO5L25-BaInGJjE.js} +1 -1
  124. package/dist/client/assets/{timeline-definition-FHXFAJF6-DaiYdMF8.js → timeline-definition-FHXFAJF6-zAb82GBx.js} +1 -1
  125. package/dist/client/assets/{tr-TR-DEFEU3FU-BT3vutLm.js → tr-TR-DEFEU3FU-oygIet1p.js} +1 -1
  126. package/dist/client/assets/{treeView-QDETBFTQ-FTalIewb.js → treeView-QDETBFTQ-sU-avi1O.js} +1 -1
  127. package/dist/client/assets/{treemap-6X3UGDF4-CZ9rijWG.js → treemap-6X3UGDF4-BDCwJXtu.js} +1 -1
  128. package/dist/client/assets/{uk-UA-QMV73CPH-C7D_Wurx.js → uk-UA-QMV73CPH-QqCQ4UX-.js} +1 -1
  129. package/dist/client/assets/{vennDiagram-L72KCM5P-ChTaYjAu.js → vennDiagram-L72KCM5P-BXrsZk41.js} +1 -1
  130. package/dist/client/assets/{vi-VN-M7AON7JQ-BAyIBcPI.js → vi-VN-M7AON7JQ-yJDC_vY8.js} +1 -1
  131. package/dist/client/assets/{wardley-OPB4EBWU-Dw8vP8Xf.js → wardley-OPB4EBWU-DyOUx8-a.js} +1 -1
  132. package/dist/client/assets/{wardleyDiagram-EHGQE667-DtcHaU9I.js → wardleyDiagram-EHGQE667-DlOqjfHt.js} +1 -1
  133. package/dist/client/assets/{xychartDiagram-FW5EYKEG-B6du3f4I.js → xychartDiagram-FW5EYKEG-BYm9TaM8.js} +1 -1
  134. package/dist/client/assets/{zh-CN-LNUGB5OW-CuVtUKdm.js → zh-CN-LNUGB5OW-BNjW-fP_.js} +1 -1
  135. package/dist/client/assets/{zh-HK-E62DVLB3-C3l9czi9.js → zh-HK-E62DVLB3-apDiW2t-.js} +1 -1
  136. package/dist/client/assets/{zh-TW-RAJ6MFWO-CjUZVYEY.js → zh-TW-RAJ6MFWO-qAMfxdUZ.js} +1 -1
  137. package/dist/client/index.html +2 -2
  138. package/package.json +1 -1
  139. package/dist/client/assets/architecture-TIHT7OUA-C0XU-w_0.js +0 -1
  140. package/dist/client/assets/channel-D0gVHJmn.js +0 -1
  141. package/dist/client/assets/classDiagram-OUVF2IWQ-BuR8q78h.js +0 -1
  142. package/dist/client/assets/classDiagram-v2-EOCWNBFH-BuR8q78h.js +0 -1
  143. package/dist/client/assets/eventmodeling-45OFAUF4-1ttXm0MU.js +0 -1
  144. package/dist/client/assets/flowDiagram-23GEKE2U-pg72AQDT.js +0 -1
  145. package/dist/client/assets/image-GAAHSSAO-D6-ZKeer.js +0 -1
  146. package/dist/client/assets/percentages-BXMCSKIN-B-Hry9UU.js +0 -1
  147. package/dist/client/assets/railroad-abnf-AHOZXSZD-DfUr082h.js +0 -1
  148. package/dist/client/assets/railroad-ebnf-EBAXGLYW-C-dpjHIg.js +0 -1
  149. package/dist/client/assets/railroad-peg-LSFZ7HO6-CqTo_xnW.js +0 -1
  150. package/dist/client/assets/stateDiagram-v2-6OUMAXLB-C-jAQAU1.js +0 -1
  151. package/dist/client/assets/subset-shared.chunk-CuzycDCt.js +0 -1
  152. package/dist/client/assets/swimlanesDiagram-G3AALYLV-8y-Nyb1H.js +0 -8
package/README.md CHANGED
@@ -1,4 +1,79 @@
1
- # SpecSketch
1
+ # coopcli specsketch
2
+
3
+ Draw the system. Get the spec.
4
+
5
+ An Excalidraw canvas that turns architecture diagrams into **OpenSpec** change proposals —
6
+ written straight into your `openspec/` change directory, next to the diagram that produced
7
+ them, ready for an implementing agent. Local-only: the server binds to 127.0.0.1 and
8
+ generation runs with your own Anthropic credentials.
9
+
10
+ ## Quick start
11
+
12
+ ```bash
13
+ npx @coopcli/specsketch ./openspec/changes/new-feature-change
14
+ # or: npm install -g @coopcli/specsketch && specsketch ./openspec/changes/new-feature-change
15
+ ```
16
+
17
+ Open the printed URL, draw labeled boxes and arrows (loose text becomes design notes), and
18
+ press **Generate Spec**. The change directory is the workspace:
19
+
20
+ ```
21
+ openspec/changes/new-feature-change/
22
+ ├── diagram.excalidraw ← the drawing, autosaved, agent-readable
23
+ ├── specsketch.json ← title/summary/timestamps + generation manifest
24
+ ├── proposal.md
25
+ ├── design.md
26
+ ├── tasks.md
27
+ └── specs/<capability>/spec.md
28
+ ```
29
+
30
+ Stop and rerun with the same directory to resume where you left off. If the directory already
31
+ contains artifacts — scaffolded by `openspec new change` or hand-written — they're the
32
+ baseline: generation makes the **smallest revision** that fulfills the drawing, leaving
33
+ unimplicated files byte-identical.
34
+
35
+ ### Requirements & auth
36
+
37
+ - **Node ≥ 22** (the CLI checks at startup).
38
+ - **Anthropic credentials** — only needed for Generate Spec; drawing works without them, and
39
+ the CLI tells you at startup if none are found. Either:
40
+
41
+ ```bash
42
+ export ANTHROPIC_API_KEY=sk-ant-... # option 1: plain API key
43
+ # option 2: the Anthropic CLI's login profile (no key handling)
44
+ brew install anthropics/tap/ant && ant auth login
45
+ ```
46
+
47
+ ### CLI reference
48
+
49
+ ```
50
+ specsketch <path-to-openspec-change-dir> [--port <n>]
51
+ ```
52
+
53
+ - The directory is created if it doesn't exist; its basename becomes the change name.
54
+ - `--port` defaults to 8787. Binds to 127.0.0.1 exclusively — there is no `--host`.
55
+ - **Model picker** (top bar): `claude-opus-4-8` (default), `claude-sonnet-5`, or
56
+ `claude-fable-5`. The choice is saved with the change directory. Fable runs with
57
+ server-side refusal fallbacks to Opus and requires your org to allow 30-day data
58
+ retention.
59
+
60
+ ### Troubleshooting
61
+
62
+ | Symptom | Fix |
63
+ |---|---|
64
+ | `npm error 404 @coopcli/specsketch not found` right after a release | Registry propagation lag — retry in a minute or two |
65
+ | Startup warning "No Anthropic credentials detected" | Set `ANTHROPIC_API_KEY` or run `ant auth login`, then restart |
66
+ | Generate fails with a 401 / "anthropic-auth" | Same as above — the server found no credentials, or the login profile expired (`ant auth status`) |
67
+ | "Node NN detected — specsketch needs Node >= 22" | Upgrade Node (https://nodejs.org) |
68
+ | Port already in use | Pass `--port <n>` |
69
+ | Regeneration changed a file you hand-edited | Expected when the drawing implicates it — the diagram is the source of truth; use `git diff`/`git checkout` to recover, and keep change dirs in version control |
70
+
71
+ More: [getting started page](https://coopcli.com/products/specsketch) ·
72
+ [TESTING.md](TESTING.md) for the QA checklist.
73
+
74
+ ---
75
+
76
+ # The SpecSketch project
2
77
 
3
78
  Diagram a system with your team in real time, talk it through, and turn the result into an
4
79
  **OpenSpec** change proposal. Boxes and arrows + conversation in → a reviewable, spec-shaped
@@ -46,35 +121,11 @@ a validated `SpecBundle` (`src/lib/schema.ts`), rendered as browsable artifacts.
46
121
  - **valibot** — shared request/response schemas (UI + workflow).
47
122
  - **Cloudflare Realtime** (Phase 3) — WebRTC SFU for audio/video.
48
123
 
49
- ## coopcli specsketch (npm CLI)
50
-
51
- The distributable, local-only CLI. The OpenSpec change directory you pass is the workspace:
52
- the Excalidraw session autosaves to `diagram.excalidraw` inside it, and **Generate Spec**
53
- writes `proposal.md`, `design.md`, `tasks.md`, and `specs/<capability>/spec.md` there — so an
54
- implementing agent can reference both the specs and the diagram that produced them. Existing
55
- artifacts are taken as the baseline; regeneration makes the smallest change that fulfills the
56
- drawing.
57
-
58
- ```bash
59
- npx @coopcli/specsketch ./openspec/changes/new-feature-change
60
- # or: npm install -g @coopcli/specsketch && specsketch ./openspec/changes/new-feature-change
61
- ```
62
-
63
- Binds to 127.0.0.1 only (no `--host`); `--port` defaults to 8787. Stop and rerun with the
64
- same directory to resume where you left off. Local dev of the CLI itself:
65
- `npm run build:cli` then `node dist/cli/index.js <change-dir>`.
66
-
67
- **Auth for Generate Spec** (drawing works without it — the CLI warns at startup if neither
68
- is present):
69
-
70
- ```bash
71
- export ANTHROPIC_API_KEY=sk-ant-... # option 1: plain API key
72
- # option 2: the Anthropic CLI's login profile (no key handling)
73
- brew install anthropics/tap/ant && ant auth login
74
- ```
75
-
76
124
  ## Getting started (local MVP)
77
125
 
126
+ Contributor flow for this repo (the published CLI above is built from the same code —
127
+ `npm run build:cli` then `node dist/cli/index.js <change-dir>` to run it from source).
128
+
78
129
  ```bash
79
130
  npm install
80
131
  npm run dev # web (Vite, http://localhost:5173) + api (Hono/Node, :8787)
package/dist/cli/index.js CHANGED
@@ -34,8 +34,16 @@ var DiagramGraph = z.object({
34
34
  /** Free-floating text on the canvas (design notes, constraints, questions). */
35
35
  notes: z.array(z.string())
36
36
  });
37
+ var GENERATION_MODELS = [
38
+ "claude-opus-4-8",
39
+ "claude-sonnet-5",
40
+ "claude-fable-5"
41
+ ];
42
+ var DEFAULT_MODEL = "claude-opus-4-8";
43
+ var GenerationModel = z.enum(GENERATION_MODELS);
37
44
  var SpecRequest = z.object({
38
45
  title: z.string().optional(),
46
+ model: GenerationModel.optional(),
39
47
  graph: DiagramGraph
40
48
  });
41
49
  var CapabilitySpec = z.object({
@@ -63,17 +71,18 @@ var ExcalidrawScene = z.object({
63
71
  });
64
72
  var SessionSave = z.object({
65
73
  scene: ExcalidrawScene,
66
- title: z.string().optional()
74
+ title: z.string().optional(),
75
+ model: GenerationModel.optional()
67
76
  });
68
77
  var SessionSnapshot = z.object({
69
78
  changeName: z.string(),
70
79
  title: z.string().optional(),
80
+ model: GenerationModel.optional(),
71
81
  scene: ExcalidrawScene.nullable(),
72
82
  bundle: SpecBundle.nullable()
73
83
  });
74
84
 
75
85
  // server/app.ts
76
- var MODEL = "claude-opus-4-8";
77
86
  var SYSTEM = `You are a principal software architect and specification writer.
78
87
  Given an architecture diagram as a graph (nodes = components/services/datastores/actors,
79
88
  directed edges = data/control flow, notes = constraints/decisions), infer the intended system
@@ -122,23 +131,31 @@ ${notes}`;
122
131
  function createApp(anthropic, workspace) {
123
132
  const app = new Hono();
124
133
  app.get("/api/health", (c) => c.json({ ok: true }));
125
- app.get("/api/config", (c) => c.json({ workspace: Boolean(workspace) }));
134
+ app.get(
135
+ "/api/config",
136
+ (c) => c.json({
137
+ workspace: Boolean(workspace),
138
+ models: GENERATION_MODELS,
139
+ defaultModel: DEFAULT_MODEL
140
+ })
141
+ );
126
142
  if (workspace) {
127
- app.get(
128
- "/api/session",
129
- (c) => c.json({
143
+ app.get("/api/session", (c) => {
144
+ const sidecar = workspace.readSidecar();
145
+ return c.json({
130
146
  changeName: workspace.changeName,
131
- title: workspace.readSidecar().title,
147
+ title: sidecar.title,
148
+ model: GENERATION_MODELS.find((m) => m === sidecar.model),
132
149
  scene: workspace.loadScene(),
133
150
  bundle: workspace.toBundle()
134
- })
135
- );
151
+ });
152
+ });
136
153
  app.put("/api/session", async (c) => {
137
154
  const parsed = SessionSave.safeParse(await c.req.json().catch(() => null));
138
155
  if (!parsed.success) {
139
156
  return c.json({ error: "invalid session", detail: parsed.error.issues }, 400);
140
157
  }
141
- workspace.saveScene(parsed.data.scene, parsed.data.title);
158
+ workspace.saveScene(parsed.data.scene, parsed.data.title, parsed.data.model);
142
159
  return c.json({ ok: true });
143
160
  });
144
161
  }
@@ -147,7 +164,7 @@ function createApp(anthropic, workspace) {
147
164
  if (!parsed.success) {
148
165
  return c.json({ error: "invalid request", detail: parsed.error.issues }, 400);
149
166
  }
150
- const { title, graph } = parsed.data;
167
+ const { title, graph, model = DEFAULT_MODEL } = parsed.data;
151
168
  if (graph.nodes.length === 0) return c.json({ error: "diagram has no nodes" }, 400);
152
169
  const changeNameHint = workspace ? `
153
170
 
@@ -159,15 +176,23 @@ ${renderGraph(graph)}
159
176
  Produce the OpenSpec change proposal for this architecture as structured output.` + changeNameHint + (workspace ? renderBaseline(workspace) : "");
160
177
  let msg;
161
178
  try {
162
- msg = await anthropic.messages.parse({
163
- model: MODEL,
179
+ const request = {
180
+ model,
164
181
  max_tokens: 16e3,
165
182
  // non-streaming stays under the SDK HTTP timeout
166
183
  system: SYSTEM,
167
184
  messages: [{ role: "user", content: prompt }],
168
185
  output_config: { format: zodOutputFormat(SpecBundle) }
169
186
  // No temperature/top_p or thinking config — both 400 on modern models.
170
- });
187
+ };
188
+ msg = model === "claude-fable-5" ? (
189
+ // Fable: opt into server-side refusal fallbacks by default.
190
+ await anthropic.beta.messages.parse({
191
+ ...request,
192
+ betas: ["server-side-fallback-2026-06-01"],
193
+ fallbacks: [{ model: "claude-opus-4-8" }]
194
+ })
195
+ ) : await anthropic.messages.parse(request);
171
196
  } catch (err) {
172
197
  const message = err instanceof Error ? err.message : String(err);
173
198
  const status = err.status;
@@ -187,12 +212,13 @@ Produce the OpenSpec change proposal for this architecture as structured output.
187
212
  return c.json({ error: "refusal", detail: msg.stop_details }, 422);
188
213
  }
189
214
  if (!msg.parsed_output) return c.json({ error: "model returned no structured output" }, 502);
215
+ const output = SpecBundle.parse(msg.parsed_output);
190
216
  if (workspace) {
191
- const bundle = { ...msg.parsed_output, changeName: workspace.changeName };
217
+ const bundle = { ...output, changeName: workspace.changeName };
192
218
  workspace.writeBundle(bundle);
193
219
  return c.json(bundle);
194
220
  }
195
- return c.json(msg.parsed_output);
221
+ return c.json(output);
196
222
  });
197
223
  return app;
198
224
  }
@@ -245,7 +271,7 @@ var ChangeWorkspace = class {
245
271
  return null;
246
272
  }
247
273
  }
248
- saveScene(scene, title) {
274
+ saveScene(scene, title, model) {
249
275
  this.writeAtomic(
250
276
  DIAGRAM_FILE,
251
277
  JSON.stringify(
@@ -261,7 +287,11 @@ var ChangeWorkspace = class {
261
287
  2
262
288
  )
263
289
  );
264
- this.updateSidecar((s) => ({ ...s, ...title !== void 0 ? { title } : {} }));
290
+ this.updateSidecar((s) => ({
291
+ ...s,
292
+ ...title !== void 0 ? { title } : {},
293
+ ...model !== void 0 ? { model } : {}
294
+ }));
265
295
  }
266
296
  // ── Sidecar ──────────────────────────────────────────────────────────────
267
297
  readSidecar() {
@@ -1 +1 @@
1
- import{n as e}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import{m as t}from"./src-DpN7Pt3R.js";import"./chunk-WYO6CB5R-WOgWEZB2.js";import"./chunk-VAUOI2AC-C91DAhQB.js";import{n,r,t as i}from"./chunk-MOJQB5TN-CL2WAZ8d.js";import{t as a}from"./chunk-JWPE2WC7-DVXcaiue.js";import{E as o,t as s}from"./mermaid-parser.core-BB1spMEk.js";var c=o().RailroadAbnf.parser.LangiumParser,l=e(e=>{let t=e.alternatives.map(u);return t.length===1?t[0]:{type:`choice`,alternatives:t}},`transformAlternation`),u=e(e=>{let t=e.elements.map(f);return t.length===1?t[0]:{type:`sequence`,elements:t}},`transformConcatenation`),d=e(e=>{if(e.includes(`*`)){let[t,n]=e.split(`*`);return{min:t?parseInt(t,10):0,max:n?parseInt(n,10):1/0}}let t=parseInt(e,10);return{min:t,max:t}},`parseRepeat`),f=e(e=>{let t=p(e.primary);if(!e.repeat)return t;let{min:n,max:r}=d(e.repeat);return n===0&&r===1?{type:`optional`,element:t}:{type:`repetition`,element:t,min:n,max:r}},`transformElement`),p=e(e=>{switch(e.$type){case`AbnfStringLiteral`:return{type:`terminal`,value:e.value};case`AbnfNumVal`:return{type:`terminal`,value:e.value};case`AbnfRuleName`:return{type:`nonterminal`,name:e.name};case`AbnfGroup`:return l(e.element);case`AbnfOptionalGroup`:return{type:`optional`,element:l(e.element)};default:throw Error(`Unsupported ABNF primary node: ${e.$type}`)}},`transformPrimary`),m=e(e=>({name:e.name,definition:l(e.definition)}),`transformRule`),h=e(e=>{a(e,i),e.title&&i.setTitle(e.title),e.rules.map(e=>i.addRule(m(e)))},`populateDb`),g={parser:{parse:e(e=>{i.clear(),t.debug(`[ABNF Parser] Starting Langium parse`);let n=c.parse(e);if(n.lexerErrors.length>0||n.parserErrors.length>0)throw new s(n);let r=n.value;t.debug(`[ABNF Parser] Parsed rules:`,r.rules.length),h(r),t.debug(`[ABNF Parser] Parse complete`)},`parse`),parser:{yy:i}},db:i,renderer:r,styles:n};export{g as diagram};
1
+ import{n as e}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import{m as t}from"./src-DpN7Pt3R.js";import"./chunk-WYO6CB5R-rhSewh5r.js";import"./chunk-VAUOI2AC-B2lAp2X6.js";import{n,r,t as i}from"./chunk-MOJQB5TN-Cd67Wk3-.js";import{t as a}from"./chunk-JWPE2WC7-DVXcaiue.js";import{E as o,t as s}from"./mermaid-parser.core-BC7y6sOJ.js";var c=o().RailroadAbnf.parser.LangiumParser,l=e(e=>{let t=e.alternatives.map(u);return t.length===1?t[0]:{type:`choice`,alternatives:t}},`transformAlternation`),u=e(e=>{let t=e.elements.map(f);return t.length===1?t[0]:{type:`sequence`,elements:t}},`transformConcatenation`),d=e(e=>{if(e.includes(`*`)){let[t,n]=e.split(`*`);return{min:t?parseInt(t,10):0,max:n?parseInt(n,10):1/0}}let t=parseInt(e,10);return{min:t,max:t}},`parseRepeat`),f=e(e=>{let t=p(e.primary);if(!e.repeat)return t;let{min:n,max:r}=d(e.repeat);return n===0&&r===1?{type:`optional`,element:t}:{type:`repetition`,element:t,min:n,max:r}},`transformElement`),p=e(e=>{switch(e.$type){case`AbnfStringLiteral`:return{type:`terminal`,value:e.value};case`AbnfNumVal`:return{type:`terminal`,value:e.value};case`AbnfRuleName`:return{type:`nonterminal`,name:e.name};case`AbnfGroup`:return l(e.element);case`AbnfOptionalGroup`:return{type:`optional`,element:l(e.element)};default:throw Error(`Unsupported ABNF primary node: ${e.$type}`)}},`transformPrimary`),m=e(e=>({name:e.name,definition:l(e.definition)}),`transformRule`),h=e(e=>{a(e,i),e.title&&i.setTitle(e.title),e.rules.map(e=>i.addRule(m(e)))},`populateDb`),g={parser:{parse:e(e=>{i.clear(),t.debug(`[ABNF Parser] Starting Langium parse`);let n=c.parse(e);if(n.lexerErrors.length>0||n.parserErrors.length>0)throw new s(n);let r=n.value;t.debug(`[ABNF Parser] Parsed rules:`,r.rules.length),h(r),t.debug(`[ABNF Parser] Parse complete`)},`parse`),parser:{yy:i}},db:i,renderer:r,styles:n};export{g as diagram};
@@ -1,4 +1,4 @@
1
- import"./index-DZ_2V0y_.js";var e={paste:`لصق`,pasteAsPlaintext:`اللصق كنص عادي`,pasteCharts:`لصق الرسوم البيانية`,selectAll:`تحديد الكل`,multiSelect:`إضافة عنصر للتحديد`,moveCanvas:`نقل لوح الرسم`,cut:`قص`,copy:`نسخ`,copyAsPng:`نسخ إلى الحافظة بصيغة PNG`,copyAsSvg:`نسخ إلى الحافظة بصيغة SVG`,copyText:`نسخ إلى الحافظة كنص`,copySource:``,convertToCode:``,bringForward:`جلب للأمام`,sendToBack:`أرسل للخلف`,bringToFront:`أحضر للأمام`,sendBackward:`أرسل للخلف`,delete:`حذف`,copyStyles:`نسخ الأنماط`,pasteStyles:`لصق الأنماط`,stroke:`الخط`,background:`الخلفية`,fill:`التعبئة`,strokeWidth:`سُمك الخط`,strokeStyle:`نمط الخط`,strokeStyle_solid:`متصل`,strokeStyle_dashed:`متقطع`,strokeStyle_dotted:`منقط`,sloppiness:`الإمالة`,opacity:`الشفافية`,textAlign:`محاذاة النص`,edges:`الحواف`,sharp:`حادة`,round:`دائرية`,arrowheads:`رؤوس الأسهم`,arrowhead_none:`لا شيء`,arrowhead_arrow:`سهم`,arrowhead_bar:`شريط`,arrowhead_circle:``,arrowhead_circle_outline:``,arrowhead_triangle:`مثلث`,arrowhead_triangle_outline:``,arrowhead_diamond:``,arrowhead_diamond_outline:``,fontSize:`حجم الخط`,fontFamily:`نوع الخط`,addWatermark:`إضافة "مصنوعة بواسطة Excalidraw"`,handDrawn:`رسم باليد`,normal:`عادي`,code:`رمز`,small:`صغير`,medium:`متوسط`,large:`كبير`,veryLarge:`كبير جدا`,solid:`كامل`,hachure:`خطوط`,zigzag:`متعرج`,crossHatch:`خطوط متقطعة`,thin:`نحيف`,bold:`داكن`,left:`الـيسار`,center:`وسط`,right:`يمين`,extraBold:`عريض`,architect:`معماري`,artist:`رسام`,cartoonist:`كرتوني`,fileTitle:`إسم الملف`,colorPicker:`منتقي اللون`,canvasColors:`تستخدم على القماش`,canvasBackground:`خلفية اللوحة`,drawingCanvas:`لوحة الرسم`,layers:`الطبقات`,actions:`الإجراءات`,language:`اللغة`,liveCollaboration:`التعاون المباشر...`,duplicateSelection:`تكرار`,untitled:`غير معنون`,name:`الاسم`,yourName:`اسمك`,madeWithExcalidraw:`مصنوعة بواسطة Excalidraw`,group:`تحديد مجموعة`,ungroup:`إلغاء تحديد مجموعة`,collaborators:`المتعاونون`,showGrid:`إظهار الشبكة`,addToLibrary:`أضف إلى المكتبة`,removeFromLibrary:`حذف من المكتبة`,libraryLoadingMessage:`جارٍ تحميل المكتبة…`,libraries:`تصفح المكتبات`,loadingScene:`جاري تحميل المشهد…`,align:`محاذاة`,alignTop:`محاذاة إلى اﻷعلى`,alignBottom:`محاذاة إلى اﻷسفل`,alignLeft:`محاذاة إلى اليسار`,alignRight:`محاذاة إلى اليمين`,centerVertically:`توسيط عمودي`,centerHorizontally:`توسيط أفقي`,distributeHorizontally:`التوزيع الأفقي`,distributeVertically:`التوزيع عمودياً`,flipHorizontal:`قلب عامودي`,flipVertical:`قلب أفقي`,viewMode:`نمط العرض`,share:`مشاركة`,showStroke:`إظهار منتقي لون الخط`,showBackground:`إظهار منتقي لون الخلفية`,toggleTheme:`غير النمط`,personalLib:`المكتبة الشخصية`,excalidrawLib:`مكتبتنا`,decreaseFontSize:`تصغير حجم الخط`,increaseFontSize:`تكبير حجم الخط`,unbindText:`فك ربط النص`,bindText:`ربط النص بالحاوية`,createContainerFromText:`نص مغلف في حاوية`,link:{edit:`تعديل الرابط`,editEmbed:`تحرير الرابط وإدراجه`,create:`إنشاء رابط`,createEmbed:`إنشاء رابط و إدراجه`,label:`رابط`,labelEmbed:`رابط و إدراج`,empty:`لم يتم تعيين رابط`},lineEditor:{edit:`تحرير السطر`,exit:`الخروج من المُحرر`},elementLock:{lock:`قفل`,unlock:`فتح`,lockAll:`قفل الكل`,unlockAll:`فتح الكل`},statusPublished:`نُشر`,sidebarLock:`إبقاء الشريط الجانبي مفتوح`,selectAllElementsInFrame:`تحديد جميع العناصر في الإطار`,removeAllElementsFromFrame:`إزالة جميع العناصر من الإطار`,eyeDropper:`اختيار اللون من القماش`,textToDiagram:``,prompt:``},t={noItems:`لا توجد عناصر أضيفت بعد...`,hint_emptyLibrary:`حدد عنصر على القماش لإضافته هنا، أو تثبيت مكتبة من المستودع العام أدناه.`,hint_emptyPrivateLibrary:`حدد عنصر على القماش لإضافته هنا.`},n={clearReset:`إعادة تعيين اللوحة`,exportJSON:`صدر الملف`,exportImage:`تصدير الصورة...`,export:`حفظ إلى...`,copyToClipboard:`نسخ إلى الحافظة`,save:`احفظ للملف الحالي`,saveAs:`حفظ كـ`,load:`فتح`,getShareableLink:`احصل على رابط المشاركة`,close:`غلق`,selectLanguage:`اختر اللغة`,scrollBackToContent:`الرجوع إلى المحتوى`,zoomIn:`تكبير`,zoomOut:`تصغير`,resetZoom:`إعادة تعيين الشاشة`,menu:`القائمة`,done:`تم`,edit:`تعديل`,undo:`تراجع`,redo:`إعادة تنفيذ`,resetLibrary:`إعادة ضبط المكتبة`,createNewRoom:`إنشاء غرفة جديدة`,fullScreen:`شاشة كاملة`,darkMode:`الوضع المظلم`,lightMode:`الوضع المضيء`,zenMode:`وضع التأمل`,objectsSnapMode:`التقط إلى العناصر`,exitZenMode:`إلغاء الوضع الليلى`,cancel:`إلغاء`,clear:`مسح`,remove:`إزالة`,embed:`تبديل الإدراج`,publishLibrary:`انشر`,submit:`أرسل`,confirm:`تأكيد`,embeddableInteractionButton:`اضغط للتفاعل`},r={clearReset:`هذا سيُزيل كامل اللوحة. هل أنت متأكد؟`,couldNotCreateShareableLink:`تعذر إنشاء رابطة المشاركة.`,couldNotCreateShareableLinkTooBig:`تعذر إنشاء رابط قابل للمشاركة: المشهد كبير جدًا`,couldNotLoadInvalidFile:`تعذر التحميل، الملف غير صالح`,importBackendFailed:`فشل الاستيراد من الخادوم.`,cannotExportEmptyCanvas:`لا يمكن تصدير لوحة فارغة.`,couldNotCopyToClipboard:`تعذر النسخ إلى الحافظة.`,decryptFailed:`تعذر فك تشفير البيانات.`,uploadedSecurly:`تم تأمين التحميل بتشفير النهاية إلى النهاية، مما يعني أن خادوم Excalidraw والأطراف الثالثة لا يمكنها قراءة المحتوى.`,loadSceneOverridePrompt:`تحميل الرسم الخارجي سيحل محل المحتوى الموجود لديك. هل ترغب في المتابعة؟`,collabStopOverridePrompt:`إيقاف الجلسة سيؤدي إلى الكتابة فوق رسومك السابقة المخزنة داخليا. هل أنت متأكد؟
1
+ import"./index-BkkP6_3-.js";var e={paste:`لصق`,pasteAsPlaintext:`اللصق كنص عادي`,pasteCharts:`لصق الرسوم البيانية`,selectAll:`تحديد الكل`,multiSelect:`إضافة عنصر للتحديد`,moveCanvas:`نقل لوح الرسم`,cut:`قص`,copy:`نسخ`,copyAsPng:`نسخ إلى الحافظة بصيغة PNG`,copyAsSvg:`نسخ إلى الحافظة بصيغة SVG`,copyText:`نسخ إلى الحافظة كنص`,copySource:``,convertToCode:``,bringForward:`جلب للأمام`,sendToBack:`أرسل للخلف`,bringToFront:`أحضر للأمام`,sendBackward:`أرسل للخلف`,delete:`حذف`,copyStyles:`نسخ الأنماط`,pasteStyles:`لصق الأنماط`,stroke:`الخط`,background:`الخلفية`,fill:`التعبئة`,strokeWidth:`سُمك الخط`,strokeStyle:`نمط الخط`,strokeStyle_solid:`متصل`,strokeStyle_dashed:`متقطع`,strokeStyle_dotted:`منقط`,sloppiness:`الإمالة`,opacity:`الشفافية`,textAlign:`محاذاة النص`,edges:`الحواف`,sharp:`حادة`,round:`دائرية`,arrowheads:`رؤوس الأسهم`,arrowhead_none:`لا شيء`,arrowhead_arrow:`سهم`,arrowhead_bar:`شريط`,arrowhead_circle:``,arrowhead_circle_outline:``,arrowhead_triangle:`مثلث`,arrowhead_triangle_outline:``,arrowhead_diamond:``,arrowhead_diamond_outline:``,fontSize:`حجم الخط`,fontFamily:`نوع الخط`,addWatermark:`إضافة "مصنوعة بواسطة Excalidraw"`,handDrawn:`رسم باليد`,normal:`عادي`,code:`رمز`,small:`صغير`,medium:`متوسط`,large:`كبير`,veryLarge:`كبير جدا`,solid:`كامل`,hachure:`خطوط`,zigzag:`متعرج`,crossHatch:`خطوط متقطعة`,thin:`نحيف`,bold:`داكن`,left:`الـيسار`,center:`وسط`,right:`يمين`,extraBold:`عريض`,architect:`معماري`,artist:`رسام`,cartoonist:`كرتوني`,fileTitle:`إسم الملف`,colorPicker:`منتقي اللون`,canvasColors:`تستخدم على القماش`,canvasBackground:`خلفية اللوحة`,drawingCanvas:`لوحة الرسم`,layers:`الطبقات`,actions:`الإجراءات`,language:`اللغة`,liveCollaboration:`التعاون المباشر...`,duplicateSelection:`تكرار`,untitled:`غير معنون`,name:`الاسم`,yourName:`اسمك`,madeWithExcalidraw:`مصنوعة بواسطة Excalidraw`,group:`تحديد مجموعة`,ungroup:`إلغاء تحديد مجموعة`,collaborators:`المتعاونون`,showGrid:`إظهار الشبكة`,addToLibrary:`أضف إلى المكتبة`,removeFromLibrary:`حذف من المكتبة`,libraryLoadingMessage:`جارٍ تحميل المكتبة…`,libraries:`تصفح المكتبات`,loadingScene:`جاري تحميل المشهد…`,align:`محاذاة`,alignTop:`محاذاة إلى اﻷعلى`,alignBottom:`محاذاة إلى اﻷسفل`,alignLeft:`محاذاة إلى اليسار`,alignRight:`محاذاة إلى اليمين`,centerVertically:`توسيط عمودي`,centerHorizontally:`توسيط أفقي`,distributeHorizontally:`التوزيع الأفقي`,distributeVertically:`التوزيع عمودياً`,flipHorizontal:`قلب عامودي`,flipVertical:`قلب أفقي`,viewMode:`نمط العرض`,share:`مشاركة`,showStroke:`إظهار منتقي لون الخط`,showBackground:`إظهار منتقي لون الخلفية`,toggleTheme:`غير النمط`,personalLib:`المكتبة الشخصية`,excalidrawLib:`مكتبتنا`,decreaseFontSize:`تصغير حجم الخط`,increaseFontSize:`تكبير حجم الخط`,unbindText:`فك ربط النص`,bindText:`ربط النص بالحاوية`,createContainerFromText:`نص مغلف في حاوية`,link:{edit:`تعديل الرابط`,editEmbed:`تحرير الرابط وإدراجه`,create:`إنشاء رابط`,createEmbed:`إنشاء رابط و إدراجه`,label:`رابط`,labelEmbed:`رابط و إدراج`,empty:`لم يتم تعيين رابط`},lineEditor:{edit:`تحرير السطر`,exit:`الخروج من المُحرر`},elementLock:{lock:`قفل`,unlock:`فتح`,lockAll:`قفل الكل`,unlockAll:`فتح الكل`},statusPublished:`نُشر`,sidebarLock:`إبقاء الشريط الجانبي مفتوح`,selectAllElementsInFrame:`تحديد جميع العناصر في الإطار`,removeAllElementsFromFrame:`إزالة جميع العناصر من الإطار`,eyeDropper:`اختيار اللون من القماش`,textToDiagram:``,prompt:``},t={noItems:`لا توجد عناصر أضيفت بعد...`,hint_emptyLibrary:`حدد عنصر على القماش لإضافته هنا، أو تثبيت مكتبة من المستودع العام أدناه.`,hint_emptyPrivateLibrary:`حدد عنصر على القماش لإضافته هنا.`},n={clearReset:`إعادة تعيين اللوحة`,exportJSON:`صدر الملف`,exportImage:`تصدير الصورة...`,export:`حفظ إلى...`,copyToClipboard:`نسخ إلى الحافظة`,save:`احفظ للملف الحالي`,saveAs:`حفظ كـ`,load:`فتح`,getShareableLink:`احصل على رابط المشاركة`,close:`غلق`,selectLanguage:`اختر اللغة`,scrollBackToContent:`الرجوع إلى المحتوى`,zoomIn:`تكبير`,zoomOut:`تصغير`,resetZoom:`إعادة تعيين الشاشة`,menu:`القائمة`,done:`تم`,edit:`تعديل`,undo:`تراجع`,redo:`إعادة تنفيذ`,resetLibrary:`إعادة ضبط المكتبة`,createNewRoom:`إنشاء غرفة جديدة`,fullScreen:`شاشة كاملة`,darkMode:`الوضع المظلم`,lightMode:`الوضع المضيء`,zenMode:`وضع التأمل`,objectsSnapMode:`التقط إلى العناصر`,exitZenMode:`إلغاء الوضع الليلى`,cancel:`إلغاء`,clear:`مسح`,remove:`إزالة`,embed:`تبديل الإدراج`,publishLibrary:`انشر`,submit:`أرسل`,confirm:`تأكيد`,embeddableInteractionButton:`اضغط للتفاعل`},r={clearReset:`هذا سيُزيل كامل اللوحة. هل أنت متأكد؟`,couldNotCreateShareableLink:`تعذر إنشاء رابطة المشاركة.`,couldNotCreateShareableLinkTooBig:`تعذر إنشاء رابط قابل للمشاركة: المشهد كبير جدًا`,couldNotLoadInvalidFile:`تعذر التحميل، الملف غير صالح`,importBackendFailed:`فشل الاستيراد من الخادوم.`,cannotExportEmptyCanvas:`لا يمكن تصدير لوحة فارغة.`,couldNotCopyToClipboard:`تعذر النسخ إلى الحافظة.`,decryptFailed:`تعذر فك تشفير البيانات.`,uploadedSecurly:`تم تأمين التحميل بتشفير النهاية إلى النهاية، مما يعني أن خادوم Excalidraw والأطراف الثالثة لا يمكنها قراءة المحتوى.`,loadSceneOverridePrompt:`تحميل الرسم الخارجي سيحل محل المحتوى الموجود لديك. هل ترغب في المتابعة؟`,collabStopOverridePrompt:`إيقاف الجلسة سيؤدي إلى الكتابة فوق رسومك السابقة المخزنة داخليا. هل أنت متأكد؟
2
2
 
3
3
  (إذا كنت ترغب في الاحتفاظ برسمك المخزن داخليا، ببساطة أغلق علامة تبويب المتصفح بدلاً من ذلك.)`,errorAddingToLibrary:`تعذر إضافة العنصر للمكتبة`,errorRemovingFromLibrary:`تعذر إزالة العنصر من المكتبة`,confirmAddLibrary:`هذا سيضيف {{numShapes}} شكل إلى مكتبتك. هل أنت متأكد؟`,imageDoesNotContainScene:`يبدو أن هذه الصورة لا تحتوي على أي بيانات مشهد. هل قمت بتمكين تضمين المشهد أثناء التصدير؟`,cannotRestoreFromImage:`تعذر استعادة المشهد من ملف الصورة`,invalidSceneUrl:`تعذر استيراد المشهد من عنوان URL المتوفر. إما أنها مشوهة، أو لا تحتوي على بيانات Excalidraw JSON صالحة.`,resetLibrary:`هذا سوف يمسح مكتبتك. هل أنت متأكد؟`,removeItemsFromsLibrary:`حذف {{count}} عنصر (عناصر) من المكتبة؟`,invalidEncryptionKey:`مفتاح التشفير يجب أن يكون من 22 حرفاً. التعاون المباشر معطل.`,collabOfflineWarning:`لا يوجد اتصال بالانترنت.
4
4
  لن يتم حفظ التغييرات التي قمت بها!`},i={unsupportedFileType:`نوع الملف غير مدعوم.`,imageInsertError:`تعذر إدراج الصورة. حاول مرة أخرى لاحقاً...`,fileTooBig:`الملف كبير جداً. الحد الأقصى المسموح به للحجم هو {{maxSize}}.`,svgImageInsertError:`تعذر إدراج صورة SVG. يبدو أن ترميز SVG غير صحيح.`,failedToFetchImage:``,invalidSVGString:`SVG غير صالح.`,cannotResolveCollabServer:`تعذر الاتصال بخادم التعاون. الرجاء إعادة تحميل الصفحة والمحاولة مرة أخرى.`,importLibraryError:`تعذر تحميل المكتبة`,collabSaveFailed:`تعذر الحفظ في قاعدة البيانات. إذا استمرت المشاكل، يفضل أن تحفظ ملفك محليا كي لا تفقد عملك.`,collabSaveFailed_sizeExceeded:`تعذر الحفظ في قاعدة البيانات، يبدو أن القماش كبير للغاية، يفضّل حفظ الملف محليا كي لا تفقد عملك.`,imageToolNotSupported:``,brave_measure_text_error:{line1:`يبدو أنك تستخدم متصفح Brave مع إعداد <bold>حظر صارم لتتبع البصمة</bold>.`,line2:`قد يؤدي هذا إلى كسر <bold>عناصر النص</bold> في الرسومات الخاصة بك.`,line3:`من المستحسن إلغاء تفعيل هذا الإعداد. يمكنك اتباع <link>هذه الخطوات</link> لفعل ذلك.`,line4:`إذا لم يصلح تعطيل هذا الإعداد طريقة عرض النصوص، الرجاء كتابة <issueLink>بلاغ</issueLink> على حسابنا في GitHub، أو راسلنا على <discordLink>Discord</discordLink>`},libraryElementTypeError:{embeddable:`لا يمكن إضافة العناصر القابلة للتضمين في المكتبة.`,iframe:``,image:`سوف يتم دعم إضافة صور إلى المكتبة قريباً!`},asyncPasteFailedOnRead:``,asyncPasteFailedOnParse:``,copyToSystemClipboardFailed:``},a={selection:`تحديد`,image:`إدراج صورة`,rectangle:`مستطيل`,diamond:`مضلع`,ellipse:`دائرة`,arrow:`سهم`,line:`خط`,freedraw:`رسم`,text:`نص`,library:`مكتبة`,lock:`الحفاظ على أداة التحديد نشطة بعد الرسم`,penMode:`وضع القلم - امنع اللمس`,link:`إضافة/تحديث الرابط للشكل المحدد`,eraser:`ممحاة`,frame:`أداة الإطار`,magicframe:``,embeddable:`تضمين ويب`,laser:`مؤشر ليزر`,hand:`يد (أداة الإزاحة)`,extraTools:`المزيد من أﻷدوات`,mermaidToExcalidraw:``,magicSettings:``},o={canvasActions:`إجراءات اللوحة`,selectedShapeActions:`إجراءات الشكل المحدد`,shapes:`الأشكال`},s={canvasPanning:`لتحريك القماش، اضغط على عجلة الفأرة أو مفتاح المسافة أثناء السحب، أو استخدم أداة اليد`,linearElement:`انقر لبدء نقاط متعددة، اسحب لخط واحد`,freeDraw:`انقر واسحب، افرج عند الانتهاء`,text:`نصيحة: يمكنك أيضًا إضافة نص بالنقر المزدوج في أي مكان بأداة الاختيار`,embeddable:`اضغط مع السحب لإنشاء موقع ويب مضمّن`,text_selected:`انقر نقراً مزدوجاً أو اضغط ادخال لتعديل النص`,text_editing:`اضغط على Esc أو (Ctrl أو Cmd) + Enter لإنهاء التعديل`,linearElementMulti:`انقر فوق النقطة الأخيرة أو اضغط على Esc أو Enter للإنهاء`,lockAngle:`يمكنك تقييد الزاوية بالضغط على SHIFT`,resize:`يمكنك تقييد النسب بالضغط على SHIFT أثناء تغيير الحجم،
@@ -0,0 +1 @@
1
+ import"./chunk-KEIR6QF5-BfrZ3jm6.js";import{o as e}from"./mermaid-parser.core-BC7y6sOJ.js";export{e as createArchitectureServices};