@lbruton/specflow 3.0.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/CHANGELOG.md +955 -0
- package/LICENSE +674 -0
- package/README.ar.md +314 -0
- package/README.de.md +314 -0
- package/README.es.md +314 -0
- package/README.fr.md +314 -0
- package/README.it.md +314 -0
- package/README.ja.md +316 -0
- package/README.ko.md +314 -0
- package/README.md +239 -0
- package/README.pt.md +314 -0
- package/README.ru.md +314 -0
- package/README.zh.md +314 -0
- package/dist/__tests__/config.test.d.ts +2 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +264 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/index-args.test.d.ts +2 -0
- package/dist/__tests__/index-args.test.d.ts.map +1 -0
- package/dist/__tests__/index-args.test.js +43 -0
- package/dist/__tests__/index-args.test.js.map +1 -0
- package/dist/__tests__/index-entrypoint.test.d.ts +2 -0
- package/dist/__tests__/index-entrypoint.test.d.ts.map +1 -0
- package/dist/__tests__/index-entrypoint.test.js +23 -0
- package/dist/__tests__/index-entrypoint.test.js.map +1 -0
- package/dist/config.d.ts +26 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +188 -0
- package/dist/config.js.map +1 -0
- package/dist/core/__tests__/git-utils.test.d.ts +2 -0
- package/dist/core/__tests__/git-utils.test.d.ts.map +1 -0
- package/dist/core/__tests__/git-utils.test.js +179 -0
- package/dist/core/__tests__/git-utils.test.js.map +1 -0
- package/dist/core/__tests__/mdx-validator.test.d.ts +2 -0
- package/dist/core/__tests__/mdx-validator.test.d.ts.map +1 -0
- package/dist/core/__tests__/mdx-validator.test.js +42 -0
- package/dist/core/__tests__/mdx-validator.test.js.map +1 -0
- package/dist/core/__tests__/path-utils.test.d.ts +2 -0
- package/dist/core/__tests__/path-utils.test.d.ts.map +1 -0
- package/dist/core/__tests__/path-utils.test.js +344 -0
- package/dist/core/__tests__/path-utils.test.js.map +1 -0
- package/dist/core/__tests__/project-registry.test.d.ts +2 -0
- package/dist/core/__tests__/project-registry.test.d.ts.map +1 -0
- package/dist/core/__tests__/project-registry.test.js +62 -0
- package/dist/core/__tests__/project-registry.test.js.map +1 -0
- package/dist/core/__tests__/security-utils.test.d.ts +2 -0
- package/dist/core/__tests__/security-utils.test.d.ts.map +1 -0
- package/dist/core/__tests__/security-utils.test.js +643 -0
- package/dist/core/__tests__/security-utils.test.js.map +1 -0
- package/dist/core/__tests__/task-validator.test.d.ts +2 -0
- package/dist/core/__tests__/task-validator.test.d.ts.map +1 -0
- package/dist/core/__tests__/task-validator.test.js +237 -0
- package/dist/core/__tests__/task-validator.test.js.map +1 -0
- package/dist/core/archive-service.d.ts +10 -0
- package/dist/core/archive-service.d.ts.map +1 -0
- package/dist/core/archive-service.js +99 -0
- package/dist/core/archive-service.js.map +1 -0
- package/dist/core/dashboard-session.d.ts +49 -0
- package/dist/core/dashboard-session.d.ts.map +1 -0
- package/dist/core/dashboard-session.js +132 -0
- package/dist/core/dashboard-session.js.map +1 -0
- package/dist/core/git-utils.d.ts +25 -0
- package/dist/core/git-utils.d.ts.map +1 -0
- package/dist/core/git-utils.js +87 -0
- package/dist/core/git-utils.js.map +1 -0
- package/dist/core/global-dir.d.ts +44 -0
- package/dist/core/global-dir.d.ts.map +1 -0
- package/dist/core/global-dir.js +74 -0
- package/dist/core/global-dir.js.map +1 -0
- package/dist/core/implementation-log-migrator.d.ts +41 -0
- package/dist/core/implementation-log-migrator.d.ts.map +1 -0
- package/dist/core/implementation-log-migrator.js +258 -0
- package/dist/core/implementation-log-migrator.js.map +1 -0
- package/dist/core/mdx-validator.d.ts +14 -0
- package/dist/core/mdx-validator.d.ts.map +1 -0
- package/dist/core/mdx-validator.js +34 -0
- package/dist/core/mdx-validator.js.map +1 -0
- package/dist/core/parser.d.ts +12 -0
- package/dist/core/parser.d.ts.map +1 -0
- package/dist/core/parser.js +144 -0
- package/dist/core/parser.js.map +1 -0
- package/dist/core/path-utils.d.ts +63 -0
- package/dist/core/path-utils.d.ts.map +1 -0
- package/dist/core/path-utils.js +288 -0
- package/dist/core/path-utils.js.map +1 -0
- package/dist/core/project-registry.d.ts +94 -0
- package/dist/core/project-registry.d.ts.map +1 -0
- package/dist/core/project-registry.js +293 -0
- package/dist/core/project-registry.js.map +1 -0
- package/dist/core/security-utils.d.ts +97 -0
- package/dist/core/security-utils.d.ts.map +1 -0
- package/dist/core/security-utils.js +264 -0
- package/dist/core/security-utils.js.map +1 -0
- package/dist/core/task-parser.d.ts +63 -0
- package/dist/core/task-parser.d.ts.map +1 -0
- package/dist/core/task-parser.js +332 -0
- package/dist/core/task-parser.js.map +1 -0
- package/dist/core/task-validator.d.ts +35 -0
- package/dist/core/task-validator.d.ts.map +1 -0
- package/dist/core/task-validator.js +236 -0
- package/dist/core/task-validator.js.map +1 -0
- package/dist/core/workspace-initializer.d.ts +16 -0
- package/dist/core/workspace-initializer.d.ts.map +1 -0
- package/dist/core/workspace-initializer.js +168 -0
- package/dist/core/workspace-initializer.js.map +1 -0
- package/dist/dashboard/__tests__/approval-storage-path-resolution.test.d.ts +2 -0
- package/dist/dashboard/__tests__/approval-storage-path-resolution.test.d.ts.map +1 -0
- package/dist/dashboard/__tests__/approval-storage-path-resolution.test.js +69 -0
- package/dist/dashboard/__tests__/approval-storage-path-resolution.test.js.map +1 -0
- package/dist/dashboard/__tests__/multi-server-approvals-content.test.d.ts +2 -0
- package/dist/dashboard/__tests__/multi-server-approvals-content.test.d.ts.map +1 -0
- package/dist/dashboard/__tests__/multi-server-approvals-content.test.js +116 -0
- package/dist/dashboard/__tests__/multi-server-approvals-content.test.js.map +1 -0
- package/dist/dashboard/__tests__/watcher-error-handling.test.d.ts +2 -0
- package/dist/dashboard/__tests__/watcher-error-handling.test.d.ts.map +1 -0
- package/dist/dashboard/__tests__/watcher-error-handling.test.js +118 -0
- package/dist/dashboard/__tests__/watcher-error-handling.test.js.map +1 -0
- package/dist/dashboard/approval-storage.d.ts +139 -0
- package/dist/dashboard/approval-storage.d.ts.map +1 -0
- package/dist/dashboard/approval-storage.js +586 -0
- package/dist/dashboard/approval-storage.js.map +1 -0
- package/dist/dashboard/execution-history-manager.d.ts +52 -0
- package/dist/dashboard/execution-history-manager.d.ts.map +1 -0
- package/dist/dashboard/execution-history-manager.js +161 -0
- package/dist/dashboard/execution-history-manager.js.map +1 -0
- package/dist/dashboard/implementation-log-manager.d.ts +97 -0
- package/dist/dashboard/implementation-log-manager.d.ts.map +1 -0
- package/dist/dashboard/implementation-log-manager.js +625 -0
- package/dist/dashboard/implementation-log-manager.js.map +1 -0
- package/dist/dashboard/job-scheduler.d.ts +91 -0
- package/dist/dashboard/job-scheduler.d.ts.map +1 -0
- package/dist/dashboard/job-scheduler.js +321 -0
- package/dist/dashboard/job-scheduler.js.map +1 -0
- package/dist/dashboard/multi-server.d.ts +42 -0
- package/dist/dashboard/multi-server.d.ts.map +1 -0
- package/dist/dashboard/multi-server.js +1304 -0
- package/dist/dashboard/multi-server.js.map +1 -0
- package/dist/dashboard/parser.d.ts +19 -0
- package/dist/dashboard/parser.d.ts.map +1 -0
- package/dist/dashboard/parser.js +290 -0
- package/dist/dashboard/parser.js.map +1 -0
- package/dist/dashboard/project-manager.d.ts +82 -0
- package/dist/dashboard/project-manager.d.ts.map +1 -0
- package/dist/dashboard/project-manager.js +257 -0
- package/dist/dashboard/project-manager.js.map +1 -0
- package/dist/dashboard/public/assets/Inter-Bold-CD3Pr7BX.woff2 +0 -0
- package/dist/dashboard/public/assets/Inter-Medium-B_8v_WHh.woff2 +0 -0
- package/dist/dashboard/public/assets/Inter-Regular-DRVdRqcI.woff2 +0 -0
- package/dist/dashboard/public/assets/Inter-SemiBold-CtskMddL.woff2 +0 -0
- package/dist/dashboard/public/assets/JetBrainsMono-Bold-D4WEaHbo.woff2 +0 -0
- package/dist/dashboard/public/assets/JetBrainsMono-Medium-3S3k2nMz.woff2 +0 -0
- package/dist/dashboard/public/assets/JetBrainsMono-Regular-BQaDgvhP.woff2 +0 -0
- package/dist/dashboard/public/assets/Tableau10-B-NsZVaP.js +1 -0
- package/dist/dashboard/public/assets/apl-B4CMkyY2.js +1 -0
- package/dist/dashboard/public/assets/arc-CtYZ6WTd.js +1 -0
- package/dist/dashboard/public/assets/array-BKyUJesY.js +1 -0
- package/dist/dashboard/public/assets/asciiarmor-Df11BRmG.js +1 -0
- package/dist/dashboard/public/assets/asn1-EdZsLKOL.js +1 -0
- package/dist/dashboard/public/assets/asterisk-B-8jnY81.js +1 -0
- package/dist/dashboard/public/assets/blockDiagram-c4efeb88-CzEvDZI5.js +118 -0
- package/dist/dashboard/public/assets/brainfuck-C4LP7Hcl.js +1 -0
- package/dist/dashboard/public/assets/c4Diagram-c83219d4-CuPd1dkK.js +10 -0
- package/dist/dashboard/public/assets/channel-kGGkJUti.js +1 -0
- package/dist/dashboard/public/assets/classDiagram-beda092f-CDTLUu9K.js +2 -0
- package/dist/dashboard/public/assets/classDiagram-v2-2358418a-BlHqrcgN.js +2 -0
- package/dist/dashboard/public/assets/clike-B9uivgTg.js +1 -0
- package/dist/dashboard/public/assets/clojure-BMjYHr_A.js +1 -0
- package/dist/dashboard/public/assets/clone-CHdfA33T.js +1 -0
- package/dist/dashboard/public/assets/cmake-BQqOBYOt.js +1 -0
- package/dist/dashboard/public/assets/cobol-CWcv1MsR.js +1 -0
- package/dist/dashboard/public/assets/coffeescript-S37ZYGWr.js +1 -0
- package/dist/dashboard/public/assets/commonlisp-DBKNyK5s.js +1 -0
- package/dist/dashboard/public/assets/createText-1719965b-B3cTooQ1.js +7 -0
- package/dist/dashboard/public/assets/crystal-SjHAIU92.js +1 -0
- package/dist/dashboard/public/assets/css-BnMrqG3P.js +1 -0
- package/dist/dashboard/public/assets/cypher-C_CwsFkJ.js +1 -0
- package/dist/dashboard/public/assets/d-pRatUO7H.js +1 -0
- package/dist/dashboard/public/assets/diff-DbItnlRl.js +1 -0
- package/dist/dashboard/public/assets/dockerfile-BKs6k2Af.js +1 -0
- package/dist/dashboard/public/assets/dtd-DF_7sFjM.js +1 -0
- package/dist/dashboard/public/assets/dylan-DwRh75JA.js +1 -0
- package/dist/dashboard/public/assets/ebnf-CDyGwa7X.js +1 -0
- package/dist/dashboard/public/assets/ecl-Cabwm37j.js +1 -0
- package/dist/dashboard/public/assets/edges-96097737-CbHatH6o.js +4 -0
- package/dist/dashboard/public/assets/eiffel-CnydiIhH.js +1 -0
- package/dist/dashboard/public/assets/elm-vLlmbW-K.js +1 -0
- package/dist/dashboard/public/assets/erDiagram-0228fc6a-MYCicRH6.js +51 -0
- package/dist/dashboard/public/assets/erlang-BNw1qcRV.js +1 -0
- package/dist/dashboard/public/assets/factor-kuTfRLto.js +1 -0
- package/dist/dashboard/public/assets/fcl-Kvtd6kyn.js +1 -0
- package/dist/dashboard/public/assets/flowDb-c6c81e3f-DDm9aBGx.js +10 -0
- package/dist/dashboard/public/assets/flowDiagram-50d868cf-zb-JtJG0.js +4 -0
- package/dist/dashboard/public/assets/flowDiagram-v2-4f6560a1-DRD7GAtr.js +1 -0
- package/dist/dashboard/public/assets/flowchart-elk-definition-6af322e1-D5TGPnG-.js +139 -0
- package/dist/dashboard/public/assets/forth-Ffai-XNe.js +1 -0
- package/dist/dashboard/public/assets/fortran-DYz_wnZ1.js +1 -0
- package/dist/dashboard/public/assets/ganttDiagram-a2739b55-Cqst4HhR.js +257 -0
- package/dist/dashboard/public/assets/gas-Bneqetm1.js +1 -0
- package/dist/dashboard/public/assets/gherkin-heZmZLOM.js +1 -0
- package/dist/dashboard/public/assets/gitGraphDiagram-82fe8481-C8JWqtTx.js +70 -0
- package/dist/dashboard/public/assets/graph-Lpyd8dqZ.js +1 -0
- package/dist/dashboard/public/assets/groovy-D9Dt4D0W.js +1 -0
- package/dist/dashboard/public/assets/haskell-Cw1EW3IL.js +1 -0
- package/dist/dashboard/public/assets/haxe-H-WmDvRZ.js +1 -0
- package/dist/dashboard/public/assets/http-DBlCnlav.js +1 -0
- package/dist/dashboard/public/assets/idl-BEugSyMb.js +1 -0
- package/dist/dashboard/public/assets/index--_-9KDkB.js +1 -0
- package/dist/dashboard/public/assets/index-5325376f-Ngqm3jj1.js +1 -0
- package/dist/dashboard/public/assets/index-7POr4IQt.js +1 -0
- package/dist/dashboard/public/assets/index-B2wloU4M.js +7 -0
- package/dist/dashboard/public/assets/index-BB9i8dPx.js +329 -0
- package/dist/dashboard/public/assets/index-BHCmvfMN.js +1 -0
- package/dist/dashboard/public/assets/index-BWvyG2sq.js +1 -0
- package/dist/dashboard/public/assets/index-BhwV70vC.js +2 -0
- package/dist/dashboard/public/assets/index-Bqk8CAAy.js +1 -0
- package/dist/dashboard/public/assets/index-CUP35nar.js +1 -0
- package/dist/dashboard/public/assets/index-CYy3mVaI.js +1 -0
- package/dist/dashboard/public/assets/index-Cqbzr5qD.js +3 -0
- package/dist/dashboard/public/assets/index-Cv_FT1Rp.css +1 -0
- package/dist/dashboard/public/assets/index-D4J257wx.js +1 -0
- package/dist/dashboard/public/assets/index-D9fDAa7f.js +1 -0
- package/dist/dashboard/public/assets/index-DFN4bEYo.js +1 -0
- package/dist/dashboard/public/assets/index-DQ2Aap_e.js +1 -0
- package/dist/dashboard/public/assets/index-Djo38KZb.js +1 -0
- package/dist/dashboard/public/assets/index-RZXsuDxo.js +1 -0
- package/dist/dashboard/public/assets/index-m5SRqxVX.js +1 -0
- package/dist/dashboard/public/assets/infoDiagram-8eee0895-DYMb32US.js +7 -0
- package/dist/dashboard/public/assets/init-Gi6I4Gst.js +1 -0
- package/dist/dashboard/public/assets/javascript-iXu5QeM3.js +1 -0
- package/dist/dashboard/public/assets/journeyDiagram-c64418c1-BgL0JuAb.js +139 -0
- package/dist/dashboard/public/assets/julia-DuME0IfC.js +1 -0
- package/dist/dashboard/public/assets/katex-XbL3y5x-.js +261 -0
- package/dist/dashboard/public/assets/layout-DP9fJAz2.js +1 -0
- package/dist/dashboard/public/assets/line-N_NGiB5u.js +1 -0
- package/dist/dashboard/public/assets/linear-B1Bl-FQE.js +1 -0
- package/dist/dashboard/public/assets/livescript-BwQOo05w.js +1 -0
- package/dist/dashboard/public/assets/lua-BgMRiT3U.js +1 -0
- package/dist/dashboard/public/assets/mathematica-DTrFuWx2.js +1 -0
- package/dist/dashboard/public/assets/mbox-CNhZ1qSd.js +1 -0
- package/dist/dashboard/public/assets/mindmap-definition-8da855dc-DuejFf1j.js +415 -0
- package/dist/dashboard/public/assets/mirc-CjQqDB4T.js +1 -0
- package/dist/dashboard/public/assets/mllike-CXdrOF99.js +1 -0
- package/dist/dashboard/public/assets/modelica-Dc1JOy9r.js +1 -0
- package/dist/dashboard/public/assets/mscgen-BA5vi2Kp.js +1 -0
- package/dist/dashboard/public/assets/mumps-BT43cFF4.js +1 -0
- package/dist/dashboard/public/assets/nginx-DdIZxoE0.js +1 -0
- package/dist/dashboard/public/assets/nsis-LdVXkNf5.js +1 -0
- package/dist/dashboard/public/assets/ntriples-BfvgReVJ.js +1 -0
- package/dist/dashboard/public/assets/octave-Ck1zUtKM.js +1 -0
- package/dist/dashboard/public/assets/ordinal-Cboi1Yqb.js +1 -0
- package/dist/dashboard/public/assets/oz-BzwKVEFT.js +1 -0
- package/dist/dashboard/public/assets/pascal--L3eBynH.js +1 -0
- package/dist/dashboard/public/assets/path-CbwjOpE9.js +1 -0
- package/dist/dashboard/public/assets/perl-CdXCOZ3F.js +1 -0
- package/dist/dashboard/public/assets/pieDiagram-a8764435-fJ2uKW1i.js +35 -0
- package/dist/dashboard/public/assets/pig-CevX1Tat.js +1 -0
- package/dist/dashboard/public/assets/powershell-CFHJl5sT.js +1 -0
- package/dist/dashboard/public/assets/properties-C78fOPTZ.js +1 -0
- package/dist/dashboard/public/assets/protobuf-ChK-085T.js +1 -0
- package/dist/dashboard/public/assets/pug-DeIclll2.js +1 -0
- package/dist/dashboard/public/assets/puppet-DMA9R1ak.js +1 -0
- package/dist/dashboard/public/assets/python-BuPzkPfP.js +1 -0
- package/dist/dashboard/public/assets/q-pXgVlZs6.js +1 -0
- package/dist/dashboard/public/assets/quadrantDiagram-1e28029f-Dowa1iq5.js +7 -0
- package/dist/dashboard/public/assets/r-B6wPVr8A.js +1 -0
- package/dist/dashboard/public/assets/requirementDiagram-08caed73-1PKeJnUu.js +52 -0
- package/dist/dashboard/public/assets/rpm-CTu-6PCP.js +1 -0
- package/dist/dashboard/public/assets/ruby-B2Rjki9n.js +1 -0
- package/dist/dashboard/public/assets/sankeyDiagram-a04cb91d-C3Nu91E8.js +8 -0
- package/dist/dashboard/public/assets/sas-B4kiWyti.js +1 -0
- package/dist/dashboard/public/assets/scheme-C41bIUwD.js +1 -0
- package/dist/dashboard/public/assets/sequenceDiagram-c5b8d532-BbyYeaFb.js +122 -0
- package/dist/dashboard/public/assets/shell-CjFT_Tl9.js +1 -0
- package/dist/dashboard/public/assets/sieve-C3Gn_uJK.js +1 -0
- package/dist/dashboard/public/assets/simple-mode-GW_nhZxv.js +1 -0
- package/dist/dashboard/public/assets/smalltalk-CnHTOXQT.js +1 -0
- package/dist/dashboard/public/assets/solr-DehyRSwq.js +1 -0
- package/dist/dashboard/public/assets/sparql-DkYu6x3z.js +1 -0
- package/dist/dashboard/public/assets/spreadsheet-BCZA_wO0.js +1 -0
- package/dist/dashboard/public/assets/sql-D0XecflT.js +1 -0
- package/dist/dashboard/public/assets/stateDiagram-1ecb1508-BVkb4gIE.js +1 -0
- package/dist/dashboard/public/assets/stateDiagram-v2-c2b004d7-Bm7qug6Q.js +1 -0
- package/dist/dashboard/public/assets/stex-C3f8Ysf7.js +1 -0
- package/dist/dashboard/public/assets/styles-b4e223ce-BuqydlKk.js +160 -0
- package/dist/dashboard/public/assets/styles-ca3715f6-C8L7peEM.js +207 -0
- package/dist/dashboard/public/assets/styles-d45a18b0-BbrCCPkQ.js +116 -0
- package/dist/dashboard/public/assets/stylus-B533Al4x.js +1 -0
- package/dist/dashboard/public/assets/svgDrawCommon-b86b1483-DQZAHvSt.js +1 -0
- package/dist/dashboard/public/assets/swift-BzpIVaGY.js +1 -0
- package/dist/dashboard/public/assets/tcl-DVfN8rqt.js +1 -0
- package/dist/dashboard/public/assets/textile-CnDTJFAw.js +1 -0
- package/dist/dashboard/public/assets/tiddlywiki-DO-Gjzrf.js +1 -0
- package/dist/dashboard/public/assets/tiki-DGYXhP31.js +1 -0
- package/dist/dashboard/public/assets/timeline-definition-faaaa080-YPoIuE--.js +61 -0
- package/dist/dashboard/public/assets/toml-Bm5Em-hy.js +1 -0
- package/dist/dashboard/public/assets/troff-wAsdV37c.js +1 -0
- package/dist/dashboard/public/assets/ttcn-CfJYG6tj.js +1 -0
- package/dist/dashboard/public/assets/ttcn-cfg-B9xdYoR4.js +1 -0
- package/dist/dashboard/public/assets/turtle-B1tBg_DP.js +1 -0
- package/dist/dashboard/public/assets/vb-CmGdzxic.js +1 -0
- package/dist/dashboard/public/assets/vbscript-BuJXcnF6.js +1 -0
- package/dist/dashboard/public/assets/velocity-D8B20fx6.js +1 -0
- package/dist/dashboard/public/assets/verilog-C6RDOZhf.js +1 -0
- package/dist/dashboard/public/assets/vhdl-lSbBsy5d.js +1 -0
- package/dist/dashboard/public/assets/webidl-ZXfAyPTL.js +1 -0
- package/dist/dashboard/public/assets/xquery-DzFWVndE.js +1 -0
- package/dist/dashboard/public/assets/xychartDiagram-f5964ef8-BnI4pVWV.js +7 -0
- package/dist/dashboard/public/assets/yacas-BJ4BC0dw.js +1 -0
- package/dist/dashboard/public/assets/z80-Hz9HOZM7.js +1 -0
- package/dist/dashboard/public/claude-icon-dark.svg +1 -0
- package/dist/dashboard/public/claude-icon.svg +1 -0
- package/dist/dashboard/public/index.html +16 -0
- package/dist/dashboard/settings-manager.d.ts +47 -0
- package/dist/dashboard/settings-manager.d.ts.map +1 -0
- package/dist/dashboard/settings-manager.js +180 -0
- package/dist/dashboard/settings-manager.js.map +1 -0
- package/dist/dashboard/utils.d.ts +31 -0
- package/dist/dashboard/utils.d.ts.map +1 -0
- package/dist/dashboard/utils.js +102 -0
- package/dist/dashboard/utils.js.map +1 -0
- package/dist/dashboard/watcher.d.ts +32 -0
- package/dist/dashboard/watcher.d.ts.map +1 -0
- package/dist/dashboard/watcher.js +173 -0
- package/dist/dashboard/watcher.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +380 -0
- package/dist/index.js.map +1 -0
- package/dist/markdown/templates/code-quality-reviewer-template.md +76 -0
- package/dist/markdown/templates/design-template.md +141 -0
- package/dist/markdown/templates/implementer-prompt-template.md +122 -0
- package/dist/markdown/templates/product-template.md +51 -0
- package/dist/markdown/templates/requirements-template.md +73 -0
- package/dist/markdown/templates/spec-reviewer-template.md +58 -0
- package/dist/markdown/templates/structure-template.md +145 -0
- package/dist/markdown/templates/tasks-template.md +182 -0
- package/dist/markdown/templates/tech-template.md +99 -0
- package/dist/prompts/create-spec.d.ts +3 -0
- package/dist/prompts/create-spec.d.ts.map +1 -0
- package/dist/prompts/create-spec.js +93 -0
- package/dist/prompts/create-spec.js.map +1 -0
- package/dist/prompts/create-steering-doc.d.ts +3 -0
- package/dist/prompts/create-steering-doc.d.ts.map +1 -0
- package/dist/prompts/create-steering-doc.js +73 -0
- package/dist/prompts/create-steering-doc.js.map +1 -0
- package/dist/prompts/implement-task.d.ts +3 -0
- package/dist/prompts/implement-task.d.ts.map +1 -0
- package/dist/prompts/implement-task.js +189 -0
- package/dist/prompts/implement-task.js.map +1 -0
- package/dist/prompts/index.d.ts +15 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +49 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/inject-spec-workflow-guide.d.ts +3 -0
- package/dist/prompts/inject-spec-workflow-guide.d.ts.map +1 -0
- package/dist/prompts/inject-spec-workflow-guide.js +47 -0
- package/dist/prompts/inject-spec-workflow-guide.js.map +1 -0
- package/dist/prompts/inject-steering-guide.d.ts +3 -0
- package/dist/prompts/inject-steering-guide.d.ts.map +1 -0
- package/dist/prompts/inject-steering-guide.js +51 -0
- package/dist/prompts/inject-steering-guide.js.map +1 -0
- package/dist/prompts/refresh-tasks.d.ts +3 -0
- package/dist/prompts/refresh-tasks.d.ts.map +1 -0
- package/dist/prompts/refresh-tasks.js +224 -0
- package/dist/prompts/refresh-tasks.js.map +1 -0
- package/dist/prompts/spec-status.d.ts +3 -0
- package/dist/prompts/spec-status.d.ts.map +1 -0
- package/dist/prompts/spec-status.js +75 -0
- package/dist/prompts/spec-status.js.map +1 -0
- package/dist/prompts/types.d.ts +13 -0
- package/dist/prompts/types.d.ts.map +1 -0
- package/dist/prompts/types.js +2 -0
- package/dist/prompts/types.js.map +1 -0
- package/dist/server.d.ts +17 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +175 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/__tests__/projectPath.test.d.ts +2 -0
- package/dist/tools/__tests__/projectPath.test.d.ts.map +1 -0
- package/dist/tools/__tests__/projectPath.test.js +187 -0
- package/dist/tools/__tests__/projectPath.test.js.map +1 -0
- package/dist/tools/approvals.d.ts +14 -0
- package/dist/tools/approvals.d.ts.map +1 -0
- package/dist/tools/approvals.js +501 -0
- package/dist/tools/approvals.js.map +1 -0
- package/dist/tools/index.d.ts +5 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +57 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/log-implementation.d.ts +5 -0
- package/dist/tools/log-implementation.d.ts.map +1 -0
- package/dist/tools/log-implementation.js +446 -0
- package/dist/tools/log-implementation.js.map +1 -0
- package/dist/tools/spec-list.d.ts +5 -0
- package/dist/tools/spec-list.d.ts.map +1 -0
- package/dist/tools/spec-list.js +144 -0
- package/dist/tools/spec-list.js.map +1 -0
- package/dist/tools/spec-status.d.ts +5 -0
- package/dist/tools/spec-status.d.ts.map +1 -0
- package/dist/tools/spec-status.js +238 -0
- package/dist/tools/spec-status.js.map +1 -0
- package/dist/tools/spec-workflow-guide.d.ts +5 -0
- package/dist/tools/spec-workflow-guide.d.ts.map +1 -0
- package/dist/tools/spec-workflow-guide.js +580 -0
- package/dist/tools/spec-workflow-guide.js.map +1 -0
- package/dist/tools/steering-guide.d.ts +5 -0
- package/dist/tools/steering-guide.d.ts.map +1 -0
- package/dist/tools/steering-guide.js +192 -0
- package/dist/tools/steering-guide.js.map +1 -0
- package/dist/types.d.ts +186 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +13 -0
- package/dist/types.js.map +1 -0
- package/package.json +105 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { SpecWorkflowMCPServer } from './server.js';
|
|
3
|
+
import { MultiProjectDashboardServer } from './dashboard/multi-server.js';
|
|
4
|
+
import { DashboardSessionManager } from './core/dashboard-session.js';
|
|
5
|
+
import { homedir } from 'os';
|
|
6
|
+
import { resolveGitRoot, resolveGitWorkspaceRoot } from './core/git-utils.js';
|
|
7
|
+
import { resolve } from 'path';
|
|
8
|
+
import { fileURLToPath } from 'url';
|
|
9
|
+
import { realpathSync } from 'fs';
|
|
10
|
+
// Default dashboard port
|
|
11
|
+
const DEFAULT_DASHBOARD_PORT = 5000;
|
|
12
|
+
function showHelp() {
|
|
13
|
+
console.error(`
|
|
14
|
+
SpecFlow — Spec-driven development with persistent project memory
|
|
15
|
+
|
|
16
|
+
USAGE:
|
|
17
|
+
specflow [path] [options]
|
|
18
|
+
|
|
19
|
+
ARGUMENTS:
|
|
20
|
+
path Project path (defaults to current directory)
|
|
21
|
+
Supports ~ for home directory
|
|
22
|
+
|
|
23
|
+
OPTIONS:
|
|
24
|
+
--help Show this help message
|
|
25
|
+
--dashboard Run dashboard-only mode (no MCP server)
|
|
26
|
+
--port <number> Specify dashboard port (1024-65535)
|
|
27
|
+
Default: 5000
|
|
28
|
+
Only use if port 5000 is unavailable
|
|
29
|
+
--no-open Don't automatically open browser when starting dashboard
|
|
30
|
+
Useful in restricted environments where browser launch is blocked
|
|
31
|
+
--no-shared-worktree-specs
|
|
32
|
+
Disable shared .spec-workflow in git worktrees
|
|
33
|
+
Use workspace-local .spec-workflow instead of main repo
|
|
34
|
+
|
|
35
|
+
IMPORTANT:
|
|
36
|
+
Only ONE dashboard instance runs at a time. All MCP servers connect to the
|
|
37
|
+
same dashboard. The dashboard runs on port 5000 by default.
|
|
38
|
+
|
|
39
|
+
MODES OF OPERATION:
|
|
40
|
+
|
|
41
|
+
1. MCP Server Only (default):
|
|
42
|
+
specflow
|
|
43
|
+
specflow ~/my-project
|
|
44
|
+
|
|
45
|
+
Starts MCP server without dashboard. Dashboard can be started separately.
|
|
46
|
+
|
|
47
|
+
2. Dashboard Only Mode:
|
|
48
|
+
specflow --dashboard
|
|
49
|
+
specflow --dashboard --port 8080
|
|
50
|
+
specflow --dashboard --no-open
|
|
51
|
+
|
|
52
|
+
Runs only the web dashboard without MCP server (default port: 5000).
|
|
53
|
+
Projects will automatically appear in the dashboard as MCP servers register.
|
|
54
|
+
Only one dashboard instance is needed for all your projects.
|
|
55
|
+
Use --no-open to prevent automatic browser launch (useful in restricted environments).
|
|
56
|
+
|
|
57
|
+
EXAMPLES:
|
|
58
|
+
# Start MCP server in current directory (no dashboard)
|
|
59
|
+
specflow
|
|
60
|
+
|
|
61
|
+
# Start MCP server in a specific project directory
|
|
62
|
+
specflow ~/projects/my-app
|
|
63
|
+
|
|
64
|
+
# Run dashboard (default port 5000) - START THIS FIRST
|
|
65
|
+
specflow --dashboard
|
|
66
|
+
|
|
67
|
+
# Run dashboard on custom port (if 5000 is unavailable)
|
|
68
|
+
specflow --dashboard --port 8080
|
|
69
|
+
|
|
70
|
+
TYPICAL WORKFLOW:
|
|
71
|
+
1. Start the dashboard once:
|
|
72
|
+
specflow --dashboard
|
|
73
|
+
|
|
74
|
+
2. Start MCP servers for your projects (in separate terminals):
|
|
75
|
+
specflow ~/project1
|
|
76
|
+
specflow ~/project2
|
|
77
|
+
specflow ~/project3
|
|
78
|
+
|
|
79
|
+
All projects will appear in the same dashboard at http://localhost:5000
|
|
80
|
+
|
|
81
|
+
PARAMETER FORMATS:
|
|
82
|
+
--port 3456 Space-separated format
|
|
83
|
+
--port=3456 Equals format
|
|
84
|
+
|
|
85
|
+
For more information, visit: https://github.com/lbruton/specflow
|
|
86
|
+
`);
|
|
87
|
+
}
|
|
88
|
+
function expandTildePath(path) {
|
|
89
|
+
if (path.startsWith('~/') || path === '~') {
|
|
90
|
+
return path.replace('~', homedir());
|
|
91
|
+
}
|
|
92
|
+
return path;
|
|
93
|
+
}
|
|
94
|
+
export function parseArguments(args) {
|
|
95
|
+
const isDashboardMode = args.includes('--dashboard');
|
|
96
|
+
const noOpen = args.includes('--no-open');
|
|
97
|
+
const noSharedWorktreeSpecs = args.includes('--no-shared-worktree-specs');
|
|
98
|
+
let customPort;
|
|
99
|
+
// Check for invalid flags
|
|
100
|
+
const validFlags = ['--dashboard', '--port', '--help', '-h', '--no-open', '--no-shared-worktree-specs'];
|
|
101
|
+
for (const arg of args) {
|
|
102
|
+
if (arg.startsWith('--') && !arg.includes('=')) {
|
|
103
|
+
if (!validFlags.includes(arg)) {
|
|
104
|
+
throw new Error(`Unknown option: ${arg}\nUse --help to see available options.`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else if (arg.startsWith('--') && arg.includes('=')) {
|
|
108
|
+
const flagName = arg.split('=')[0];
|
|
109
|
+
if (!validFlags.includes(flagName)) {
|
|
110
|
+
throw new Error(`Unknown option: ${flagName}\nUse --help to see available options.`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Parse --port parameter (supports --port 3000 and --port=3000 formats)
|
|
115
|
+
for (let i = 0; i < args.length; i++) {
|
|
116
|
+
const arg = args[i];
|
|
117
|
+
if (arg.startsWith('--port=')) {
|
|
118
|
+
// Handle --port=3000 format
|
|
119
|
+
const portStr = arg.split('=')[1];
|
|
120
|
+
if (portStr) {
|
|
121
|
+
const parsed = parseInt(portStr, 10);
|
|
122
|
+
if (isNaN(parsed)) {
|
|
123
|
+
throw new Error(`Invalid port number: ${portStr}. Port must be a number.`);
|
|
124
|
+
}
|
|
125
|
+
if (parsed < 1024 || parsed > 65535) {
|
|
126
|
+
throw new Error(`Port ${parsed} is out of range. Port must be between 1024 and 65535.`);
|
|
127
|
+
}
|
|
128
|
+
customPort = parsed;
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
throw new Error('--port parameter requires a value (e.g., --port=3000)');
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
else if (arg === '--port' && i + 1 < args.length) {
|
|
135
|
+
// Handle --port 3000 format
|
|
136
|
+
const portStr = args[i + 1];
|
|
137
|
+
const parsed = parseInt(portStr, 10);
|
|
138
|
+
if (isNaN(parsed)) {
|
|
139
|
+
throw new Error(`Invalid port number: ${portStr}. Port must be a number.`);
|
|
140
|
+
}
|
|
141
|
+
if (parsed < 1024 || parsed > 65535) {
|
|
142
|
+
throw new Error(`Port ${parsed} is out of range. Port must be between 1024 and 65535.`);
|
|
143
|
+
}
|
|
144
|
+
customPort = parsed;
|
|
145
|
+
i++; // Skip the next argument as it's the port value
|
|
146
|
+
}
|
|
147
|
+
else if (arg === '--port') {
|
|
148
|
+
throw new Error('--port parameter requires a value (e.g., --port 3000)');
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Get project path (filter out flags and their values)
|
|
152
|
+
const filteredArgs = args.filter((arg, index) => {
|
|
153
|
+
if (arg === '--dashboard')
|
|
154
|
+
return false;
|
|
155
|
+
if (arg.startsWith('--port='))
|
|
156
|
+
return false;
|
|
157
|
+
if (arg === '--port')
|
|
158
|
+
return false;
|
|
159
|
+
if (arg === '--no-open')
|
|
160
|
+
return false;
|
|
161
|
+
if (arg === '--no-shared-worktree-specs')
|
|
162
|
+
return false;
|
|
163
|
+
// Check if this arg is a value following --port
|
|
164
|
+
if (index > 0 && args[index - 1] === '--port')
|
|
165
|
+
return false;
|
|
166
|
+
return true;
|
|
167
|
+
});
|
|
168
|
+
// For dashboard-only mode, use cwd as default (dashboard doesn't need it)
|
|
169
|
+
const rawProjectPath = filteredArgs[0] || process.cwd();
|
|
170
|
+
const expandedPath = expandTildePath(rawProjectPath);
|
|
171
|
+
const workspacePath = resolveGitWorkspaceRoot(expandedPath);
|
|
172
|
+
const workflowRootPath = noSharedWorktreeSpecs ? workspacePath : resolveGitRoot(workspacePath);
|
|
173
|
+
// Warn if no explicit path was provided and we're using cwd (but only for MCP server mode)
|
|
174
|
+
if (!filteredArgs[0] && !isDashboardMode) {
|
|
175
|
+
console.warn(`Warning: No project path specified, using current directory: ${workspacePath}`);
|
|
176
|
+
console.warn('Consider specifying an explicit path for better clarity.');
|
|
177
|
+
}
|
|
178
|
+
return {
|
|
179
|
+
workspacePath,
|
|
180
|
+
workflowRootPath,
|
|
181
|
+
expandedPath,
|
|
182
|
+
isDashboardMode,
|
|
183
|
+
noSharedWorktreeSpecs,
|
|
184
|
+
port: customPort,
|
|
185
|
+
lang: undefined,
|
|
186
|
+
noOpen
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
async function main() {
|
|
190
|
+
try {
|
|
191
|
+
const args = process.argv.slice(2);
|
|
192
|
+
// Check for help flag
|
|
193
|
+
if (args.includes('--help') || args.includes('-h')) {
|
|
194
|
+
showHelp();
|
|
195
|
+
process.exit(0);
|
|
196
|
+
}
|
|
197
|
+
// Parse command-line arguments
|
|
198
|
+
const cliArgs = parseArguments(args);
|
|
199
|
+
const workspacePath = cliArgs.workspacePath;
|
|
200
|
+
const workflowRootPath = cliArgs.workflowRootPath;
|
|
201
|
+
const noSharedWorktreeSpecs = cliArgs.noSharedWorktreeSpecs;
|
|
202
|
+
// Log worktree details when workspace and shared workflow roots differ
|
|
203
|
+
if (workspacePath !== workflowRootPath) {
|
|
204
|
+
console.error('Git worktree detected.');
|
|
205
|
+
console.error(`workspacePath=${workspacePath}`);
|
|
206
|
+
console.error(`workflowRootPath=${workflowRootPath}`);
|
|
207
|
+
}
|
|
208
|
+
else if (noSharedWorktreeSpecs) {
|
|
209
|
+
console.error('Shared worktree specs disabled. Using workspace-local .spec-workflow.');
|
|
210
|
+
console.error(`workspacePath=${workspacePath}`);
|
|
211
|
+
}
|
|
212
|
+
// Apply configuration from CLI args
|
|
213
|
+
const isDashboardMode = cliArgs.isDashboardMode || false;
|
|
214
|
+
const port = cliArgs.port;
|
|
215
|
+
const lang = cliArgs.lang;
|
|
216
|
+
const noOpen = cliArgs.noOpen || false;
|
|
217
|
+
if (isDashboardMode) {
|
|
218
|
+
// Check if a dashboard is already running (always check, regardless of port)
|
|
219
|
+
const sessionManager = new DashboardSessionManager();
|
|
220
|
+
const existingSession = await sessionManager.getDashboardSession();
|
|
221
|
+
if (existingSession) {
|
|
222
|
+
console.error(`Dashboard is already running at: ${existingSession.url}`);
|
|
223
|
+
console.error('');
|
|
224
|
+
console.error('You can:');
|
|
225
|
+
console.error(` 1. Use the existing dashboard at: ${existingSession.url}`);
|
|
226
|
+
console.error(` 2. Stop it first (Ctrl+C or kill ${existingSession.pid}), then start a new one`);
|
|
227
|
+
console.error('');
|
|
228
|
+
console.error('Note: Only one dashboard instance is needed for all your projects.');
|
|
229
|
+
process.exit(1);
|
|
230
|
+
}
|
|
231
|
+
// Use specified port or default
|
|
232
|
+
const dashboardPort = port || DEFAULT_DASHBOARD_PORT;
|
|
233
|
+
// Dashboard only mode - use new multi-project dashboard
|
|
234
|
+
console.error(`Starting Unified Multi-Project Dashboard`);
|
|
235
|
+
if (port) {
|
|
236
|
+
console.error(`Using custom port: ${port}`);
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
console.error(`Using default port: ${DEFAULT_DASHBOARD_PORT}`);
|
|
240
|
+
}
|
|
241
|
+
if (noOpen) {
|
|
242
|
+
console.error(`Browser auto-open disabled (--no-open)`);
|
|
243
|
+
}
|
|
244
|
+
// Load configuration from environment variables
|
|
245
|
+
let bindAddress;
|
|
246
|
+
let allowExternalAccess;
|
|
247
|
+
const securityConfig = {};
|
|
248
|
+
// Network binding configuration
|
|
249
|
+
if (process.env.SPEC_WORKFLOW_BIND_ADDRESS) {
|
|
250
|
+
bindAddress = process.env.SPEC_WORKFLOW_BIND_ADDRESS;
|
|
251
|
+
}
|
|
252
|
+
// External access opt-in (only override if explicitly set to true or false)
|
|
253
|
+
if (process.env.SPEC_WORKFLOW_ALLOW_EXTERNAL_ACCESS !== undefined) {
|
|
254
|
+
const allowExternal = process.env.SPEC_WORKFLOW_ALLOW_EXTERNAL_ACCESS.toLowerCase();
|
|
255
|
+
if (allowExternal === 'true') {
|
|
256
|
+
allowExternalAccess = true;
|
|
257
|
+
}
|
|
258
|
+
else if (allowExternal === 'false') {
|
|
259
|
+
allowExternalAccess = false;
|
|
260
|
+
}
|
|
261
|
+
// If invalid value, ignore and use default
|
|
262
|
+
}
|
|
263
|
+
// Security features configuration
|
|
264
|
+
// Rate limiting toggle (only override if explicitly set to true or false)
|
|
265
|
+
if (process.env.SPEC_WORKFLOW_RATE_LIMIT_ENABLED !== undefined) {
|
|
266
|
+
const rateLimitEnabled = process.env.SPEC_WORKFLOW_RATE_LIMIT_ENABLED.toLowerCase();
|
|
267
|
+
if (rateLimitEnabled === 'true') {
|
|
268
|
+
securityConfig.rateLimitEnabled = true;
|
|
269
|
+
}
|
|
270
|
+
else if (rateLimitEnabled === 'false') {
|
|
271
|
+
securityConfig.rateLimitEnabled = false;
|
|
272
|
+
}
|
|
273
|
+
// If invalid value, ignore and use default
|
|
274
|
+
}
|
|
275
|
+
// CORS toggle (only override if explicitly set to true or false)
|
|
276
|
+
if (process.env.SPEC_WORKFLOW_CORS_ENABLED !== undefined) {
|
|
277
|
+
const corsEnabled = process.env.SPEC_WORKFLOW_CORS_ENABLED.toLowerCase();
|
|
278
|
+
if (corsEnabled === 'true') {
|
|
279
|
+
securityConfig.corsEnabled = true;
|
|
280
|
+
}
|
|
281
|
+
else if (corsEnabled === 'false') {
|
|
282
|
+
securityConfig.corsEnabled = false;
|
|
283
|
+
}
|
|
284
|
+
// If invalid value, ignore and use default
|
|
285
|
+
}
|
|
286
|
+
// Create dashboard server (network binding validation happens in constructor)
|
|
287
|
+
let dashboardServer;
|
|
288
|
+
try {
|
|
289
|
+
dashboardServer = new MultiProjectDashboardServer({
|
|
290
|
+
autoOpen: !noOpen,
|
|
291
|
+
port: dashboardPort,
|
|
292
|
+
bindAddress,
|
|
293
|
+
allowExternalAccess,
|
|
294
|
+
security: securityConfig
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
catch (error) {
|
|
298
|
+
// Provide user-friendly error message with environment variable names
|
|
299
|
+
if (error.message.includes('SECURITY ERROR') || error.message.includes('non-localhost')) {
|
|
300
|
+
console.error('');
|
|
301
|
+
console.error('❌ Security Configuration Error:');
|
|
302
|
+
console.error(error.message);
|
|
303
|
+
console.error('');
|
|
304
|
+
console.error('To fix this, either:');
|
|
305
|
+
console.error(' 1. Use localhost binding (secure):');
|
|
306
|
+
console.error(' export SPEC_WORKFLOW_BIND_ADDRESS=127.0.0.1');
|
|
307
|
+
console.error('');
|
|
308
|
+
console.error(' 2. Explicitly allow external access (insecure):');
|
|
309
|
+
console.error(' export SPEC_WORKFLOW_ALLOW_EXTERNAL_ACCESS=true');
|
|
310
|
+
console.error('');
|
|
311
|
+
process.exit(1);
|
|
312
|
+
}
|
|
313
|
+
throw error; // Re-throw other errors
|
|
314
|
+
}
|
|
315
|
+
try {
|
|
316
|
+
const dashboardUrl = await dashboardServer.start();
|
|
317
|
+
console.error(`Dashboard started at: ${dashboardUrl}`);
|
|
318
|
+
console.error('Projects will automatically appear as MCP servers register.');
|
|
319
|
+
console.error('Press Ctrl+C to stop the dashboard');
|
|
320
|
+
}
|
|
321
|
+
catch (error) {
|
|
322
|
+
console.error(`Failed to start dashboard: ${error.message}`);
|
|
323
|
+
process.exit(1);
|
|
324
|
+
}
|
|
325
|
+
// Handle graceful shutdown
|
|
326
|
+
const shutdown = async () => {
|
|
327
|
+
console.error('\nShutting down dashboard...');
|
|
328
|
+
await dashboardServer.stop();
|
|
329
|
+
process.exit(0);
|
|
330
|
+
};
|
|
331
|
+
process.on('SIGINT', shutdown);
|
|
332
|
+
process.on('SIGTERM', shutdown);
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
// MCP server mode
|
|
336
|
+
console.error(`Starting Spec Workflow MCP Server for project: ${workflowRootPath}`);
|
|
337
|
+
console.error(`Workspace path: ${workspacePath}`);
|
|
338
|
+
console.error(`Working directory: ${process.cwd()}`);
|
|
339
|
+
const server = new SpecWorkflowMCPServer();
|
|
340
|
+
await server.initialize(workflowRootPath, workspacePath, lang);
|
|
341
|
+
// Handle graceful shutdown
|
|
342
|
+
process.on('SIGINT', async () => {
|
|
343
|
+
await server.stop();
|
|
344
|
+
process.exit(0);
|
|
345
|
+
});
|
|
346
|
+
process.on('SIGTERM', async () => {
|
|
347
|
+
await server.stop();
|
|
348
|
+
process.exit(0);
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
catch (error) {
|
|
353
|
+
console.error('Error:', error.message);
|
|
354
|
+
// Provide additional context for common path-related issues
|
|
355
|
+
if (error.message.includes('ENOENT') || error.message.includes('path') || error.message.includes('directory')) {
|
|
356
|
+
console.error('\nProject path troubleshooting:');
|
|
357
|
+
console.error('- Verify the project path exists and is accessible');
|
|
358
|
+
console.error('- For Claude CLI users, ensure you used: claude mcp add spec-workflow npx -y @pimzino/spec-workflow-mcp@latest -- /path/to/your/project');
|
|
359
|
+
console.error('- Check that the path doesn\'t contain special characters that need escaping');
|
|
360
|
+
console.error(`- Current working directory: ${process.cwd()}`);
|
|
361
|
+
}
|
|
362
|
+
process.exit(1);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
export function resolveEntrypoint(pathValue) {
|
|
366
|
+
if (!pathValue)
|
|
367
|
+
return undefined;
|
|
368
|
+
try {
|
|
369
|
+
return realpathSync(pathValue);
|
|
370
|
+
}
|
|
371
|
+
catch {
|
|
372
|
+
return resolve(pathValue);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
const entrypoint = resolveEntrypoint(process.argv[1]);
|
|
376
|
+
const currentFile = resolveEntrypoint(fileURLToPath(import.meta.url));
|
|
377
|
+
if (entrypoint && currentFile && currentFile === entrypoint) {
|
|
378
|
+
main().catch(() => process.exit(1));
|
|
379
|
+
}
|
|
380
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Code Quality Reviewer
|
|
2
|
+
|
|
3
|
+
You are reviewing code changes for production readiness. Only dispatch this review AFTER spec compliance has passed.
|
|
4
|
+
|
|
5
|
+
## What Was Implemented
|
|
6
|
+
|
|
7
|
+
{DESCRIPTION}
|
|
8
|
+
|
|
9
|
+
## Git Range to Review
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
git diff --stat {BASE_SHA}..{HEAD_SHA}
|
|
13
|
+
git diff {BASE_SHA}..{HEAD_SHA}
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Review Checklist
|
|
17
|
+
|
|
18
|
+
**Code Quality:**
|
|
19
|
+
- Clean separation of concerns?
|
|
20
|
+
- Proper error handling?
|
|
21
|
+
- Type safety (if applicable)?
|
|
22
|
+
- DRY principle followed?
|
|
23
|
+
- Edge cases handled?
|
|
24
|
+
|
|
25
|
+
**Architecture:**
|
|
26
|
+
- Sound design decisions?
|
|
27
|
+
- Scalability considerations?
|
|
28
|
+
- Performance implications?
|
|
29
|
+
- Security concerns?
|
|
30
|
+
|
|
31
|
+
**Testing:**
|
|
32
|
+
- Tests actually test logic (not just mocks)?
|
|
33
|
+
- Edge cases covered?
|
|
34
|
+
- Integration tests where needed?
|
|
35
|
+
- All tests passing?
|
|
36
|
+
- Test execution results logged in implementation artifacts? (name, status, pass/fail counts)
|
|
37
|
+
- Tests linked to user stories from spec requirements?
|
|
38
|
+
|
|
39
|
+
**Requirements:**
|
|
40
|
+
- All plan requirements met?
|
|
41
|
+
- Implementation matches spec?
|
|
42
|
+
- No scope creep?
|
|
43
|
+
- Breaking changes documented?
|
|
44
|
+
|
|
45
|
+
**Production Readiness:**
|
|
46
|
+
- Backward compatibility considered?
|
|
47
|
+
- Documentation complete?
|
|
48
|
+
- No obvious bugs?
|
|
49
|
+
|
|
50
|
+
## Output Format
|
|
51
|
+
|
|
52
|
+
### Strengths
|
|
53
|
+
[What's well done? Be specific with file:line references.]
|
|
54
|
+
|
|
55
|
+
### Issues
|
|
56
|
+
|
|
57
|
+
#### Critical (Must Fix)
|
|
58
|
+
[Bugs, security issues, data loss risks, broken functionality]
|
|
59
|
+
|
|
60
|
+
#### Important (Should Fix)
|
|
61
|
+
[Architecture problems, missing features, poor error handling, test gaps]
|
|
62
|
+
|
|
63
|
+
#### Minor (Nice to Have)
|
|
64
|
+
[Code style, optimization opportunities, documentation improvements]
|
|
65
|
+
|
|
66
|
+
**For each issue:**
|
|
67
|
+
- File:line reference
|
|
68
|
+
- What's wrong
|
|
69
|
+
- Why it matters
|
|
70
|
+
- How to fix (if not obvious)
|
|
71
|
+
|
|
72
|
+
### Assessment
|
|
73
|
+
|
|
74
|
+
**Ready to proceed?** [Yes / No / With fixes]
|
|
75
|
+
|
|
76
|
+
**Reasoning:** [1-2 sentence technical assessment]
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# Design Document
|
|
2
|
+
|
|
3
|
+
## References
|
|
4
|
+
|
|
5
|
+
- **Issue:** PROJ-XXX
|
|
6
|
+
- **GitHub PR:** [#NNN](https://github.com/owner/repo/pull/NNN)
|
|
7
|
+
- **Spec Path:** `.spec-workflow/specs/{spec-name}/`
|
|
8
|
+
|
|
9
|
+
## Overview
|
|
10
|
+
|
|
11
|
+
[High-level description of the feature and its place in the overall system]
|
|
12
|
+
|
|
13
|
+
## Steering Document Alignment
|
|
14
|
+
|
|
15
|
+
### Technical Standards (tech.md)
|
|
16
|
+
[How the design follows documented technical patterns and standards]
|
|
17
|
+
|
|
18
|
+
### Project Structure (structure.md)
|
|
19
|
+
[How the implementation will follow project organization conventions]
|
|
20
|
+
|
|
21
|
+
## Code Reuse Analysis
|
|
22
|
+
[What existing code will be leveraged, extended, or integrated with this feature]
|
|
23
|
+
|
|
24
|
+
### Existing Components to Leverage
|
|
25
|
+
- **[Component/Utility Name]**: [How it will be used]
|
|
26
|
+
- **[Service/Helper Name]**: [How it will be extended]
|
|
27
|
+
|
|
28
|
+
### Integration Points
|
|
29
|
+
- **[Existing System/API]**: [How the new feature will integrate]
|
|
30
|
+
- **[Database/Storage]**: [How data will connect to existing schemas]
|
|
31
|
+
|
|
32
|
+
## Architecture
|
|
33
|
+
|
|
34
|
+
[Describe the overall architecture and design patterns used]
|
|
35
|
+
|
|
36
|
+
### Modular Design Principles
|
|
37
|
+
- **Single File Responsibility**: Each file should handle one specific concern or domain
|
|
38
|
+
- **Component Isolation**: Create small, focused components rather than large monolithic files
|
|
39
|
+
- **Service Layer Separation**: Separate data access, business logic, and presentation layers
|
|
40
|
+
- **Utility Modularity**: Break utilities into focused, single-purpose modules
|
|
41
|
+
|
|
42
|
+
```mermaid
|
|
43
|
+
graph TD
|
|
44
|
+
A[Component A] --> B[Component B]
|
|
45
|
+
B --> C[Component C]
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Components and Interfaces
|
|
49
|
+
|
|
50
|
+
### Component 1
|
|
51
|
+
- **Purpose:** [What this component does]
|
|
52
|
+
- **Interfaces:** [Public methods/APIs]
|
|
53
|
+
- **Dependencies:** [What it depends on]
|
|
54
|
+
- **Reuses:** [Existing components/utilities it builds upon]
|
|
55
|
+
|
|
56
|
+
### Component 2
|
|
57
|
+
- **Purpose:** [What this component does]
|
|
58
|
+
- **Interfaces:** [Public methods/APIs]
|
|
59
|
+
- **Dependencies:** [What it depends on]
|
|
60
|
+
- **Reuses:** [Existing components/utilities it builds upon]
|
|
61
|
+
|
|
62
|
+
## Data Models
|
|
63
|
+
|
|
64
|
+
### Model 1
|
|
65
|
+
```
|
|
66
|
+
[Define the structure of Model1 in your language]
|
|
67
|
+
- id: [unique identifier type]
|
|
68
|
+
- name: [string/text type]
|
|
69
|
+
- [Additional properties as needed]
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Model 2
|
|
73
|
+
```
|
|
74
|
+
[Define the structure of Model2 in your language]
|
|
75
|
+
- id: [unique identifier type]
|
|
76
|
+
- [Additional properties as needed]
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## UI Impact Assessment
|
|
80
|
+
|
|
81
|
+
### Has UI Changes: [Yes / No]
|
|
82
|
+
|
|
83
|
+
_If **No**, skip this section entirely. If **Yes**, complete all fields below — this gates Phase 4._
|
|
84
|
+
|
|
85
|
+
### Visual Scope
|
|
86
|
+
- **Impact Level:** [New screen / New modal or panel / Redesign existing component / Minor element additions]
|
|
87
|
+
- **Components Affected:** [List every UI component this spec creates or modifies]
|
|
88
|
+
- **Prototype Required:** [Yes — if 3+ data elements, new layout, or uncertain visual hierarchy / No — single-element additions with clear analogues]
|
|
89
|
+
|
|
90
|
+
### Prototype Artifacts
|
|
91
|
+
- **Stitch Screen IDs:** [To be filled during prototype phase — leave blank in design doc]
|
|
92
|
+
- **Playground File:** [To be filled during prototype phase — leave blank in design doc]
|
|
93
|
+
- **Reference HTML/Mockup:** [Path to any existing prototype, mockup, or reference HTML provided with the spec]
|
|
94
|
+
|
|
95
|
+
### Design Constraints
|
|
96
|
+
- **Theme Compatibility:** [Must work in: light / dark / sepia / all]
|
|
97
|
+
- **Existing Patterns to Match:** [Name specific existing components whose visual style this should follow]
|
|
98
|
+
- **Responsive Behavior:** [How this renders on mobile / tablet / desktop]
|
|
99
|
+
|
|
100
|
+
### Visual Approval Gate
|
|
101
|
+
> **BLOCKING:** If `Prototype Required` is **Yes**, no UI implementation task may begin until:
|
|
102
|
+
> 1. A Stitch mockup or equivalent visual is created and reviewed
|
|
103
|
+
> 2. A Playground prototype (or reference HTML) is interactively approved by the user
|
|
104
|
+
> 3. Both artifact paths are filled in above
|
|
105
|
+
>
|
|
106
|
+
> This gate is enforced in Phase 4 — the orchestrator MUST check this section before dispatching any task tagged with `ui:true`.
|
|
107
|
+
|
|
108
|
+
## Open Questions
|
|
109
|
+
|
|
110
|
+
> **GATE:** All blocking questions must be resolved before this document can be approved.
|
|
111
|
+
> Questions carried from Requirements should be resolved here.
|
|
112
|
+
|
|
113
|
+
### Blocking (must resolve before approval)
|
|
114
|
+
|
|
115
|
+
- [ ] [Question — why it matters]
|
|
116
|
+
|
|
117
|
+
### Resolved
|
|
118
|
+
|
|
119
|
+
- [x] ~~[Question]~~ — [Answer, source]
|
|
120
|
+
|
|
121
|
+
## Error Handling
|
|
122
|
+
|
|
123
|
+
### Error Scenarios
|
|
124
|
+
1. **Scenario 1:** [Description]
|
|
125
|
+
- **Handling:** [How to handle]
|
|
126
|
+
- **User Impact:** [What user sees]
|
|
127
|
+
|
|
128
|
+
2. **Scenario 2:** [Description]
|
|
129
|
+
- **Handling:** [How to handle]
|
|
130
|
+
- **User Impact:** [What user sees]
|
|
131
|
+
|
|
132
|
+
## Testing Strategy
|
|
133
|
+
|
|
134
|
+
### Runbook E2E Tests (Primary)
|
|
135
|
+
- Identify affected `tests/runbook/` section(s): [01-page-load, 02-crud, 03-backup-restore, 04-import-export, 05-market, 06-ui-ux, 07-activity-log, 08-spot-prices]
|
|
136
|
+
- New test blocks to write (TDD — before implementation): [describe tests]
|
|
137
|
+
- Run via `/bb-test sections=NN` against PR preview URL
|
|
138
|
+
|
|
139
|
+
### Manual Verification
|
|
140
|
+
- [Any flows that require manual testing, e.g., OAuth/Dropbox cloud sync at beta.staktrakr.com]
|
|
141
|
+
- [Flows requiring API keys from Infisical]
|