@rafiqui987/markode 0.0.0-stage → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +480 -2
- package/dist/cli.js +2954 -0
- package/dist/web/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/dist/web/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/dist/web/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/dist/web/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/dist/web/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/dist/web/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/dist/web/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/dist/web/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/dist/web/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/dist/web/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/dist/web/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/dist/web/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/dist/web/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/dist/web/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/dist/web/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/dist/web/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/dist/web/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/dist/web/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/dist/web/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/dist/web/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/dist/web/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/dist/web/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/dist/web/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/dist/web/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/dist/web/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/dist/web/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/dist/web/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/dist/web/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/dist/web/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/dist/web/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/dist/web/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/dist/web/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/dist/web/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/dist/web/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/dist/web/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/dist/web/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/dist/web/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/dist/web/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/dist/web/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/dist/web/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/dist/web/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/dist/web/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/dist/web/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/dist/web/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/dist/web/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/dist/web/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/dist/web/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/dist/web/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/dist/web/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/dist/web/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/dist/web/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/dist/web/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/dist/web/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/dist/web/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/dist/web/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/dist/web/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/dist/web/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/dist/web/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/dist/web/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/dist/web/assets/abnfDiagram-WEYOIA3C-uyv195L6.js +1 -0
- package/dist/web/assets/apl-gfMMiTNf.js +1 -0
- package/dist/web/assets/arc-CnHtXLAe.js +1 -0
- package/dist/web/assets/architecture-WOLXFQ4H-tPJ2P-p7.js +1 -0
- package/dist/web/assets/architectureDiagram-ZHVYKT53-C-WCNTHv.js +36 -0
- package/dist/web/assets/array-BifhSqXX.js +1 -0
- package/dist/web/assets/asciiarmor-C_eisQCp.js +1 -0
- package/dist/web/assets/asn1-DCl_8MCW.js +1 -0
- package/dist/web/assets/asterisk-BEn0Cwpx.js +1 -0
- package/dist/web/assets/blockDiagram-RJAE7QA3-DRgAHQJ9.js +140 -0
- package/dist/web/assets/brainfuck-D5EjA2JK.js +1 -0
- package/dist/web/assets/c4Diagram-XDPPPE54-DBBsZpdC.js +38 -0
- package/dist/web/assets/channel-COq7V7WB.js +1 -0
- package/dist/web/assets/chunk-2E7WHVMD-CQSFul1o.js +88 -0
- package/dist/web/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
- package/dist/web/assets/chunk-4EMNKR2T-DHeQ05G5.js +1 -0
- package/dist/web/assets/chunk-55XCU76K-C9qNkR8H.js +1 -0
- package/dist/web/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
- package/dist/web/assets/chunk-7S6XSTFO-C_2BTQ4f.js +2 -0
- package/dist/web/assets/chunk-AQDTSKZB-DZLt6T8h.js +72 -0
- package/dist/web/assets/chunk-DSNLSHJZ-6EnWiUHw.js +129 -0
- package/dist/web/assets/chunk-DUW6YSOI-Dgx8z5s3.js +1 -0
- package/dist/web/assets/chunk-HAGFOTED-C4TrjvWC.js +62 -0
- package/dist/web/assets/chunk-HNE4Q36P-Bhz3xzgF.js +1 -0
- package/dist/web/assets/chunk-J5ZVWO5B-oDCd-gWO.js +1 -0
- package/dist/web/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- package/dist/web/assets/chunk-NGNAAXSQ-C2Wy9Xmz.js +136 -0
- package/dist/web/assets/chunk-NQOKRVIF-fn9o0p_a.js +213 -0
- package/dist/web/assets/chunk-UHW7PFBP-y_Cnbpso.js +1 -0
- package/dist/web/assets/chunk-VQ5W62QI-BDGHstYR.js +1 -0
- package/dist/web/assets/chunk-WQQL4CDK-DVgns4LS.js +10 -0
- package/dist/web/assets/chunk-XXDRQBXY-z-xFeaXQ.js +1 -0
- package/dist/web/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
- package/dist/web/assets/chunk-YZO67HFG-O3X4dDhT.js +1 -0
- package/dist/web/assets/chunk-ZAUX2LTX-dMpe16to.js +1 -0
- package/dist/web/assets/chunk-ZCHMQSOR-DmywVAUg.js +2 -0
- package/dist/web/assets/classDiagram-v2-4MYWR3UA-DNFxIeoH.js +217 -0
- package/dist/web/assets/clike-xvONpD0Z.js +1 -0
- package/dist/web/assets/clojure-BflJGmDX.js +1 -0
- package/dist/web/assets/cmake-84nbDH0I.js +1 -0
- package/dist/web/assets/cobol-DHLQUbN7.js +1 -0
- package/dist/web/assets/coffeescript-De_zI4J0.js +1 -0
- package/dist/web/assets/commonlisp-DgAKBe0r.js +1 -0
- package/dist/web/assets/cose-bilkent-JH36ORCC-C78U5xAn.js +1 -0
- package/dist/web/assets/crystal-Bsdphhtm.js +1 -0
- package/dist/web/assets/css-CnaYoQib.js +1 -0
- package/dist/web/assets/cynefin-EF2NZ3EQ-53hzJKH9.js +1 -0
- package/dist/web/assets/cynefinDiagram-WF24UDRP-D7qakSAO.js +62 -0
- package/dist/web/assets/cypher-p9eYesGn.js +1 -0
- package/dist/web/assets/cytoscape.esm-BegBNzOV.js +321 -0
- package/dist/web/assets/d-DWkQyNnU.js +1 -0
- package/dist/web/assets/dagre-NK4GIZVX-JnnDdmH0.js +4 -0
- package/dist/web/assets/defaultLocale-BFoDCU3G.js +1 -0
- package/dist/web/assets/diagram-CBK3MWTC-C9dCT7nt.js +24 -0
- package/dist/web/assets/diagram-I5XIIV2D-BODrA_Tz.js +24 -0
- package/dist/web/assets/diagram-ODIL2UCW-ByZtzdTi.js +30 -0
- package/dist/web/assets/diagram-PFBEJUXE-Dc3cgafk.js +3 -0
- package/dist/web/assets/diagram-RJA3I4VV-BnTNuzvk.js +41 -0
- package/dist/web/assets/diagram-TYUNFSNR-fbw92djE.js +200 -0
- package/dist/web/assets/diff-ChtP43wD.js +1 -0
- package/dist/web/assets/dist-8bzcdWlP.js +1 -0
- package/dist/web/assets/dist-BPKiY16E.js +2 -0
- package/dist/web/assets/dist-BeUBXLX5.js +1 -0
- package/dist/web/assets/dist-BfedOYsq.js +1 -0
- package/dist/web/assets/dist-BruzXrfs.js +1 -0
- package/dist/web/assets/dist-BwF8pAVO.js +1 -0
- package/dist/web/assets/dist-CAttduN3.js +1 -0
- package/dist/web/assets/dist-CC7LN-Hh.js +1 -0
- package/dist/web/assets/dist-CFUj2tCy.js +12 -0
- package/dist/web/assets/dist-CM1-Tp30.js +1 -0
- package/dist/web/assets/dist-CfeLR_Q4.js +1 -0
- package/dist/web/assets/dist-CrUcXP5H.js +1 -0
- package/dist/web/assets/dist-CubY9gnU.js +1 -0
- package/dist/web/assets/dist-D0R-qVeY.js +1 -0
- package/dist/web/assets/dist-D5EOvBuF.js +1 -0
- package/dist/web/assets/dist-DcGC8X1E.js +11 -0
- package/dist/web/assets/dist-EljmWMub.js +9 -0
- package/dist/web/assets/dist-ga2OvaLo.js +1 -0
- package/dist/web/assets/dist-tv7yScoP.js +1 -0
- package/dist/web/assets/dockerfile-DJkHQgkl.js +1 -0
- package/dist/web/assets/dtd-DTF72YNO.js +1 -0
- package/dist/web/assets/dylan-S7ucR4pR.js +1 -0
- package/dist/web/assets/ebnf-D4c0_ac3.js +1 -0
- package/dist/web/assets/ebnfDiagram-V4P3TTPT-DPsfv1uf.js +1 -0
- package/dist/web/assets/ecl-BVIeWmwY.js +1 -0
- package/dist/web/assets/eiffel-BEjRio4Q.js +1 -0
- package/dist/web/assets/elk-QONTBCTQ-DoINDZCB.js +27 -0
- package/dist/web/assets/elm-Cshzl8qu.js +1 -0
- package/dist/web/assets/erDiagram-KYQIGQAA-ChPWyTRi.js +99 -0
- package/dist/web/assets/erlang-BV0c4Hdn.js +1 -0
- package/dist/web/assets/eventmodeling-K75KTNOO-B1BhcpV6.js +1 -0
- package/dist/web/assets/factor-LKH5gN8L.js +1 -0
- package/dist/web/assets/fcl-ClOhbFR7.js +1 -0
- package/dist/web/assets/flowDiagram-IUGLLWBU-DZzMwlmj.js +1 -0
- package/dist/web/assets/forth-D6RzAl64.js +1 -0
- package/dist/web/assets/fortran-Bt6PBEDR.js +1 -0
- package/dist/web/assets/ganttDiagram-R7GPNTJY-BpChuBNI.js +292 -0
- package/dist/web/assets/gas-BHEdbvp9.js +1 -0
- package/dist/web/assets/gherkin-oBAE_ms0.js +1 -0
- package/dist/web/assets/gitGraph-VSP46ZUC-BhIFPres.js +1 -0
- package/dist/web/assets/gitGraphDiagram-PDYL7XHY-CHejLr2o.js +106 -0
- package/dist/web/assets/graphlib-DS17s2tU.js +1 -0
- package/dist/web/assets/groovy-CUpZ7dEl.js +1 -0
- package/dist/web/assets/haskell-BRsoo5mP.js +1 -0
- package/dist/web/assets/haxe-DjVOVvNP.js +1 -0
- package/dist/web/assets/http-CLVgA2GD.js +1 -0
- package/dist/web/assets/idl-BUZw3wgd.js +1 -0
- package/dist/web/assets/index-CQGURl2V.css +1 -0
- package/dist/web/assets/index-CafleYLD.js +132 -0
- package/dist/web/assets/info-OHQRW6UA-p_XOG9kY.js +1 -0
- package/dist/web/assets/infoDiagram-MVDRKAX5-BjEI8OE0.js +2 -0
- package/dist/web/assets/init-C-OQMol4.js +1 -0
- package/dist/web/assets/ishikawaDiagram-HPEHV2GE-B_7LEH0q.js +70 -0
- package/dist/web/assets/javascript-Bu8mWwtz.js +1 -0
- package/dist/web/assets/journeyDiagram-BOSHW7O7-DprR7PC1.js +139 -0
- package/dist/web/assets/julia-CQfgDRfP.js +1 -0
- package/dist/web/assets/kanban-definition-FNSA4HC5-Dgn1OKTQ.js +89 -0
- package/dist/web/assets/katex-B_JcIwqj.js +257 -0
- package/dist/web/assets/katex-DMqEsVPU.js +257 -0
- package/dist/web/assets/katex-Ngnvt50Q.css +1 -0
- package/dist/web/assets/line-CsP7ezWR.js +1 -0
- package/dist/web/assets/linear-DutM4-eX.js +1 -0
- package/dist/web/assets/livescript-BXxG0Yva.js +1 -0
- package/dist/web/assets/lua-DPCEkfD_.js +1 -0
- package/dist/web/assets/mathematica-u8YMmbU0.js +1 -0
- package/dist/web/assets/mbox-BEMVcqjs.js +1 -0
- package/dist/web/assets/mermaid-parser.core-CRHYFOhU.js +7 -0
- package/dist/web/assets/mermaid.core-C-ITLWC9.js +44 -0
- package/dist/web/assets/mindmap-definition-6OY57UG3-B3gANyDJ.js +98 -0
- package/dist/web/assets/mirc-C9zpzAZU.js +1 -0
- package/dist/web/assets/mllike-B45xgp2S.js +1 -0
- package/dist/web/assets/modelica-CqHI_q-D.js +1 -0
- package/dist/web/assets/mscgen-qgSLujhx.js +1 -0
- package/dist/web/assets/mumps-BSzj6Xyz.js +1 -0
- package/dist/web/assets/nginx-8H7HVH4w.js +1 -0
- package/dist/web/assets/nsis-viPvXFiq.js +1 -0
- package/dist/web/assets/ntriples-CzMBulkp.js +1 -0
- package/dist/web/assets/octave-D2Q8cUp1.js +1 -0
- package/dist/web/assets/ordinal-BDEzSJ7C.js +1 -0
- package/dist/web/assets/oz-BwTct_5T.js +1 -0
- package/dist/web/assets/packet-JDAUHWVQ-0H1cA20q.js +1 -0
- package/dist/web/assets/pascal-Dp_KdFgX.js +1 -0
- package/dist/web/assets/path-fybaL0A-.js +1 -0
- package/dist/web/assets/pegDiagram-ECIUJNBX-BUxriBaM.js +1 -0
- package/dist/web/assets/perl-BkSkiI9m.js +1 -0
- package/dist/web/assets/pie-XZMESJXO-CSOHv2zM.js +1 -0
- package/dist/web/assets/pieDiagram-GNMPY74T-B7B_ijMh.js +39 -0
- package/dist/web/assets/pig-AF4Hwhju.js +1 -0
- package/dist/web/assets/powershell-D8WpQPaX.js +1 -0
- package/dist/web/assets/properties-C357ku5U.js +1 -0
- package/dist/web/assets/protobuf-D1ij_kNL.js +1 -0
- package/dist/web/assets/pug-Dwd_FmgJ.js +1 -0
- package/dist/web/assets/puppet-BZyAS7I4.js +1 -0
- package/dist/web/assets/python-B_1Jd8HM.js +1 -0
- package/dist/web/assets/q-B9NhS7L_.js +1 -0
- package/dist/web/assets/quadrantDiagram-D57K4MC3-CuDX_hzm.js +7 -0
- package/dist/web/assets/r-CxDmU1I4.js +1 -0
- package/dist/web/assets/radar-ABXABTNO-Bhdhmyn3.js +1 -0
- package/dist/web/assets/railroad-I3PHUGI6-D8J0asfg.js +1 -0
- package/dist/web/assets/railroad-abnf-LNEFI6M7-DSkwXAS5.js +1 -0
- package/dist/web/assets/railroad-ebnf-DWYD2UWJ-CUA5ZluT.js +1 -0
- package/dist/web/assets/railroad-peg-JR7BVNR7-DOmtcJJ_.js +1 -0
- package/dist/web/assets/railroadDiagram-Y72NRBL7-Bfa59bDk.js +1 -0
- package/dist/web/assets/requirementDiagram-EQYSW5RA-TqWBSttg.js +84 -0
- package/dist/web/assets/rough.esm-Dy-Kn_BL.js +1 -0
- package/dist/web/assets/rpm-gpDK5sbt.js +1 -0
- package/dist/web/assets/ruby-ChfNwlCY.js +1 -0
- package/dist/web/assets/sankeyDiagram-SY24JHO5-DXW4vZ49.js +40 -0
- package/dist/web/assets/sas-C2OyD2Y6.js +1 -0
- package/dist/web/assets/scheme-D9qYN0V5.js +1 -0
- package/dist/web/assets/sequenceDiagram-BLEHNHQU-bR6akpDb.js +169 -0
- package/dist/web/assets/shell-DwuoZtxw.js +1 -0
- package/dist/web/assets/sieve-tLWDfEkZ.js +1 -0
- package/dist/web/assets/simple-mode-DXiLM1-G.js +1 -0
- package/dist/web/assets/sizeCapture-INFHLROL-3uHXrFqA.js +1 -0
- package/dist/web/assets/smalltalk-BLp5-jwC.js +1 -0
- package/dist/web/assets/solr-B78wSQJQ.js +1 -0
- package/dist/web/assets/sparql-Dz-mlCAC.js +1 -0
- package/dist/web/assets/spreadsheet-CTIncYxj.js +1 -0
- package/dist/web/assets/sql-DuQMFDvy.js +1 -0
- package/dist/web/assets/src-DWy4o1sh.js +1 -0
- package/dist/web/assets/stateDiagram-v2-A6IESKWZ-G-L9fY1U.js +291 -0
- package/dist/web/assets/stex-DNzd62Q_.js +1 -0
- package/dist/web/assets/stylus-BOVgKnng.js +1 -0
- package/dist/web/assets/swift-DKB6_1j6.js +1 -0
- package/dist/web/assets/swimlanes-B3ENRKFQ-Bvz0uaIY.js +1 -0
- package/dist/web/assets/swimlanesDiagram-AYQRV4AK-D8Xb8aOe.js +8 -0
- package/dist/web/assets/tcl-BGfruO1u.js +1 -0
- package/dist/web/assets/textile-C4jVoHG1.js +1 -0
- package/dist/web/assets/tiddlywiki-VlUiK86J.js +1 -0
- package/dist/web/assets/tiki-DTszW0OQ.js +1 -0
- package/dist/web/assets/timeline-definition-JXYKGLGB-CLuowMKW.js +120 -0
- package/dist/web/assets/toml-BPTmHmyx.js +1 -0
- package/dist/web/assets/treeView-D4JQ5SDB-P9KKVCsV.js +1 -0
- package/dist/web/assets/treemap-SAJKECNS-CJHxQeBA.js +1 -0
- package/dist/web/assets/troff-C2dAgh7P.js +1 -0
- package/dist/web/assets/ttcn-PPSTk1ow.js +1 -0
- package/dist/web/assets/ttcn-cfg-2b4Gb5sE.js +1 -0
- package/dist/web/assets/turtle-Cx3rYX2g.js +1 -0
- package/dist/web/assets/usecaseDiagram-WPOLBNNX-Dp-yumhB.js +328 -0
- package/dist/web/assets/vb-BthdM_4N.js +1 -0
- package/dist/web/assets/vbscript-D9f6rSsU.js +1 -0
- package/dist/web/assets/velocity-CqftRsjg.js +1 -0
- package/dist/web/assets/vennDiagram-Q3Y3IDCW-WYfAKKah.js +34 -0
- package/dist/web/assets/verilog-CjI9Y6RI.js +1 -0
- package/dist/web/assets/vhdl-kS471soi.js +1 -0
- package/dist/web/assets/wardley-7MLQ67FV-16kL0OjA.js +1 -0
- package/dist/web/assets/wardleyDiagram-IVAIDKWA-CKpO66Ll.js +78 -0
- package/dist/web/assets/webidl-D5jiJvOU.js +1 -0
- package/dist/web/assets/xquery-BKJx4mf9.js +1 -0
- package/dist/web/assets/xychartDiagram-4URNHDU4-BAlKKoEI.js +7 -0
- package/dist/web/assets/yacas-CXXgtw0p.js +1 -0
- package/dist/web/assets/z80-Co3PbHdE.js +1 -0
- package/dist/web/index.html +17 -0
- package/package.json +83 -3
- package/templates/main.md +5 -0
- package/templates/method/area/docs/tasks/.gitkeep +0 -0
- package/templates/method/area-main.md +9 -0
- package/templates/method/root/docs/tasks/_TEMPLATE.md +28 -0
- package/templates/method/skills/markode-close-session/SKILL.md +20 -0
- package/templates/method/skills/markode-method/SKILL.md +68 -0
- package/templates/method/skills/markode-method/templates/architecture-topic.md +12 -0
- package/templates/method/skills/markode-method/templates/phase.md +22 -0
- package/templates/method/skills/markode-method/templates/project-architecture.md +14 -0
- package/templates/method/skills/markode-method/templates/vision.md +22 -0
- package/templates/method/skills/markode-new-task/SKILL.md +22 -0
- package/templates/method/skills/markode-status/SKILL.md +24 -0
- package/templates/proposals/SKILL.md +139 -0
- package/templates/rules/ask-before-commit.md +4 -0
- package/templates/rules/ask-new-dependencies.md +4 -0
- package/templates/rules/ask-when-unclear.md +4 -0
- package/templates/rules/match-conventions.md +4 -0
- package/templates/rules/minimal-changes.md +4 -0
- package/templates/rules/protect-secrets.md +4 -0
- package/templates/rules/tests-with-changes.md +4 -0
- package/templates/rules/update-docs.md +4 -0
- package/templates/rules/verify-before-done.md +4 -0
- package/templates/sdd/openspec/openspec/README.md +89 -0
- package/templates/sdd/openspec/openspec/changes/archive/.gitkeep +0 -0
- package/templates/sdd/openspec/openspec/config.yaml +12 -0
- package/templates/sdd/openspec/openspec/specs/.gitkeep +0 -0
- package/templates/sdd/speckit/.specify/memory/constitution.md +30 -0
- package/templates/sdd/speckit/specs/README.md +82 -0
- package/templates/skill/SKILL.md +109 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: task
|
|
3
|
+
id: <ID>
|
|
4
|
+
status: pending
|
|
5
|
+
area: <area>
|
|
6
|
+
phase: <number>
|
|
7
|
+
depends: []
|
|
8
|
+
created: YYYY-MM-DD
|
|
9
|
+
updated: YYYY-MM-DD
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# <ID> · <Title>
|
|
13
|
+
|
|
14
|
+
## Goal
|
|
15
|
+
|
|
16
|
+
<!-- One or two sentences: what is true when this task is done. -->
|
|
17
|
+
|
|
18
|
+
## Acceptance criteria
|
|
19
|
+
|
|
20
|
+
- [ ]
|
|
21
|
+
|
|
22
|
+
## Next step
|
|
23
|
+
|
|
24
|
+
<!-- One or two actionable lines; a new session starts here. -->
|
|
25
|
+
|
|
26
|
+
## Log (newest first)
|
|
27
|
+
|
|
28
|
+
- YYYY-MM-DD: created.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: markode-close-session
|
|
3
|
+
description: Closes a work session in a project that follows the markode method, recording what was done and the next step of every task touched, and updating phases.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Close the session (markode method)
|
|
7
|
+
|
|
8
|
+
1. Identify the tasks worked on in this session.
|
|
9
|
+
2. For each one, in its file:
|
|
10
|
+
- Add a log entry at the top of "Log": date, what was done, key files and decisions.
|
|
11
|
+
- Rewrite "Next step" in one or two actionable lines (for `blocked`: what it waits on).
|
|
12
|
+
- Tick the acceptance criteria that are met; set `status` and `updated` in the frontmatter.
|
|
13
|
+
3. If a task is `done`, tick it in its phase (`docs/phases/NN-*.md`). When every task and every item
|
|
14
|
+
of "Definition of done" is ticked, set the phase to `status: done`; when the first task starts,
|
|
15
|
+
set it to `in-progress`. Update `updated`.
|
|
16
|
+
4. If an architecture decision was made or changed, update it in its one place (the project's
|
|
17
|
+
`docs/ARCHITECTURE.md` or the root `docs/architecture/`; create it from the `markode-method`
|
|
18
|
+
templates if it doesn't exist yet), never in the main doc.
|
|
19
|
+
5. Run `/markode sync` (the docs check of the `markode` skill) and fix what it reports.
|
|
20
|
+
6. Summarize for the user in three lines: what was done, the next step, and anything open.
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: markode-method
|
|
3
|
+
description: Where each kind of project knowledge goes in the markode method (vision, architecture, phases, tasks), when to create each doc, and templates for them. Use before creating, moving or growing a doc under docs/, or when a decision, a goal or a milestone needs writing down.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# The markode method
|
|
7
|
+
|
|
8
|
+
The docs are a **map and a memory**, not an encyclopedia. Write only what nobody can learn from the
|
|
9
|
+
code: decisions and their reasons, conventions that aren't visible, and the state of the work. The main
|
|
10
|
+
doc (`CLAUDE.md` or `AGENTS.md`) is the map: it says where things are, never what they say.
|
|
11
|
+
|
|
12
|
+
## Where things go
|
|
13
|
+
|
|
14
|
+
| What | Where | Create it when |
|
|
15
|
+
|---|---|---|
|
|
16
|
+
| Vision | `docs/vision.md` | the user says what the project is for, for whom, or what is out of scope |
|
|
17
|
+
| Shared architecture | `docs/architecture/<topic>.md` | a technology or design decision affects the whole repository (or several projects) |
|
|
18
|
+
| Architecture of one project (monorepo) | `<project>/docs/ARCHITECTURE.md` | a decision affects only that project |
|
|
19
|
+
| Phases | `docs/phases/NN-name.md` | the user plans a milestone made of several tasks |
|
|
20
|
+
| Tasks | `docs/tasks/<ID>-slug.md`, or `<project>/docs/tasks/` in a monorepo | the user asks for one (`/markode-new-task`) |
|
|
21
|
+
|
|
22
|
+
A task's status lives only in its frontmatter: there is no index to keep in sync. `/markode-status` and
|
|
23
|
+
the markode Dashboard list tasks by status.
|
|
24
|
+
|
|
25
|
+
To create one, copy its template from `templates/` next to this file (`vision.md`,
|
|
26
|
+
`architecture-topic.md`, `project-architecture.md`, `phase.md`), replace the `<placeholders>` and set
|
|
27
|
+
`updated` to today. When `docs/architecture/` gets a second file, add a `README.md` there with one line
|
|
28
|
+
per file.
|
|
29
|
+
|
|
30
|
+
## By kind of project
|
|
31
|
+
|
|
32
|
+
The main doc says what kind of project this is ("This project", or the "Kind" column of the "Projects"
|
|
33
|
+
table) and where that kind's docs go. Follow it; these are the usual ones:
|
|
34
|
+
|
|
35
|
+
| Kind | Docs it needs (created when there is something to write) |
|
|
36
|
+
|---|---|
|
|
37
|
+
| App | vision, architecture by topic, phases |
|
|
38
|
+
| Library / package | public API and versioning (`docs/architecture/api.md`); `CHANGELOG.md` if published; phases only for planned milestones |
|
|
39
|
+
| Microservices | contracts (APIs, events) as shared architecture (`docs/architecture/contracts.md`); a contract change gets a task in every consumer |
|
|
40
|
+
| Mobile app | release and store decisions (`docs/architecture/releases.md`) |
|
|
41
|
+
| Data / ML | datasets: source, location, schema (`docs/architecture/data.md`); an experiment log |
|
|
42
|
+
| Infrastructure | environments, one runbook per operation (`docs/runbooks/`) |
|
|
43
|
+
|
|
44
|
+
If the main doc lists "Existing docs", they are the official ones: update them instead of creating
|
|
45
|
+
new docs that would repeat them.
|
|
46
|
+
|
|
47
|
+
## What not to write
|
|
48
|
+
|
|
49
|
+
- What the code already says: folder listings, dependency lists, what a function does.
|
|
50
|
+
- Generic advice ("write clean code", "handle errors properly").
|
|
51
|
+
- The same fact twice: link to the one place where it lives.
|
|
52
|
+
- Empty sections or docs "to fill later": create a doc when there is something real to put in it.
|
|
53
|
+
- Decisions or task lists in the main doc: it only points to them.
|
|
54
|
+
|
|
55
|
+
## Task statuses
|
|
56
|
+
|
|
57
|
+
| status | meaning |
|
|
58
|
+
|---|---|
|
|
59
|
+
| `pending` | defined, not started |
|
|
60
|
+
| `in-progress` | being worked on; a new session resumes from its "Next step" |
|
|
61
|
+
| `blocked` | waiting on something; "Next step" says what |
|
|
62
|
+
| `done` | every acceptance criterion is met |
|
|
63
|
+
|
|
64
|
+
## Phases
|
|
65
|
+
|
|
66
|
+
- A phase lists its tasks as a checklist; tick a task there when it becomes `done`.
|
|
67
|
+
- `status: in-progress` when its first task starts; `done` when every task and every item of
|
|
68
|
+
"Definition of done" is ticked.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: phase
|
|
3
|
+
phase: <N>
|
|
4
|
+
status: pending
|
|
5
|
+
updated: YYYY-MM-DD
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Phase <N> · <Name>
|
|
9
|
+
|
|
10
|
+
## Goal
|
|
11
|
+
|
|
12
|
+
<!-- One or two sentences: what works at the end of this phase. -->
|
|
13
|
+
|
|
14
|
+
## Tasks
|
|
15
|
+
|
|
16
|
+
Tick a task here when its status becomes `done`.
|
|
17
|
+
|
|
18
|
+
- [ ] [<ID>](<relative path to the task>) <title>
|
|
19
|
+
|
|
20
|
+
## Definition of done
|
|
21
|
+
|
|
22
|
+
- [ ]
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: architecture
|
|
3
|
+
area: <project folder>
|
|
4
|
+
updated: YYYY-MM-DD
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# <project> · Architecture
|
|
8
|
+
|
|
9
|
+
Decisions that only affect this project. Decisions shared with other projects live in the root
|
|
10
|
+
`docs/architecture/`.
|
|
11
|
+
|
|
12
|
+
| Topic | Decision | Why |
|
|
13
|
+
|---|---|---|
|
|
14
|
+
| | | |
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: vision
|
|
3
|
+
updated: YYYY-MM-DD
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Vision
|
|
7
|
+
|
|
8
|
+
## What
|
|
9
|
+
|
|
10
|
+
<!-- One paragraph: what the project is. -->
|
|
11
|
+
|
|
12
|
+
## For whom
|
|
13
|
+
|
|
14
|
+
<!-- Who uses it and what problem it solves for them. -->
|
|
15
|
+
|
|
16
|
+
## Goals
|
|
17
|
+
|
|
18
|
+
- <!-- A measurable outcome, e.g. "a new order takes under a minute" -->
|
|
19
|
+
|
|
20
|
+
## Out of scope
|
|
21
|
+
|
|
22
|
+
- <!-- What this project will not do, to keep it focused -->
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: markode-new-task
|
|
3
|
+
description: Creates a task file in this project's docs (the markode method) when the user asks for a new task. Uses the task template and the next ID of the project, and adds the task to its phase.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# New task (markode method)
|
|
7
|
+
|
|
8
|
+
Create tasks only when the user asks; you may propose them first.
|
|
9
|
+
|
|
10
|
+
1. Gather what is missing, in one question: title, goal, project (in a monorepo: the "Projects" table
|
|
11
|
+
in the root main doc lists them and their prefixes), phase, and dependencies.
|
|
12
|
+
2. Folder and prefix: the project's `docs/tasks/` with its prefix; tasks across projects, or in a
|
|
13
|
+
single project, go in the root `docs/tasks/` with the prefix the root main doc gives (`T` by default).
|
|
14
|
+
3. Next ID: the highest `<PREFIX>-NNN` in that folder + 1, three digits.
|
|
15
|
+
4. Copy the root `docs/tasks/_TEMPLATE.md` to `<folder>/<ID>-<short-slug>.md`. Fill the frontmatter
|
|
16
|
+
(`id`, `status: pending`, `area`, `phase`, `depends`, `created` and `updated` = today), the title,
|
|
17
|
+
the goal and the acceptance criteria as a checklist. The frontmatter is the only place the status
|
|
18
|
+
lives: there is no task index to update.
|
|
19
|
+
5. If it belongs to a phase, add `- [ ] [<ID>](<relative path>) <title>` under "Tasks" in
|
|
20
|
+
`docs/phases/NN-*.md` (create the phase from the `markode-method` template if the user is planning
|
|
21
|
+
a new one).
|
|
22
|
+
6. Show the task to the user. Do not start working on it until they say so.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: markode-status
|
|
3
|
+
description: Summarizes where the work stands in a project that follows the markode method - what was touched last, what is in progress, blocked and pending - grouped by project in a monorepo. Use when the user asks what is pending, where things stand, what is left, or what was done last time.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Status (markode method)
|
|
7
|
+
|
|
8
|
+
Answer from the task files, not by exploring the code.
|
|
9
|
+
|
|
10
|
+
1. **Task folders**: `docs/tasks/` and, in a monorepo, each `<project>/docs/tasks/` from the "Projects"
|
|
11
|
+
table of the root main doc. Read only each file's frontmatter (`id`, `status`, `phase`, `depends`,
|
|
12
|
+
`updated`) and its title; skip `_TEMPLATE.md`. For example:
|
|
13
|
+
`grep -H -E "^(id|status|phase|depends|updated):|^# " docs/tasks/*.md apps/*/docs/tasks/*.md`
|
|
14
|
+
2. **Last session**: the tasks with the most recent `updated`. If git is available, also
|
|
15
|
+
`git log --since=<that date> --name-only --format="%h %s"` to see which projects changed, including
|
|
16
|
+
changes no task covers.
|
|
17
|
+
3. **Next steps**: for `in-progress` and `blocked` tasks only, read their "Next step" section.
|
|
18
|
+
4. **Answer** in this order, grouped by project (shared work first), one line per task:
|
|
19
|
+
- **Last session**: the projects and tasks touched.
|
|
20
|
+
- **In progress**: `ID · title` — next step.
|
|
21
|
+
- **Blocked**: `ID · title` — what it waits on.
|
|
22
|
+
- **Pending**: how many; list the next ones (lowest phase first) whose `depends` are all `done`.
|
|
23
|
+
- **Without a task**: recent changes no task covers, if any.
|
|
24
|
+
5. Don't open other docs unless the user asks to go deeper. End by asking which task to continue.
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: markode-proposals
|
|
3
|
+
description: Write temporary proposals the user answers in markode (options with ASCII or Mermaid diagrams, choices to tick, comments like in Word), then apply their answer to every affected doc and archive the proposal. Use when an answer would be long or has options or a design to validate, when the user asks for a proposal, or when they say a proposal is answered.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Proposals (markode)
|
|
7
|
+
|
|
8
|
+
A proposal is a **temporary** file for one decision. Write one instead of a chat answer when:
|
|
9
|
+
|
|
10
|
+
- the answer would be long, or has several options, diagrams or a design to validate; or
|
|
11
|
+
- the user asks for a proposal.
|
|
12
|
+
|
|
13
|
+
For a short answer or a single obvious option, just answer in the chat.
|
|
14
|
+
|
|
15
|
+
After writing the file:
|
|
16
|
+
|
|
17
|
+
1. If a task waits on this decision, set it to `status: blocked` with "Next step: waiting on proposal
|
|
18
|
+
<path>".
|
|
19
|
+
2. Start `markode wait <path>` **in the background** (in Claude Code, a background Bash command: you are
|
|
20
|
+
notified when it exits). It waits, without using tokens, until the user presses "Done, send my
|
|
21
|
+
answer" in markode, then prints their answer: choices, open questions, comments waiting for a reply,
|
|
22
|
+
affected docs and your "After your answer" list. If you can't run background commands, skip it: the
|
|
23
|
+
user will tell you, or the next `/markode sync` finds the answered proposal.
|
|
24
|
+
3. Tell the user the path in one line and that you will continue when they answer. Meanwhile, keep
|
|
25
|
+
working on anything that doesn't depend on the decision.
|
|
26
|
+
|
|
27
|
+
When the watcher's output arrives, go straight to "When the user answers". Once applied, the decision
|
|
28
|
+
lives in the docs it affects and the proposal is archived.
|
|
29
|
+
|
|
30
|
+
**Archived proposals**: an applied proposal moves to an `applied/` folder next to it (e.g.
|
|
31
|
+
`docs/proposals/applied/`). It is kept only for the user to look back at: never read, search or cite
|
|
32
|
+
anything in an `applied/` folder of proposals, and don't treat it as current, unless the user asks
|
|
33
|
+
about a past proposal. markode hides it too.
|
|
34
|
+
|
|
35
|
+
## Where
|
|
36
|
+
|
|
37
|
+
{{where}}.
|
|
38
|
+
|
|
39
|
+
## Format
|
|
40
|
+
|
|
41
|
+
````md
|
|
42
|
+
---
|
|
43
|
+
type: proposal
|
|
44
|
+
status: open # open → answered (set by the user in markode) → applied (archived)
|
|
45
|
+
updated: YYYY-MM-DD
|
|
46
|
+
affects: [docs/tasks/T-004-login.md, docs/architecture/auth.md] # docs the decision will change
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
# Proposal: <topic>
|
|
50
|
+
|
|
51
|
+
## Context
|
|
52
|
+
|
|
53
|
+
<!-- Two or three lines: what needs deciding and why now. -->
|
|
54
|
+
|
|
55
|
+
## Option A: <name> (recommended)
|
|
56
|
+
|
|
57
|
+
```text
|
|
58
|
+
Browser ──REST──▶ Gateway ──gRPC──▶ Users ──▶ (Postgres)
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
What it means, pros and cons in a few bullets.
|
|
62
|
+
|
|
63
|
+
## Option B: <name>
|
|
64
|
+
|
|
65
|
+
```mermaid
|
|
66
|
+
flowchart LR
|
|
67
|
+
Browser --> Users --> DB[(Postgres)]
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Your choice
|
|
71
|
+
|
|
72
|
+
<!-- choose: one -->
|
|
73
|
+
- [ ] A: <name>
|
|
74
|
+
- [ ] B: <name>
|
|
75
|
+
|
|
76
|
+
## Also include
|
|
77
|
+
|
|
78
|
+
- [ ] <optional extra the user can tick>
|
|
79
|
+
|
|
80
|
+
## After your answer
|
|
81
|
+
|
|
82
|
+
- <what you will do with each possible choice, so any session can continue from here>
|
|
83
|
+
|
|
84
|
+
## Open questions
|
|
85
|
+
|
|
86
|
+
1. <question>
|
|
87
|
+
|
|
88
|
+
<!-- choose: one -->
|
|
89
|
+
- [ ] <answer>
|
|
90
|
+
- [ ] <answer>
|
|
91
|
+
````
|
|
92
|
+
|
|
93
|
+
- Diagrams: a ` ```text ` block with box-drawing characters for small sketches, ` ```mermaid ` for
|
|
94
|
+
flows and sequences. markode renders both.
|
|
95
|
+
- In ASCII diagrams use only single-width characters (box drawing `┌─┐│└┘▶`, letters, `#`, `-`); shading
|
|
96
|
+
blocks like `▓░` are wider in many fonts and break the alignment.
|
|
97
|
+
- `<!-- choose: one -->` right before a checklist makes it single choice in markode (radio buttons);
|
|
98
|
+
without it, any number can be ticked.
|
|
99
|
+
- Put your recommendation first and say why.
|
|
100
|
+
|
|
101
|
+
## Comments
|
|
102
|
+
|
|
103
|
+
The user comments like in Word. A comment is an HTML comment right after the block it refers to,
|
|
104
|
+
indented like that block (inside a list item: aligned with the item's text):
|
|
105
|
+
|
|
106
|
+
```md
|
|
107
|
+
- [x] A: gateway validates
|
|
108
|
+
<!-- comment by Rafael, 2026-10-22, on "gateway validates": What if the gateway goes down? -->
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Answer each comment with a reply right below it (or below the last reply), same indentation:
|
|
112
|
+
|
|
113
|
+
```md
|
|
114
|
+
<!-- reply by AI, 2026-10-22: Two Cloud Run instances minimum; added to the architecture. -->
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Never delete or rewrite the user's comments: they resolve them in markode. Never put `-->` inside a
|
|
118
|
+
comment's text. Comments in other docs reach you while you work (`markode changes`, see the markode
|
|
119
|
+
skill).
|
|
120
|
+
|
|
121
|
+
- `affects`: the docs that depend on this decision (tasks, phases, architecture, vision, other
|
|
122
|
+
proposals…), so the user sees what their choice will change.
|
|
123
|
+
|
|
124
|
+
## When the user answers
|
|
125
|
+
|
|
126
|
+
1. Read the ticked options, the open questions and every comment without a reply from you.
|
|
127
|
+
2. If something is unclear or a comment raises a new question, reply to that comment, set
|
|
128
|
+
`status: open` again, tell the user what you need, and start `markode wait` again. Don't apply
|
|
129
|
+
anything yet.
|
|
130
|
+
3. Otherwise apply the decision to every doc that depends on it: the ones in `affects` and any other
|
|
131
|
+
you find (a task's goal or acceptance criteria, a phase's task list, an architecture table, the
|
|
132
|
+
vision…). Record it in its one place: in the markode method, the architecture file for design
|
|
133
|
+
decisions, and a line in the log of the task it belongs to (`<date>: decided <what> (proposal
|
|
134
|
+
<name>)`).
|
|
135
|
+
4. Archive the proposal: set `status: applied` and `updated`, and move the file to the `applied/` folder
|
|
136
|
+
next to it (create it if needed; keep the file name). The decision now lives in those docs. A task
|
|
137
|
+
that was `blocked` on it goes back to `in-progress`, with its next step from your "After your
|
|
138
|
+
answer" list.
|
|
139
|
+
5. Tell the user in a few lines what you changed and where, then continue with that task.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# OpenSpec guide
|
|
2
|
+
|
|
3
|
+
This project uses [OpenSpec](https://github.com/Fission-AI/OpenSpec): agree on **what** to build in
|
|
4
|
+
Markdown before writing code, so you and the AI work from the same spec.
|
|
5
|
+
|
|
6
|
+
## Structure
|
|
7
|
+
|
|
8
|
+
```tree
|
|
9
|
+
openspec/
|
|
10
|
+
config.yaml # project context and rules for the AI (edit in your code editor)
|
|
11
|
+
specs/ # how the system behaves TODAY, one folder per domain
|
|
12
|
+
auth/
|
|
13
|
+
spec.md
|
|
14
|
+
changes/ # proposed work, one folder per change
|
|
15
|
+
add-2fa/
|
|
16
|
+
proposal.md # why and what
|
|
17
|
+
design.md # how (optional, for non-trivial changes)
|
|
18
|
+
tasks.md # checklist the AI works through
|
|
19
|
+
specs/auth/spec.md # delta: requirements added, modified or removed
|
|
20
|
+
archive/ # finished changes, dated
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Lifecycle
|
|
24
|
+
|
|
25
|
+
```mermaid
|
|
26
|
+
flowchart LR
|
|
27
|
+
Propose[Propose a change] --> Review[Review proposal, specs and tasks]
|
|
28
|
+
Review --> Apply[Apply: implement the tasks]
|
|
29
|
+
Apply --> Archive[Archive: deltas merge into specs/]
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
| Step | Command (if OpenSpec is installed) | Or ask the AI |
|
|
33
|
+
|---|---|---|
|
|
34
|
+
| Explore an idea | `/opsx:explore` | "Let's think through X before proposing anything." |
|
|
35
|
+
| Propose | `/opsx:propose add 2FA` | "Create an OpenSpec change `add-2fa` with proposal, tasks and spec deltas." |
|
|
36
|
+
| Implement | `/opsx:apply` | "Implement the tasks of `add-2fa`, ticking each one." |
|
|
37
|
+
| Finish | `/opsx:archive` | "Archive `add-2fa` and merge its deltas into `openspec/specs/`." |
|
|
38
|
+
|
|
39
|
+
## Examples
|
|
40
|
+
|
|
41
|
+
**`changes/add-2fa/proposal.md`**
|
|
42
|
+
|
|
43
|
+
```md
|
|
44
|
+
# Proposal: Add two-factor authentication
|
|
45
|
+
|
|
46
|
+
## Why
|
|
47
|
+
Accounts are protected by a password only.
|
|
48
|
+
|
|
49
|
+
## What changes
|
|
50
|
+
- Users can enable TOTP codes from their settings.
|
|
51
|
+
- Login asks for the code when 2FA is enabled.
|
|
52
|
+
|
|
53
|
+
## Out of scope
|
|
54
|
+
- SMS codes.
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**`changes/add-2fa/specs/auth/spec.md`** (delta)
|
|
58
|
+
|
|
59
|
+
```md
|
|
60
|
+
## ADDED Requirements
|
|
61
|
+
|
|
62
|
+
### Requirement: Two-factor login
|
|
63
|
+
The system SHALL ask for a one-time code after the password when 2FA is enabled.
|
|
64
|
+
|
|
65
|
+
#### Scenario: Valid code
|
|
66
|
+
- **WHEN** the user enters a valid code
|
|
67
|
+
- **THEN** they are logged in
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**`changes/add-2fa/tasks.md`**
|
|
71
|
+
|
|
72
|
+
```md
|
|
73
|
+
## 1. Backend
|
|
74
|
+
- [ ] 1.1 Store the TOTP secret per user
|
|
75
|
+
- [ ] 1.2 Verify codes on login
|
|
76
|
+
|
|
77
|
+
## 2. Frontend
|
|
78
|
+
- [ ] 2.1 Settings screen to enable 2FA
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Installing OpenSpec
|
|
82
|
+
|
|
83
|
+
The `/opsx:*` commands come from the OpenSpec CLI. If they are missing, install it (needs Node.js) and
|
|
84
|
+
run its setup here; it keeps the files you already have:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
npm install -g @fission-ai/openspec
|
|
88
|
+
openspec init
|
|
89
|
+
```
|
|
File without changes
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
schema: spec-driven
|
|
2
|
+
|
|
3
|
+
# Project context (optional): constraints an agent can't infer from the code.
|
|
4
|
+
# context: |
|
|
5
|
+
# Designs and tasks must cover Windows, macOS and Linux
|
|
6
|
+
|
|
7
|
+
# Per-artifact rules (optional).
|
|
8
|
+
# rules:
|
|
9
|
+
# proposal:
|
|
10
|
+
# - Always state what is out of scope
|
|
11
|
+
# tasks:
|
|
12
|
+
# - Break tasks into chunks of at most 2 hours
|
|
File without changes
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# [PROJECT_NAME] Constitution
|
|
2
|
+
|
|
3
|
+
<!-- The principles every feature must respect. Fill it in, or run /speckit-constitution and let the AI
|
|
4
|
+
draft it from a conversation. Replace every [PLACEHOLDER]. -->
|
|
5
|
+
|
|
6
|
+
## Core Principles
|
|
7
|
+
|
|
8
|
+
### [PRINCIPLE_1_NAME]
|
|
9
|
+
<!-- Example: I. Test-First -->
|
|
10
|
+
[PRINCIPLE_1_DESCRIPTION]
|
|
11
|
+
<!-- Example: Tests are written and approved before the implementation. -->
|
|
12
|
+
|
|
13
|
+
### [PRINCIPLE_2_NAME]
|
|
14
|
+
<!-- Example: II. Simplicity -->
|
|
15
|
+
[PRINCIPLE_2_DESCRIPTION]
|
|
16
|
+
<!-- Example: Start with the simplest thing that works; no speculative abstractions. -->
|
|
17
|
+
|
|
18
|
+
### [PRINCIPLE_3_NAME]
|
|
19
|
+
[PRINCIPLE_3_DESCRIPTION]
|
|
20
|
+
|
|
21
|
+
## Constraints
|
|
22
|
+
|
|
23
|
+
[CONSTRAINTS]
|
|
24
|
+
<!-- Example: TypeScript only; Postgres; must run on Node 20+. -->
|
|
25
|
+
|
|
26
|
+
## Governance
|
|
27
|
+
|
|
28
|
+
This constitution overrides other practices. Amendments are documented here with their reason.
|
|
29
|
+
|
|
30
|
+
**Version**: 1.0.0 | **Ratified**: {{date}} | **Last amended**: {{date}}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Spec Kit guide
|
|
2
|
+
|
|
3
|
+
This project uses [GitHub Spec Kit](https://github.com/github/spec-kit): every feature goes from an
|
|
4
|
+
idea to a spec, a plan and a task list before any code is written.
|
|
5
|
+
|
|
6
|
+
## Structure
|
|
7
|
+
|
|
8
|
+
```tree
|
|
9
|
+
.specify/
|
|
10
|
+
memory/constitution.md # principles every feature must respect
|
|
11
|
+
templates/ # templates the commands fill (installed by Spec Kit)
|
|
12
|
+
specs/
|
|
13
|
+
001-user-login/ # one folder per feature, numbered
|
|
14
|
+
spec.md # what and why: user stories, requirements
|
|
15
|
+
plan.md # how: stack, architecture, data model
|
|
16
|
+
tasks.md # ordered checklist, by user story
|
|
17
|
+
research.md # optional: findings behind the plan
|
|
18
|
+
data-model.md # optional
|
|
19
|
+
contracts/ # optional: API definitions
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Flow
|
|
23
|
+
|
|
24
|
+
```mermaid
|
|
25
|
+
flowchart LR
|
|
26
|
+
C[Constitution] --> S[Specify] --> Q[Clarify] --> P[Plan] --> T[Tasks] --> I[Implement]
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
| Step | Command (if Spec Kit is installed) | Or ask the AI |
|
|
30
|
+
|---|---|---|
|
|
31
|
+
| Principles | `/speckit-constitution` | "Fill `.specify/memory/constitution.md` with our principles." |
|
|
32
|
+
| Spec | `/speckit-specify users can log in with email` | "Write `specs/001-user-login/spec.md`: user stories, requirements, success criteria. No tech choices." |
|
|
33
|
+
| Clarify (optional) | `/speckit-clarify` | "Ask me about anything ambiguous in the spec." |
|
|
34
|
+
| Plan | `/speckit-plan use Next.js and Postgres` | "Write `plan.md` for 001 with the stack and data model." |
|
|
35
|
+
| Tasks | `/speckit-tasks` | "Break the plan into `tasks.md`, grouped by user story." |
|
|
36
|
+
| Build | `/speckit-implement` | "Implement the tasks of 001 in order, ticking each one." |
|
|
37
|
+
|
|
38
|
+
## Examples
|
|
39
|
+
|
|
40
|
+
**`specs/001-user-login/spec.md`**
|
|
41
|
+
|
|
42
|
+
```md
|
|
43
|
+
# Feature Specification: User login
|
|
44
|
+
|
|
45
|
+
## User Scenarios
|
|
46
|
+
|
|
47
|
+
### User Story 1 - Log in with email (Priority: P1)
|
|
48
|
+
A registered user logs in with email and password to reach their dashboard.
|
|
49
|
+
|
|
50
|
+
**Acceptance Scenarios**:
|
|
51
|
+
1. **Given** a registered user, **When** they enter valid credentials, **Then** they see their dashboard.
|
|
52
|
+
2. **Given** a wrong password, **When** they submit, **Then** they see an error and stay logged out.
|
|
53
|
+
|
|
54
|
+
## Requirements
|
|
55
|
+
- **FR-001**: The system MUST lock an account after 5 failed attempts.
|
|
56
|
+
|
|
57
|
+
## Success Criteria
|
|
58
|
+
- **SC-001**: 95% of logins complete in under 2 seconds.
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**`specs/001-user-login/tasks.md`**
|
|
62
|
+
|
|
63
|
+
```md
|
|
64
|
+
## Phase 1: User Story 1 - Log in with email (P1)
|
|
65
|
+
- [ ] T001 [US1] Create the users table in src/db/schema.ts
|
|
66
|
+
- [ ] T002 [P] [US1] Login form in src/app/login/page.tsx
|
|
67
|
+
- [ ] T003 [US1] POST /api/login in src/app/api/login/route.ts
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
`[P]` marks tasks that can run in parallel.
|
|
71
|
+
|
|
72
|
+
## Installing Spec Kit
|
|
73
|
+
|
|
74
|
+
The `/speckit-*` commands come from the Spec Kit CLI, which needs [uv](https://docs.astral.sh/uv/)
|
|
75
|
+
(Python). If they are missing:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh # install uv
|
|
79
|
+
uvx --from git+https://github.com/github/spec-kit.git specify init --here --integration claude
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
It keeps the files you already have, including the constitution.
|